Linux Netfilter discussions
 help / color / mirror / Atom feed
* 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