nicolasff / webdis

A Redis HTTP interface with JSON output
https://webd.is
BSD 2-Clause "Simplified" License
2.83k stars 304 forks source link

subscribe with ending / following a Ctrl+C crash webdis server #19

Closed fabware closed 13 years ago

fabware commented 13 years ago

curl http://192.168.60.99:7379/SUBSCRIBE/hello/world/

then Ctrl+C terminate it, the server will crash.

* glibc detected * webdis: free(): invalid pointer: 0x0000003203552a38 ***

[root@jeb webdis]# ======= Backtrace: ========= /lib64/libc.so.6[0x320327230f] /lib64/libc.so.6(cfree+0x4b)[0x320327276b] webdis[0x401d3d] webdis[0x407884] webdis[0x40d1ff] webdis[0x405415] webdis[0x402931] /usr/local/libevent-2.0.11/lib/libevent-2.0.so.5(event_base_loop+0x509)[0x2b9bb61bfdf9] webdis[0x40283f] /lib64/libpthread.so.0[0x3203a0673d] /lib64/libc.so.6(clone+0x6d)[0x32032d3d1d] ======= Memory map: ======== 00400000-0041c000 r-xp 00000000 fd:00 7406970 /usr/local/webdis-0.1.0/bin/webdis 0061b000-0061c000 rw-p 0001b000 fd:00 7406970 /usr/local/webdis-0.1.0/bin/webdis 02a12000-02a33000 rw-p 02a12000 00:00 0 [heap] 41d8f000-41d90000 ---p 41d8f000 00:00 0 41d90000-42790000 rw-p 41d90000 00:00 0 42790000-42791000 ---p 42790000 00:00 0 42791000-43191000 rw-p 42791000 00:00 0 43191000-43192000 ---p 43191000 00:00 0 43192000-43b92000 rw-p 43192000 00:00 0 43b92000-43b93000 ---p 43b92000 00:00 0 43b93000-44593000 rw-p 43b93000 00:00 0 3202e00000-3202e1c000 r-xp 00000000 fd:00 13271358 /lib64/ld-2.5.so 320301b000-320301c000 r--p 0001b000 fd:00 13271358 /lib64/ld-2.5.so 320301c000-320301d000 rw-p 0001c000 fd:00 13271358 /lib64/ld-2.5.so 3203200000-320334e000 r-xp 00000000 fd:00 13271359 /lib64/libc-2.5.so 320334e000-320354d000 ---p 0014e000 fd:00 13271359 /lib64/libc-2.5.so 320354d000-3203551000 r--p 0014d000 fd:00 13271359 /lib64/libc-2.5.so 3203551000-3203552000 rw-p 00151000 fd:00 13271359 /lib64/libc-2.5.so 3203552000-3203557000 rw-p 3203552000 00:00 0 3203a00000-3203a16000 r-xp 00000000 fd:00 13271364 /lib64/libpthread-2.5.so 3203a16000-3203c15000 ---p 00016000 fd:00 13271364 /lib64/libpthread-2.5.so 3203c15000-3203c16000 r--p 00015000 fd:00 13271364 /lib64/libpthread-2.5.so 3203c16000-3203c17000 rw-p 00016000 fd:00 13271364 /lib64/libpthread-2.5.so 3203c17000-3203c1b000 rw-p 3203c17000 00:00 0 3204200000-3204207000 r-xp 00000000 fd:00 13271366 /lib64/librt-2.5.so 3204207000-3204407000 ---p 00007000 fd:00 13271366 /lib64/librt-2.5.so 3204407000-3204408000 r--p 00007000 fd:00 13271366 /lib64/librt-2.5.so 3204408000-3204409000 rw-p 00008000 fd:00 13271366 /lib64/librt-2.5.so 3206200000-320620d000 r-xp 00000000 fd:00 13271093 /lib64/libgcc_s-4.1.2-20080825.so.1 320620d000-320640d000 ---p 0000d000 fd:00 13271093 /lib64/libgcc_s-4.1.2-20080825.so.1 320640d000-320640e000 rw-p 0000d000 fd:00 13271093 /lib64/libgcc_s-4.1.2-20080825.so.1 2aaaac000000-2aaaac021000 rw-p 2aaaac000000 00:00 0 2aaaac021000-2aaab0000000 ---p 2aaaac021000 00:00 0 2b9bb6199000-2b9bb619a000 rw-p 2b9bb6199000 00:00 0 2b9bb61ae000-2b9bb61af000 rw-p 2b9bb61ae000 00:00 0 2b9bb61af000-2b9bb61ef000 r-xp 00000000 fd:00 7342702 /usr/local/libevent-2.0.11/lib/libevent-2.0.so.5.1.0 2b9bb61ef000-2b9bb63ee000 ---p 00040000 fd:00 7342702 /usr/local/libevent-2.0.11/lib/libevent-2.0.so.5.1.0 2b9bb63ee000-2b9bb63f0000 rw-p 0003f000 fd:00 7342702 /usr/local/libevent-2.0.11/lib/libevent-2.0.so.5.1.0 2b9bb63f0000-2b9bb63f2000 rw-p 2b9bb63f0000 00:00 0 7fff58562000-7fff58577000 rw-p 7ffffffea000 00:00 0 [stack] ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0 [vdso]

nicolasff commented 13 years ago

Thanks, I can reproduce this issue.

A fix is on the way.

fabware commented 13 years ago

Sometimes, without ending / will cause similar crash, I don't have the crash report, need more test on this.

nicolasff commented 13 years ago

When closing a subscribe client, hiredis frees all the open channels. This led to a double-free when more than one channel was used.

I have pushed a fix for this issue.