[syslog-ng] Seg fault with include file contains an error
Balazs Scheidler
bazsi at balabit.hu
Tue Nov 3 20:46:31 CET 2009
Hi,
The patch looks good and I could successfully reproduce the problem
without the patch and it seems to be gone with the patch.
Thanks for tracking this down, and sorry that it took such a long time
to review and integrate your patch.
Here's the official git patch entry, now visible on git.balabit.hu
commit 45566d957609026abe41a3292003909b23615124
Author: Anthony Lineham <anthony.lineham at alliedtelesis.co.nz>
Date: Tue Nov 3 20:44:59 2009 +0100
cfg-lex: fixed a possible segmentation fault in HUP processing if
included files have syntax errors
This patch fixes several use-after-free problems if a file with a
syntax error is included and syslog-ng is reloaded multiple times.
Thanks for Anthony Lineham for tracking this down.
On Mon, 2009-09-14 at 16:50 +1200, anthony lineham wrote:
> Hi Bazsi,
>
> I've been investigating a seg fault that occurs when using an include statement in the config file. The error
> occurs when one of the included files contains an syntax error. The first time syslog-ng is restarted with the bad
> config, the error is detected and restart is aborted. However, if a second HUP is sent a seg fault occurs.
>
> I had a bit of trouble tracking down the cause and I'm still not entirely sure of the mechanism that leads to the
> crash but I found a couple of apparent problems, which when corrected prevent it.
>
> 1. There is a global variable "include_depth" which normally gets decremented back to zero after successful
> parsing of included config files. However, if an error is detected it stays at its current value and subsequent
> restarts increment from that point. This doesn't cause the crash, but given enough restarts would lead to
> overrun or exhaustion of the "include_stack" array.
>
> 2. In the case of unsuccessful config parsing certain bits of memory are dealloced but their pointers that not
> reset. This seems to be what was causing the seg fault but I've found it a bit hard to pin down.
>
> 3. There was an off-by-1 error in the included config deinit loop.
>
> The following patch fixes the problem, but may not necessarily be the best way to do it - particularly issue 1.
>
> Regards,
> Anthony
>
> --- syslog-ng_3.0.1-63-g41f77f5-old/src/cfg-lex.l 2009-09-14 16:02:09.000000000 +1200
> +++ syslog-ng_3.0.1-63-g41f77f5/src/cfg-lex.l 2009-09-14 16:15:30.000000000 +1200
> @@ -626,17 +626,24 @@
> {
> gint i;
>
> - for (i = 0; i < include_depth; i++)
> + for (i = 0; i <= include_depth; i++)
> {
> CfgIncludeLevel *level = &include_stack[i];
>
> if (level->current_file)
> - g_free(level->current_file);
> + {
> + g_free(level->current_file);
> + level->current_file = NULL;
> + }
>
> g_slist_foreach(level->files, (GFunc) g_free, NULL);
> g_slist_free(level->files);
> level->files = NULL;
> if (level->yybuf)
> - yy_delete_buffer(level->yybuf);
> + {
> + yy_delete_buffer(level->yybuf);
> + level->yybuf = NULL;
> + }
> }
> + include_depth = 0;
> }
>
>
> ______________________________________________________________________________
> Member info: https://lists.balabit.hu/mailman/listinfo/syslog-ng
> Documentation: http://www.balabit.com/support/documentation/?product=syslog-ng
> FAQ: http://www.campin.net/syslog-ng/faq.html
>
>
--
Bazsi
More information about the syslog-ng
mailing list