NagiosEnterprises / nrpe

NRPE Agent
GNU General Public License v2.0
263 stars 134 forks source link

check_nrpe: SIGSEGV when configuration file does not ends with newline #153

Closed rpv-tomsk closed 7 years ago

rpv-tomsk commented 7 years ago
# gdb ./check_nrpe
GNU gdb (GDB) 7.4.1-debian
This GDB was configured as "x86_64-linux-gnu".
Reading symbols from /home/nagios-nrpe-plugin/nagios-nrpe-3.2.0/src/check_nrpe...done.
(gdb) run -c check_raid --config-file=/home/nagios-nrpe-plugin/nagios-nrpe-3.2.0/src/config.cfg
Starting program: /home/nagios-nrpe-plugin/nagios-nrpe-3.2.0/src/check_nrpe -c check_raid --config-file=/home/nagios-nrpe-plugin/nagios-nrpe-3.2.0/src/config.cfg

Program received signal SIGSEGV, Segmentation fault.
read_config_file (fname=0x555555762030 "/home/nagios-nrpe-plugin/nagios-nrpe-3.2.0/src/config.cfg") at ./check_nrpe.c:576
576                     while (*bufp && strchr(delims, *bufp))
(gdb) bt full
#0  read_config_file (fname=0x555555762030 "/home/nagios-nrpe-plugin/nagios-nrpe-3.2.0/src/config.cfg") at ./check_nrpe.c:576
        rc = <optimized out>
        argc = <optimized out>
        f = 0x555555762080
        buf = 0x5555557622c0 "timeout"
        bufp = 0x0
        argv = 0x5555557622e0
        delims = 0x55555555b6ba " \t\r\n"
        st = {st_dev = 64771, st_ino = 1115036, st_nlink = 1, st_mode = 33188, st_uid = 0, st_gid = 0, __pad0 = 0, st_rdev = 0, st_size = 10,
          st_blksize = 4096, st_blocks = 8, st_atim = {tv_sec = 1500390213, tv_nsec = 0}, st_mtim = {tv_sec = 1500390209, tv_nsec = 0}, st_ctim = {
            tv_sec = 1500390209, tv_nsec = 0}, __unused = {0, 0, 0}}
        sz = 93824994386632
#1  0x0000555555557e99 in process_arguments (argc=<optimized out>, argv=<optimized out>, from_config_file=from_config_file@entry=0)
    at ./check_nrpe.c:515
        optchars = "H:f:b:c:a:t:p:S:L:C:K:A:d:s:P:g:246hlnuVE\000\336\367\377\177\000\000\001\000\000\000\377\177\000\000\330\331\377\367\377\177", '\000' <repeats 18 times>, "@;V\367\377\177\000\000\254\222\336\367\377\177\000\000\330\331\377\367\377\177\000\000\000\000\000\000\000\000\000\000\300\\!\000\000\000\000\000\300\355w\367\377\177\000\000\000\000 \322\377\377\377\377\000\000\377\367\377\177\000\000\000\000\000\000\000\000\000\000\244\313V\367\377\177\000\000`\343\377\377\377\177\000\000\000\000`\304\377\377\377\377\000\000\026W\275\357\377\377a\000\000\000n", '\000' <repeats 11 times>, "\027\000\000\000\000\000\000\000<\000\000\000\000\000\000\000\240\350\377\377\377\177\000\000\020\351\377\377\377\177\000\000ȩ\377\367\377\177\000\000\002\000\000\000\000\000\000\000\223K{\367\377\177\000\000P\344\377\377\377\177\000\000\342\241\336\367\377\177\000\000\000\000\000\000\000\000\000\000\246\253\336\367\377\177\000\000\030\340\377\367\377\177"...
        argindex = <optimized out>
        c = <optimized out>
        i = <optimized out>
        has_cert = <optimized out>
        has_priv_key = <optimized out>
        rc = <optimized out>
        option_index = 1
        long_options = {{name = 0x55555555b93e "host", has_arg = 1, flag = 0x0, val = 72}, {name = 0x55555555b943 "config-file", has_arg = 1,
            flag = 0x0, val = 102}, {name = 0x55555555b94f "bind", has_arg = 1, flag = 0x0, val = 98}, {name = 0x55555555b954 "command",
            has_arg = 1, flag = 0x0, val = 99}, {name = 0x55555555b95c "args", has_arg = 1, flag = 0x0, val = 97}, {
            name = 0x55555555b961 "no-ssl", has_arg = 0, flag = 0x0, val = 110}, {name = 0x55555555b968 "unknown-timeout", has_arg = 0,
            flag = 0x0, val = 117}, {name = 0x55555555b978 "v2-packets-only", has_arg = 0, flag = 0x0, val = 50}, {name = 0x55555555b988 "ipv4",
            has_arg = 0, flag = 0x0, val = 52}, {name = 0x55555555b98d "ipv6", has_arg = 0, flag = 0x0, val = 54}, {
            name = 0x55555555b992 "use-adh", has_arg = 1, flag = 0x0, val = 100}, {name = 0x55555555b99a "ssl-version", has_arg = 1, flag = 0x0,
            val = 83}, {name = 0x55555555b9a6 "cipher-list", has_arg = 1, flag = 0x0, val = 76}, {name = 0x55555555b9b2 "client-cert",
            has_arg = 1, flag = 0x0, val = 67}, {name = 0x55555555b9be "key-file", has_arg = 1, flag = 0x0, val = 75}, {
            name = 0x55555555b9c7 "ca-cert-file", has_arg = 1, flag = 0x0, val = 65}, {name = 0x55555555b9d4 "ssl-logging", has_arg = 1,
            flag = 0x0, val = 115}, {name = 0x55555555b970 "timeout", has_arg = 1, flag = 0x0, val = 116}, {name = 0x55555555b9e0 "port",
            has_arg = 1, flag = 0x0, val = 112}, {name = 0x55555555b9e5 "payload-size", has_arg = 1, flag = 0x0, val = 80}, {
            name = 0x55555555b9f2 "log-file", has_arg = 1, flag = 0x0, val = 103}, {name = 0x55555555b9fb "help", has_arg = 0, flag = 0x0,
            val = 104}, {name = 0x55555555ba00 "license", has_arg = 0, flag = 0x0, val = 108}, {name = 0x55555555b99e "version", has_arg = 0,
            flag = 0x0, val = 86}, {name = 0x55555555ba08 "stderr-to-stdout", has_arg = 0, flag = 0x0, val = 69}, {name = 0x0, has_arg = 0,
            flag = 0x0, val = 0}}
#2  0x00005555555573b8 in main (argc=<optimized out>, argv=<optimized out>) at ./check_nrpe.c:137
        result = <optimized out>
(gdb)
rpv-tomsk commented 7 years ago

Proposed fix:

--- check_nrpe.c.orig   2017-06-27 21:13:20.000000000 +0000
+++ check_nrpe.c        2017-07-18 15:34:36.000000000 +0000
@@ -580,6 +580,8 @@ int read_config_file(char *fname)
                argv[argc] = my_strsep(&bufp, delims);
                if (!argv[argc++])
                        break;
+               if (!bufp)
+                       break;
        }

        fclose(f);
hedenface commented 7 years ago

@rpv-tomsk Nice find! Would you like to open a pull request or do you want me to just patch it?

If you open the request, please make the adjustment in the maint branch. Thanks!

rpv-tomsk commented 7 years ago

Hi Bryan!

I have created a pull request. That would be nice to leave my mark in history of your great product!

Thanks!

hedenface commented 7 years ago

Fixed via your commit https://github.com/NagiosEnterprises/nrpe/commit/c5253cf632563c21d6c9c23894f4a633ea0f1993! :)