[Pidgin] #11431: Signals no longer work in Perl plugins

Pidgin trac at pidgin.im
Mon Feb 22 18:48:32 EST 2010

#11431: Signals no longer work in Perl plugins
Reporter:  dharding  |        Type:  defect 
  Status:  new       |   Component:  plugins
 Version:  2.6.6     |    Keywords:  perl   
 In Pidgin 2.6.6 on Windows XP, callbacks registered from Perl plugins get
 called with garbage arguments when they get signaled.

 I modified a plugin to log the arguments passed to a callback connected to
 the receiving-im-msg signal.  I expected to get output like the following:

 '''Purple::Account=HASH(0x203fc14), AOL System Msg, Your screen name
 (SCREEN_NAME) is now signed into AOL(R) Instant Messenger (TM) in 2
 locations. To sign off the other location(s), reply to this message with
 the number 1. Click <a
 href="http://www.aim.com/password/routing.adp">here</a> for more
 information., , 2'''

 Instead, in Pidgin 2.6.6, I get the following:

 '''Purple::Account=HASH(0x203c794), SCREEN_NAME, SCREEN_NAME,
 Purple::Conversation=HASH(0x2fcb534), 13860024'''

 Note that instead of being passed the sender and the message content, the
 callback is called with the screen name of my account twice, and the last
 parameter containing flags is garbage.

 I tracked this down to Revision [18b85ae6..]
 This changed the function purple_perl_sv_from_vargs in the Perl plugin
 code to take a va_list parameters (by value) instead of a *va_list
 parameter (by reference).  However, the purple_perl_sv_from_vargs is
 called in a loop, and it internally calls the macro va_arg to extract each
 parameter from the va_list.  The problem is, va_arg modifies the va_list,
 but when the va_list is passed by value rather than by reference, then the
 caller to purple_perl_sv_from_vargs (perl_signal_cb) never sees the change
 to the va_list made by va_arg, and every parameter after the first one
 will be garbage.

 The description for the problematic revision indicates that it was made to
 fix a compiler warning - it does not indicate what the warning was, but
 the "fix" was obviously not correct (documentation for va_arg for both
 glibc and Microsoft implementations indicate that the ''value'' of the
 va_list itself is changed).  There may still be a way to fix the compiler
 warning, but this change should be reverted to make Perl plugins work

Ticket URL: <http://developer.pidgin.im/ticket/11431>
Pidgin <http://pidgin.im>

More information about the Tracker mailing list