* ulogd2 segfault
@ 2010-12-31 16:23 Salih Gönüllü
2011-01-03 18:12 ` Salih Gönüllü
0 siblings, 1 reply; 7+ messages in thread
From: Salih Gönüllü @ 2010-12-31 16:23 UTC (permalink / raw)
To: netfilter
Hi,
ulogd2 is segfaulting upon receipt of sigint or sigterm
Program received signal SIGTERM, Terminated.
0xb78c4430 in __kernel_vsyscall ()
(gdb) cont
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0xb78b71ba in main_arena () from /lib/libc.so.6
(gdb) bt
#0 0xb78b71ba in main_arena () from /lib/libc.so.6
#1 0x0804a35d in ulogd_propagate_results ()
#2 0xb777256c in interp_packet (upi=0x80630f0, pf_family=2 '\002',
ldata=0xbff01390)
at ulogd_inppkt_NFLOG.c:400
#3 0xb7772149 in msg_cb (gh=0x8062f58, nfmsg=0xbff01470,
nfa=0xbff01390, data=0x805f270)
at ulogd_inppkt_NFLOG.c:472
#4 0xb78bf7d5 in __nflog_rcv_pkt () from /usr/lib/libnetfilter_log.so.1
#5 0xb7767b00 in nfnl_step () from /usr/lib/libnfnetlink.so.0
#6 0xbff013b0 in ?? ()
#7 0x08062f28 in ?? ()
#8 0x00000001 in ?? ()
#9 0xbff01474 in ?? ()
#10 0x00000000 in ?? ()
I have tried with beta4 and with git
4f652cc32aebeac20f46009f146ad973a1ed0e99
Is there a way to avoid this ?
#ulogd.conf
stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu0:LOGEMU
[log2]
group=42
emu0]
file="/var/log/ulogd_sysemu.log"
Regards,
-salih
--
salih goenuellue
security engineer
open systems ag
raeffelstrasse 29
ch-8045 zurich
t +41 44 455 74 00
f +41 44 455 74 01
sag@open.ch
http://www.open.ch
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ulogd2 segfault
2010-12-31 16:23 ulogd2 segfault Salih Gönüllü
@ 2011-01-03 18:12 ` Salih Gönüllü
2011-01-06 13:53 ` Pablo Neira Ayuso
0 siblings, 1 reply; 7+ messages in thread
From: Salih Gönüllü @ 2011-01-03 18:12 UTC (permalink / raw)
To: netfilter
Hi,
my last ulogd.conf was not complete. And I think I found out the cause:
stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu0:LOGEMU
stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,syslog1:SYSLOG
having other stacks is not a problem as long as the log2:NFLOG is not
present, could it be that stop_pluginstances() in this case is doing a
double free() ?
Thanks,
-salih
On 12/31/2010 05:23 PM, Salih Gönüllü wrote:
>
> Hi,
>
> ulogd2 is segfaulting upon receipt of sigint or sigterm
>
>
> Program received signal SIGTERM, Terminated.
> 0xb78c4430 in __kernel_vsyscall ()
> (gdb) cont
> Continuing.
>
> Program received signal SIGSEGV, Segmentation fault.
> 0xb78b71ba in main_arena () from /lib/libc.so.6
> (gdb) bt
> #0 0xb78b71ba in main_arena () from /lib/libc.so.6
> #1 0x0804a35d in ulogd_propagate_results ()
> #2 0xb777256c in interp_packet (upi=0x80630f0, pf_family=2 '\002',
> ldata=0xbff01390)
> at ulogd_inppkt_NFLOG.c:400
> #3 0xb7772149 in msg_cb (gh=0x8062f58, nfmsg=0xbff01470, nfa=0xbff01390,
> data=0x805f270)
> at ulogd_inppkt_NFLOG.c:472
> #4 0xb78bf7d5 in __nflog_rcv_pkt () from /usr/lib/libnetfilter_log.so.1
> #5 0xb7767b00 in nfnl_step () from /usr/lib/libnfnetlink.so.0
> #6 0xbff013b0 in ?? ()
> #7 0x08062f28 in ?? ()
> #8 0x00000001 in ?? ()
> #9 0xbff01474 in ?? ()
> #10 0x00000000 in ?? ()
>
> I have tried with beta4 and with git
> 4f652cc32aebeac20f46009f146ad973a1ed0e99
>
>
> Is there a way to avoid this ?
>
> #ulogd.conf
>
> stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu0:LOGEMU
>
>
>
> [log2]
> group=42
>
> emu0]
> file="/var/log/ulogd_sysemu.log"
>
>
> Regards,
>
> -salih
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ulogd2 segfault
2011-01-03 18:12 ` Salih Gönüllü
@ 2011-01-06 13:53 ` Pablo Neira Ayuso
2011-01-07 10:24 ` Salih Gönüllü
0 siblings, 1 reply; 7+ messages in thread
From: Pablo Neira Ayuso @ 2011-01-06 13:53 UTC (permalink / raw)
To: Salih Gönüllü; +Cc: netfilter
On 03/01/11 19:12, Salih Gönüllü wrote:
> Hi,
>
> my last ulogd.conf was not complete. And I think I found out the cause:
>
> stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu0:LOGEMU
>
> stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,syslog1:SYSLOG
>
> having other stacks is not a problem as long as the log2:NFLOG is not
> present, could it be that stop_pluginstances() in this case is doing a
> double free() ?
Let me check this, if the problem is what you're pointing (which makes
sense at first look at the code) I guess that we need some refcounting
for plugins to avoid double freeing.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ulogd2 segfault
2011-01-06 13:53 ` Pablo Neira Ayuso
@ 2011-01-07 10:24 ` Salih Gönüllü
2011-01-07 13:37 ` Pablo Neira Ayuso
0 siblings, 1 reply; 7+ messages in thread
From: Salih Gönüllü @ 2011-01-07 10:24 UTC (permalink / raw)
To: Pablo Neira Ayuso; +Cc: netfilter
On 01/06/2011 02:53 PM, Pablo Neira Ayuso wrote:
> Let me check this, if the problem is what you're pointing (which makes
> sense at first look at the code) I guess that we need some refcounting
> for plugins to avoid double freeing.
When I comment out nflog_unbind_group(ui->nful_gh) in stop() inside
input/packet/ulogd_inppkt_NFLOG.c, ulogd does not segfault anymore.
Here I have question:
Does *pi in
static int stop(struct ulogd_pluginstance *pi)
represent the NFLOG plugin or the individual log2:NFLOG ? I am asking
because it get started only once with pluginstance_started(), and
therefore should be stopped once (?)
Cheers,
-salih
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ulogd2 segfault
2011-01-07 10:24 ` Salih Gönüllü
@ 2011-01-07 13:37 ` Pablo Neira Ayuso
2011-01-07 16:40 ` Salih Gönüllü
0 siblings, 1 reply; 7+ messages in thread
From: Pablo Neira Ayuso @ 2011-01-07 13:37 UTC (permalink / raw)
To: Salih Gönüllü; +Cc: netfilter
[-- Attachment #1: Type: text/plain, Size: 800 bytes --]
On 07/01/11 11:24, Salih Gönüllü wrote:
> On 01/06/2011 02:53 PM, Pablo Neira Ayuso wrote:
>
>> Let me check this, if the problem is what you're pointing (which makes
>> sense at first look at the code) I guess that we need some refcounting
>> for plugins to avoid double freeing.
>
>
> When I comment out nflog_unbind_group(ui->nful_gh) in stop() inside
> input/packet/ulogd_inppkt_NFLOG.c, ulogd does not segfault anymore.
>
> Here I have question:
>
> Does *pi in
> static int stop(struct ulogd_pluginstance *pi)
>
> represent the NFLOG plugin or the individual log2:NFLOG ? I am asking
> because it get started only once with pluginstance_started(), and
> therefore should be stopped once (?)
Indeed, accurate analysis. Would you give a try to the following patch?
[-- Attachment #2: refcount.patch --]
[-- Type: text/x-patch, Size: 2111 bytes --]
ulogd: fix double call of stop for reused input plugins
From: Pablo Neira Ayuso <pablo@netfilter.org>
This patch adds reference counting for plugins. This is used to fix
a double stop for input plugins that are reused.
This problem was reported by Salih Gonullu <sag@open.ch>:
http://marc.info/?l=netfilter&m=129439584700693&w=2
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
include/ulogd/ulogd.h | 2 ++
src/ulogd.c | 14 ++++++++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/include/ulogd/ulogd.h b/include/ulogd/ulogd.h
index 2d1b348..e48caf8 100644
--- a/include/ulogd/ulogd.h
+++ b/include/ulogd/ulogd.h
@@ -208,6 +208,8 @@ struct ulogd_plugin {
char name[ULOGD_MAX_KEYLEN+1];
/* ID for this plugin (dynamically assigned) */
unsigned int id;
+ /* how many stacks are using this plugin? initially set to zero. */
+ unsigned int usage;
struct ulogd_keyset input;
struct ulogd_keyset output;
diff --git a/src/ulogd.c b/src/ulogd.c
index f378c6f..a4b0ed1 100644
--- a/src/ulogd.c
+++ b/src/ulogd.c
@@ -762,6 +762,15 @@ static int pluginstance_started(struct ulogd_pluginstance *npi)
return 0;
}
+static int pluginstance_stop(struct ulogd_pluginstance *npi)
+{
+ if (--npi->plugin->usage > 0 &&
+ npi->plugin->input.type == ULOGD_DTYPE_SOURCE) {
+ return 0;
+ }
+ return 1;
+}
+
static int create_stack_start_instances(struct ulogd_pluginstance_stack *stack)
{
int ret;
@@ -839,6 +848,7 @@ static int create_stack(const char *option)
ret = -ENODEV;
goto out;
}
+ pl->usage++;
/* allocate */
pi = pluginstance_alloc_init(pl, pi_id, stack);
@@ -989,8 +999,8 @@ static void stop_pluginstances()
llist_for_each_entry(stack, &ulogd_pi_stacks, stack_list) {
llist_for_each_entry_safe(pi, npi, &stack->list, list) {
- if (((pi->plugin->priv_size == 0) || pi->private[0])
- && *pi->plugin->stop) {
+ if ((pi->plugin->priv_size > 0 || *pi->plugin->stop) &&
+ pluginstance_stop(pi)) {
ulogd_log(ULOGD_DEBUG, "calling stop for %s\n",
pi->plugin->name);
(*pi->plugin->stop)(pi);
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: ulogd2 segfault
2011-01-07 13:37 ` Pablo Neira Ayuso
@ 2011-01-07 16:40 ` Salih Gönüllü
2011-01-08 14:36 ` Pablo Neira Ayuso
0 siblings, 1 reply; 7+ messages in thread
From: Salih Gönüllü @ 2011-01-07 16:40 UTC (permalink / raw)
To: Pablo Neira Ayuso; +Cc: netfilter
Hi Pablo
On 01/07/2011 02:37 PM, Pablo Neira Ayuso wrote:
> Indeed, accurate analysis. Would you give a try to the following patch?
It works fine, thanks!
Cheers,
-salih
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: ulogd2 segfault
2011-01-07 16:40 ` Salih Gönüllü
@ 2011-01-08 14:36 ` Pablo Neira Ayuso
0 siblings, 0 replies; 7+ messages in thread
From: Pablo Neira Ayuso @ 2011-01-08 14:36 UTC (permalink / raw)
To: Salih Gönüllü; +Cc: netfilter
On 07/01/11 17:40, Salih Gönüllü wrote:
> Hi Pablo
>
> On 01/07/2011 02:37 PM, Pablo Neira Ayuso wrote:
>
>> Indeed, accurate analysis. Would you give a try to the following patch?
>
> It works fine, thanks!
I have applied the patch, thanks for the accurate report and for testing
it Salih.
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-01-08 14:36 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-31 16:23 ulogd2 segfault Salih Gönüllü
2011-01-03 18:12 ` Salih Gönüllü
2011-01-06 13:53 ` Pablo Neira Ayuso
2011-01-07 10:24 ` Salih Gönüllü
2011-01-07 13:37 ` Pablo Neira Ayuso
2011-01-07 16:40 ` Salih Gönüllü
2011-01-08 14:36 ` Pablo Neira Ayuso
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox