[Berlin-wireless] OLSRD ipv4 crashes

Stefan Sperling stsp
Mo Aug 3 14:30:25 CEST 2015


On Sun, Aug 02, 2015 at 05:18:30PM +0200, André Gaul wrote:
> On 08/02/2015 05:06 PM, Stefan Sperling wrote:
> > Kann ich bestätigen (graefe70, kathleen 0.1.2). Ich habe einen cronjob
> > drin der jede minute guckt und ggf. neustartet.
> > 
> > * * * * *	pgrep -fl 'olsrd -f /var/etc/olsrd.conf' || /etc/init.d/olsrd start
> 
> thx, das habe ich jetzt auch drin.

Da ist noch ein Fehler drin gewesen. Der Cronjob selbst kann auch
von pgrep gemachted werden, und in diesem Fall started olsrd nicht neu.
Als workaround kann man sich die Tatsache zu nutzen machen dass olsrd
ein Kindprozess von PID 1 ist:

* * * * *	/usr/bin/pgrep -P 1 -f 'olsrd.conf' || /etc/init.d/olsrd start
* * * * *	/usr/bin/pgrep -P 1 -f 'olsrd6.conf' || /etc/init.d/olsrd6 start
 
> das ist aber sehr unbefriedigend.

Ja :-/

Ich habe auf der graefe70 einen core file gefunden:
http://stsp.name/olsrd.1584.11.1437235328.core
Und dazu eine neue olsrd binary mit debug symbols kompiliert.
Damit zeigt gdb an, dass ein timer event mit NULL pointern zum crash führt.
Kann damit jemand etwas anfangen?

Der Stacktrace könnte aber auch Unsinn sein. Ich würde erwarten dass der
oberste Stack Frame in walk_timers() ist, nicht in olsr_seq_inrange_high().
Und die Zeilennummer von scheduler.c ist eins zu hoch für list_remove().
Vermutlich passt also meine binary nicht zum core dump.
Hat jemand die original kathleen 0.1.2 olsrd binary mit debug symbols?

0.1.2 ist leider nicht im git getagged. Es gibt nur einen branch der
so heisst. Habe ich den falschen commit erwischt? Von welchem git commit
wurden die 0.1.2 binaries gebaut?
stsp at noel:~/freifunk/firmware$ git describe 
v0.1.1-4-gded0392

stsp at noel:~/freifunk/firmware/openwrt/build_dir/target-mips_34kc_uClibc-0.9.33.2/olsrd-0.9.0.2$ ../../toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/gdb-li
naro-7.6-2013.05/gdb/gdb olsrd ~/olsrd.1584.11.1437235328.core

(gdb) bt
#0  0x00409160 in list_remove (del_node=0xc67818) at src/common/list.c:107
#1  0x0041b9d6 in olsr_change_timer (timer=0xc67818, rel_time=<optimized out>, jitter_pct=0 '\000', periodical=<optimized out>) at src/scheduler.c:880
#2  0x0041bc22 in olsr_seq_inrange_high (beg=13006872, end=0, seq=6816) at src/tc_set.c:114

0x00409160 in list_remove (del_node=0xc67818) at src/common/list.c:107
107       list_node_init(del_node);
(gdb) p *del_node
$7 = {next = 0x0, prev = 0x0}
(gdb) up
#1  0x0041b9d6 in olsr_change_timer (timer=0xc67818, rel_time=<optimized out>, jitter_pct=0 '\000', periodical=<optimized out>) at src/scheduler.c:880
880       list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list);
(gdb) p *timer
$8 = {timer_list = {next = 0x0, prev = 0x0}, timer_clock = 1387321741, timer_period = 0, timer_cookie = 0xc27190, timer_jitter_pct = 0 '\000', 
  timer_flags = 0 '\000', timer_random = 1454529863, timer_cb = 0x418155 <olsr_expire_spf_backoff+16>, timer_cb_context = 0x0}

Code von diesen Frame:

   875	  /*
   876	   * Changes are easy: Remove timer from the exisiting timer_wheel slot
   877	   * and reinsert into the new slot.
   878	   */
   879	  list_remove(&timer->timer_list);
   880	  list_add_before(&timer_wheel[timer->timer_clock & TIMER_WHEEL_MASK], &timer->timer_list);





Mehr Informationen über die Mailingliste Berlin