[ICQ/AIM] Possibly fix for broken privacy lists in some accounts (tickets #9034, #12549)

dustin dzlists at arcor.de
Mon Nov 22 18:18:21 EST 2010


Mark Doliner wrote:
> On Mon, Nov 22, 2010 at 9:31 AM, dustin <dzlists at arcor.de> wrote:
>> On 22.11.2010 10:34, Mark Doliner wrote:
>>> On Mon, Oct 18, 2010 at 2:51 PM,  <dzlists at arcor.de> wrote:
>>>> *snip*
>>>> I couldn't find any remnants of the broken bid in the itemlist nor in the tlvlist loaded by
>>>> parsedata() (family_feedbag.c).
>>>>
>>>> Anyway, just deleting the broken entry from the server worked. *snip*
>>>> In this way, it was possible to repair the broken ICQ accounts *snip*
>>> I don't think I followed this... Are you saying that certain items in
>>> the buddy list are "broken"?  What indicates that an item is broken?
>> "Broken" in the sense that there seems to be an item stored on the
>> server which does not appear in the client's ssi itemlist (or the
>> corresponding tlvlist 0x00c8).
>>
>> This causes a "Cannot add buddy..." error when libpurple tries to use
>> the same (gid, bid) combination when adding a blocking/visible/invisible
>> entry. (likely the same bug as described in tickets #9034, #12549, #12933)
>>
>> I'm assuming there's actually a broken entry on the server because:
>>
>> 1. It's only a single (gid, bid) combination that doesn't work, the bids
>> before and after work fine.
>>
>> 2. After sending a delete (SNAC_SUBTYPE_FEEDBAG_DEL) for this (gid, bid)
>> the error will disappear. (However i've no idea if there's any relevant
>> data that gets deleted by this.)
> 
> Ahhh, I see now.  So you're saying that this broken entry doesn't
> appear in OscarData->ssi.official or OscarData->ssi.local?  I wonder
> if that's a server bug (they fail to send us an entry for that
> gid+bid), or a client bug (we receive the entry for that gid+bid, but
> we discard it for some reason).
>

I guess it's the server, because the entry does not appear even when
reading directly from the tlvlist. (using the patch I posted on 13.11.)
AFAICS there's no filtering before that.

Example:
(23:25:24) oscar: Reading items from tlvlist for account xxxxxxxxx:
gid=0x0000  bid=0x0000  list_type=0x0001  name=(null)      [Group]
gid=0x0000  bid=0x0001  list_type=0x0004  name=(null)      [PDInfo]
gid=0x0000  bid=0x0002  list_type=0x0005  name=(null)      [PresencePrefs]
gid=0x0000  bid=0x0003  list_type=0x0020  name=ICQ-MDIR    [ICQ-MDir]
gid=0x0000  bid=0x0004  list_type=0x0014  name=1           [Buddy Icon]
gid=0x0000  bid=0x0005  list_type=0x001d  name=(null)      [Vanity Info]
gid=0x0000  bid=0x0007  list_type=0x0019  name=yyyyyyyyy   [Non-Buddy]
gid=0x0000  bid=0x0009  list_type=0x0029  name=facebook    [Facebook]
..
(23:26:53) oscar: ssi: About to add a deny
(23:26:53) oscar: Adding item gid=0x0000  bid=0x0006  list_type=0x000e
name=yyyyyyyyy   [ICQDeny/Ignore]  (data: 0 bytes).
(23:26:54) oscar: ssi: status is 0x0003 for a 0x0008 action with name no item
(23:26:54) oscar: ssi: Action 0x0008 was unsuccessful with error 0x0003

>> [..]
>> This seems to be a rare bug, and having an automatic correction for this
>> may have harmful side effects (possibly deleting legitimate entries in a
>> different situation...).
>>
>> So I thought keeping a manual fix for this, and preferably far away
>> from libpurple's normal functioning, would be better.
> 
> Hrm.  Good point.  I guess we should determine if this is a client bug
> (make sure we're not discarding the entry for some reason).  If it's
> not a client bug, then I'd argue that we SHOULD include code to
> automatically correct the problem.  I think it happens frequently
> enough, and the downside of possibly deleting a single item is minor
> enough to justify it.

Maybe this could be done in purple_ssi_parseack() [oscar.c] as part of
error handling?
e.g.
in aim_ssi_sync(): save the last addition to the item list in some place if
gid == 0.
in purple_ssi_parseack(): if error is 0x0003 and item does not exist in the
itemlist => delete (or give a special dialog window?)

> Although I wonder, do official ICQ clients have this same problem?
> How do they work around it?

Ignoring the problem. ;-)
It seems like only libpurple uses bids in ascending order, others have some
kind of randomization...

(01:40:27) dump: gid=0x0000 bid=0x2180 list_type=0x0003	name='xxxxxxxxx'
(01:40:27) dump: gid=0x0000 bid=0x21e2 list_type=0x0003	name='yyyyyyyyy'
(01:40:27) dump: gid=0x0000 bid=0x7d8c list_type=0x0003	name='zzzzzzzzz'

(These are invisible entries from Miranda, but ICQ7 and qip look similar.)


Regards,

Dustin




More information about the Devel mailing list