configurable failover & segmentation fault when reloaded

Milan Holub holub at thenet.ch
Thu Apr 19 10:22:24 CEST 2007


Hi all,

here is another bug report(but don't worry; I'm running out of my
bugreports):

I used to have following attr_rewrite in modules section:

        attr_rewrite fix_sqlcounter_reply {
                attribute = Reply-Message
                searchin = reply
                searchfor = "Your maximum never usage time has been reached"
                replacewith = "LoginNoCredit"
                ignore_case = no
                new_attribute = no
                max_matches = 1
                append = no
        }

and following "configurable failover" section under authorize:

       group {
                noresetcounter {
                        reject = 1
                        ok = return
                        noop = return
                }
                fix_sqlcounter_reply {
                        ok = reject
                }
        }

        group {
                noresetcounterflat {
                        reject = 1
                        ok = return
                        noop = return
                }
                fix_sqlcounter_reply {
                        ok = reject
                }
        }

...using cvs head

I'm not using this config anymore since it was a silly workaround for
an issue which was fixed differently. BUT it's the valid config and I want to point out that 
there is a bug when re-reading configuration containing "failover sections" after HUP.
This bug causes segmentation fault:


Program received signal SIGSEGV, Segmentation fault.
0x4029bc1b in free () from /lib/libc.so.6
(gdb) bt
#0  0x4029bc1b in free () from /lib/libc.so.6
#1  0x4029baa3 in free () from /lib/libc.so.6
#2  0x0804ee49 in cf_data_free (cd=0xbfffe470) at conffile.c:187
#3  0x0804f194 in cf_section_free (cs=0xbfffe4a4) at conffile.c:343
#4  0x0804f1b3 in cf_section_free (cs=0xbfffe4d4) at conffile.c:337
#5  0x0804f1b3 in cf_section_free (cs=0x8079e50) at conffile.c:337
#6  0x0805570c in read_mainconfig (reload=1) at mainconfig.c:836
#7  0x08058d2a in main (argc=2, argv=0xbffffb94) at radiusd.c:540
(gdb) up
#1  0x4029baa3 in free () from /lib/libc.so.6
(gdb) up
#2  0x0804ee49 in cf_data_free (cd=0xbfffe470) at conffile.c:187
187             free((*cd)->name);
(gdb) list
182
183     static void cf_data_free(CONF_DATA **cd)
184     {
185             if (!cd || !*cd) return;
186
187             free((*cd)->name);
188             if (!(*cd)->free) {
189                     free((*cd)->data);
190             } else {
191                     ((*cd)->free)((*cd)->data);
(gdb) print (*cd)->name
$1 = 0x81fda70 "instance`"
(gdb) print (*cd)->item
$2 = {next = 0x0, parent = 0x807d800, lineno = 0, type = CONF_ITEM_DATA}
(gdb) print (*cd)->item->parent
$3 = (struct conf_part *) 0x807d800
(gdb) print (*cd)->item->parent->name1
$4 = 0x807d840 "attr_rewrite"
(gdb) print (*cd)->item->parent->name2
$5 = 0x807d858 "fix_sqlcounter_reply"
(gdb)

==> I wonder especially where the $1 = 0x81fda70 "instance`" comes
from...

This should be probably fixed before 2.0 released...


Milan Holub
holub (at) thenet (dot) ch

--------------------------------------
 TheNet-Internet Services AG,
 im Bernertechnopark, Morgenstr. 129
 CH-3018, Bern, Switzerland
 031 998 4333, Fax 031 998 4330
 http://www.thenet.ch
 http://wlan.thenet.ch
--------------------------------------



More information about the Freeradius-Users mailing list