inetd: fix order of array index check and array access
authorDenys Vlasenko <vda.linux@googlemail.com>
Tue, 3 Mar 2015 12:10:30 +0000 (13:10 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 3 Mar 2015 12:10:30 +0000 (13:10 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
networking/inetd.c

index b3f2e9fbcca1335c22c28dd7441c548671ed9a5f..8148925ce30998f3db50e89c17b326103e68755f 100644 (file)
@@ -645,7 +645,7 @@ static servtab_t *dup_servtab(servtab_t *sep)
 }
 
 /* gcc generates much more code if this is inlined */
-static servtab_t *parse_one_line(void)
+static NOINLINE servtab_t *parse_one_line(void)
 {
        int argc;
        char *token[6+MAXARGV];
@@ -675,6 +675,8 @@ static servtab_t *parse_one_line(void)
                         * default host for the following lines. */
                        free(default_local_hostname);
                        default_local_hostname = sep->se_local_hostname;
+                       /*sep->se_local_hostname = NULL; - redundant */
+                       /* (we'll overwrite this field anyway) */
                        goto more;
                }
        } else
@@ -688,10 +690,10 @@ static servtab_t *parse_one_line(void)
  parse_err:
                bb_error_msg("parse error on line %u, line is ignored",
                                parser->lineno);
-               free_servtab_strings(sep);
                /* Just "goto more" can make sep to carry over e.g.
                 * "rpc"-ness (by having se_rpcver_lo != 0).
                 * We will be more paranoid: */
+               free_servtab_strings(sep);
                free(sep);
                goto new;
        }
@@ -815,7 +817,7 @@ static servtab_t *parse_one_line(void)
        }
 #endif
        argc = 0;
-       while ((arg = token[6+argc]) != NULL && argc < MAXARGV)
+       while (argc < MAXARGV && (arg = token[6+argc]) != NULL)
                sep->se_argv[argc++] = xstrdup(arg);
        /* Some inetd.conf files have no argv's, not even argv[0].
         * Fix them up.