Change load_cfg to fix a crash reported by jasper.

This commit is contained in:
Nicholas Marriott 2012-12-13 15:36:16 +00:00
parent 3a0016a78a
commit 9714880283

32
cfg.c
View File

@ -19,6 +19,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <ctype.h>
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -78,8 +79,8 @@ load_cfg(const char *path, struct cmd_ctx *ctxin, struct causelist *causes)
{ {
FILE *f; FILE *f;
u_int n; u_int n;
char *buf, *line, *cause; char *buf, *copy, *line, *cause;
size_t len, newlen; size_t len, oldlen;
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
struct cmd_ctx ctx; struct cmd_ctx ctx;
enum cmd_retval retval; enum cmd_retval retval;
@ -95,21 +96,23 @@ load_cfg(const char *path, struct cmd_ctx *ctxin, struct causelist *causes)
line = NULL; line = NULL;
retval = CMD_RETURN_NORMAL; retval = CMD_RETURN_NORMAL;
while ((buf = fgetln(f, &len))) { while ((buf = fgetln(f, &len))) {
/* Trim \n. */
if (buf[len - 1] == '\n') if (buf[len - 1] == '\n')
len--; len--;
log_debug ("%s: %s", path, buf);
/* Current line is the continuation of the previous one. */ /* Current line is the continuation of the previous one. */
if (line != NULL) { if (line != NULL) {
newlen = strlen(line) + len + 1; oldlen = strlen(line);
line = xrealloc(line, 1, newlen); line = xrealloc(line, 1, oldlen + len + 1);
} else { } else {
newlen = len + 1; oldlen = 0;
line = xmalloc(newlen); line = xmalloc(len + 1);
*line = '\0';
} }
/* Append current line to the previous. */ /* Append current line to the previous. */
strlcat(line, buf, newlen); memcpy(line + oldlen, buf, len);
line[oldlen + len] = '\0';
n++; n++;
/* Continuation: get next line? */ /* Continuation: get next line? */
@ -121,18 +124,25 @@ load_cfg(const char *path, struct cmd_ctx *ctxin, struct causelist *causes)
if (len > 1 && line[len - 2] != '\\') if (len > 1 && line[len - 2] != '\\')
continue; continue;
} }
buf = line; copy = line;
line = NULL; line = NULL;
/* Skip empty lines. */
buf = copy;
while (isspace((u_char)*buf))
buf++;
if (*buf == '\0')
continue;
if (cmd_string_parse(buf, &cmdlist, &cause) != 0) { if (cmd_string_parse(buf, &cmdlist, &cause) != 0) {
free(buf); free(copy);
if (cause == NULL) if (cause == NULL)
continue; continue;
cfg_add_cause(causes, "%s: %u: %s", path, n, cause); cfg_add_cause(causes, "%s: %u: %s", path, n, cause);
free(cause); free(cause);
continue; continue;
} }
free(buf); free(copy);
if (cmdlist == NULL) if (cmdlist == NULL)
continue; continue;