Segfault in mmap_fgets_multiline
Florian Hars
hars at bik-gmbh.de
Thu Oct 2 17:45:59 CEST 2008
I tried running Nagios 3.0.3 on a recent OpenBSD snapshot and (apart from
the gd problems due to a lack of libttf) hit on the problem that nagios
segfaults in mmap_fgets_multiline. Not on every run, but if it segfaults,
it always segfaults at the same place in the code.
It looks related to http://archive.netbsd.se/?ml=nagios-users&a=2008-05&t=7383489
-------------- snip --------------------
Program received signal SIGSEGV, Segmentation fault.
[Switching to process 11262, thread 0x81cf3000]
0x1c03c42d in mmap_fgets_multiline (temp_mmapfile=0x8318aca0) at utils.c:3486
3486 else if(buf[end]=='\\')
(gdb) l
3481 buf[end+1]='\x0';
3482 break;
3483 }
3484
3485 /* one backslash found, so we should continue reading the next line */
3486 else if(buf[end]=='\\')
3487 buf[end]='\x0';
3488
3489 /* else no continuation marker was found, so break */
3490 else
(gdb) print end
$1 = -1
(gdb) print buf
$2 = 0x7ce6a000 "\n"
(gdb) bt
#0 0x1c03c42d in mmap_fgets_multiline (temp_mmapfile=0x8318aca0) at utils.c:3486
#1 0x1c018757 in read_main_config_file (main_config_file=0x7cecc000 "/usr/local/nagios/etc/nagios.cfg") at config.c:281
#2 0x1c00e0b2 in main (argc=3, argv=0xcfbda84c) at nagios.c:475
(gdb)
It ssem to happen in different places in the input file, though:
(gdb) print *temp_mmapfile
$2 = {path = 0x80319600 "/usr/local/nagios/etc/nagios.cfg", mode = 0, fd = 8, file_size = 42546, current_position = 8259, current_line = 244, mmap_buf = 0x7e4a2000}
$4 = {path = 0x80c68600 "/usr/local/nagios/etc/nagios.cfg", mode = 0, fd = 8, file_size = 42546, current_position = 8710, current_line = 258, mmap_buf = 0x8af0c000}
$6 = {path = 0x7fd22340 "/usr/local/nagios/etc/nagios.cfg", mode = 0, fd = 8, file_size = 42546, current_position = 6989, current_line = 211, mmap_buf = 0x883aa000}
$8 = {path = 0x7cb245c0 "/usr/local/nagios/etc/nagios.cfg", mode = 0, fd = 8, file_size = 42546, current_position = 12151, current_line = 375, mmap_buf = 0x83b74000}
$9 = {path = 0x80fdd480 "/usr/local/nagios/etc/nagios.cfg", mode = 0, fd = 8, file_size = 42546, current_position = 7212, current_line = 221, mmap_buf = 0x7c66f000}
Sometimes it even seems to get confused over the real end of the config files:
| LEN: 37, END: 35, BUF=# "TRUE" REGULAR EXPRESSION MATCHING
| BUFNOW: # "TRUE" REGULAR EXPRESSION MATCHING
| LEN: 65, END: 63, BUF=# This option controls whether or not
| Total Warnings: 0
| Total Errors: 0
|
| Things look okay - No serious problems were detected during the pre-flight check
or
| LEN: 71, END: 69, BUF=# This directive is used to specify an event broker module that should
| BUFNOW: # This directive is used to specify an event broker module that should
| LEN: 71, END: 69, BUF=# by loaded by Nagios at start
| Total Warnings: 0
| Total Errors: 0
|
| Things look okay - No serious problems were detected during the pre-flight check
I think these lines make end negative if buf contains just an end of line:
3465 /* handle Windows/DOS CR/LF */
3466 if(len>=2 && buf[len-2]=='\r')
3467 end=len-3;
3468 /* normal Unix LF */
3469 else if(len>=1 && buf[len-1]=='\n')
3470 end=len-2;
3471 else
3472 end=len-1;
But apart from that I am completely confused, as I can see no source of non-determinism in
the code. Maybe it is address randomization: sometimes buf is allocated at the beginning
of a page, so buf[-1] segfaults, and sometimes not, so that the erroneous code continues
to run, yielding undefined behaviour.
Memtest86+ shows nothing suspicious on the machine, so there seems to be no involuntary
hardware RNG involved.
- Florian.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Nagios-users mailing list
Nagios-users at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nagios-users
::: Please include Nagios version, plugin version (-v) and OS when reporting any issue.
::: Messages without supporting info will risk being sent to /dev/null
More information about the Users
mailing list