[IRCServices Coding] [IRCServices] akick not setting channel ban

Andrew Church achurch at achurch.org
Thu Nov 27 20:08:40 PST 2008


I won't have a chance to look at this for a bit due to work obligations,
but thanks in advance. (:  At first glance, yes, this looks like the Right
Thing To Do.

  --Andrew Church
    achurch at achurch.org
    http://achurch.org/

>Hi,
>
>First of all, pardon my serious case of thread necro.  I decided to rather
>resurrect this so that some history is at hand. :)
>
>| By Andrew Church <achurch at achurch.org>
>|                                          [ 2005-09-12 05:02 +0200 ]
>> >I suspect that some of the irc servers in the network drop a ban
>> >silently, resulting in services having this ban on their list, which
>> >is desynched from the rest of the network in this case. I've seen
>> >similar situations with old hybrid servers and other services, but who
>> >knows..
>> 
>>      That's an interesting possibility.  To the original poster: try
>> applying the following patch to Services, then recompiling and restarting
>> in debug mode (ircservices -debug).  When you see the bug happening, check
>> the logfile and see if the ban in question is listed.  (Also, if you could
>> privately send me the full debug logfile for further analysis I'd
>> appreciate it.)
>
>I applied your patch (2 years ago), thank you.  However, it didn't help
>locate the problem and I never really got the time to focus enough energy on
>it again until recently.  Been living with this bug since then.
>
>So it's been a while.  I extended your patch a bit by adding logging points
>into do_cmode() to see when bans get set too.  The interesting bits:
>
>case 'b':
>if (add) {
>    ARRAY_EXTEND(chan->bans);
>    chan->bans[chan->bans_count-1] = sstrdup(av[0]);
>    log("addban([%s],[%s],[%d])", chan->name,
>        chan->bans[chan->bans_count-1], chan->bans_count-1);
>} else {
>    int i = find_ban(chan, av[0]);
>    if (i >= 0) {
>        log("find_ban() true, free([%s])", chan->bans[i]);
>        free(chan->bans[i]);
>        ARRAY_REMOVE(chan->bans, i);
>    } else {
>
>
>And when the last server relinked a few times:
>
>[Nov 23 16:57:33 2008] find_ban([#5fm],[shand0ra*!*@*])
>[Nov 23 16:57:33 2008] ... NOT found
>[Nov 23 16:57:33 2008] addban([#5fm],[shand0ra*!*@*],[0])
>[Nov 23 21:09:56 2008] addban([#5fm],[shand0ra*!*@*],[1])
>[Nov 23 21:25:20 2008] addban([#5fm],[shand0ra*!*@*],[2])
>
>And the next find_ban after that:
>
>[Nov 24 10:55:01 2008] find_ban([#5fm],[killer!*@*])
>[Nov 24 10:55:01 2008] ... checking [shand0ra*!*@*]
>[Nov 24 10:55:01 2008] ... checking [shand0ra*!*@*]
>[Nov 24 10:55:01 2008] ... checking [shand0ra*!*@*]
>[Nov 24 10:55:01 2008] ... checking [killer!*@*]
>[Nov 24 10:55:01 2008] ... found[1]!
>[Nov 24 10:55:01 2008] find_ban() true, free([killer!*@*])
>
>
>So I've changed do_cmode:
>
>case 'b':
>if (add) {
>    int i = find_ban(chan, av[0]);
>    if (i == -1) {
>            ARRAY_EXTEND(chan->bans);
>            chan->bans[chan->bans_count-1] = sstrdup(av[0]);
>    }
>
>
>Which I've tested with some oper assisted relinking and things look much
>better now.  I believe 5.1's do_cmode will cause the same problems (it looks
>the same as 5.0's).
>
>Better late than never they say. :)
>
>
>Regards,
>Aragon
>
>
>> 
>> Index: channels.c
>> ===================================================================
>> RCS file: /var/local/cvsroot/ircservices/channels.c,v
>> retrieving revision 2.43.2.1
>> diff -u -r2.43.2.1 channels.c
>> --- channels.c	6 Jan 2005 17:15:11 -0000	2.43.2.1
>> +++ channels.c	12 Sep 2005 03:01:04 -0000
>> @@ -192,22 +192,33 @@
>>  
>>      t = strchr(ban, '!');
>>      i = 0;
>> +    if (debug)
>> +	log("find_ban([%s],[%s])", chan->name, ban);
>>      ARRAY_FOREACH (i, chan->bans) {
>> +	if (debug)
>> +	    log("... checking [%s]", chan->bans[i]);
>>  	s = strchr(chan->bans[i], '!');
>>  	if (s && t) {
>>  	    if (s-(chan->bans[i]) == t-ban
>>  	     && irc_strnicmp(chan->bans[i], ban, s-(chan->bans[i])) == 0
>>  	     && stricmp(s+1, t+1) == 0
>>  	    ) {
>> +		if (debug)
>> +		    log("... found!");
>>  		return i;
>>  	    }
>>  	} else if (!s && !t) {
>>  	    /* Bans without '!' should be impossible; just
>>  	     * do a case-insensitive compare */
>> -	    if (stricmp(chan->bans[i], ban) == 0)
>> +	    if (stricmp(chan->bans[i], ban) == 0) {
>> +		if (debug)
>> +		    log("... found!");
>>  		return i;
>> +	    }
>>  	}
>>      }
>> +    if (debug)
>> +	log("... NOT found");
>>      return -1;
>>  }
>
>------------------------------------------------------------------
>To unsubscribe or change your subscription options, visit:
>http://lists.ircservices.za.net/mailman/listinfo/ircservices-coding