[Adium-devl] g_string_free() and me (aka gaim [17165] doesn't like Adium)
Evan Schoenberg
evan.s at dreskin.net
Mon Sep 11 20:54:49 UTC 2006
Sigh, I'll commit this whenever trac and svn decide to work again. I
can't keep checking, so if someone would email me or text message me
when they're up, I'd appreciate it.
On Sep 11, 2006, at 4:49 PM, Evan Schoenberg wrote:
> Okay, found the problem and fixed it. What a headache.
>
> The problem was purely in Adium's adiumGaimEventloop code... but
> nothing before [17165] had ever triggered the exact situation,
> which was:
> 1) Non-blocking write condition triggers its socket callback
> 2) That socket callback triggers a prpl callback which adds a read
> condition on the same fd
> 3) That socket callback does a gaim_source_remove() on the write
> callback's tag
> 4) That socket callback then free()'s the data associated with the
> write callback (but not the read callback, obviously)
>
>
> (2) means that the socket was converted from write-only to read/
> write (because the write condition hadn't yet been removed.
> (3) then removed the write part of the read/write... which in code
> that had previously never been touched (and was written when I was
> fixing our handling of nonblocking sockets in the first place),
> called CFSocketDisableCallBacks(socket, kCFSocketWriteCallBack) so
> that the socket would remain around but only trigger for the next
> read condition.
>
> Unfortunately, CFSocketDisableCallBacks() appears to be a no-op....
> the socket callback was indeed called again, with a write callback
> signature, as soon as data was available to be written. This
> triggered a return to (1) above... which besides wrecking havoc on
> the connect process (you could see this in Jabber's "Connected."
> message appearing twice in rapid succession) led to a double-free()
> at (4).
>
> Disabling the auto-reenabling of callbacks with CFSocketSetFlags()
> before calling CFSocketDisableCallBacks() doesn't make a difference.
>
> Solution: Invalidate, release, and create from scratch the socket
> when converting from read/write to read-only or write-only. This
> mirrors how we convert a read-only or write-only socket to read/
> write in the first place.
>
> -Evan
> _______________________________________________
> Adium-devl mailing list
> Adium-devl at adiumx.com
> http://adiumx.com/mailman/listinfo/adium-devl_adiumx.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 186 bytes
Desc: This is a digitally signed message part
URL: <http://adium.im/pipermail/devel_adium.im/attachments/20060911/1edbb1bb/attachment.sig>
More information about the devel
mailing list