=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cfg.c,v retrieving revision 1.19 retrieving revision 1.20 diff -c -r1.19 -r1.20 *** src/usr.bin/tmux/cfg.c 2012/11/27 22:59:34 1.19 --- src/usr.bin/tmux/cfg.c 2012/12/06 13:06:05 1.20 *************** *** 1,4 **** ! /* $OpenBSD: cfg.c,v 1.19 2012/11/27 22:59:34 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cfg.c,v 1.20 2012/12/06 13:06:05 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 79,85 **** FILE *f; u_int n; char *buf, *line, *cause; ! size_t len; struct cmd_list *cmdlist; struct cmd_ctx ctx; enum cmd_retval retval; --- 79,85 ---- FILE *f; u_int n; char *buf, *line, *cause; ! size_t len, newlen; struct cmd_list *cmdlist; struct cmd_ctx ctx; enum cmd_retval retval; *************** *** 88,118 **** cfg_add_cause(causes, "%s: %s", path, strerror(errno)); return (CMD_RETURN_ERROR); } - n = 0; cfg_references++; line = NULL; retval = CMD_RETURN_NORMAL; while ((buf = fgetln(f, &len))) { if (buf[len - 1] == '\n') len--; ! if (line != NULL) ! line = xrealloc(line, 1, strlen(line) + len + 1); ! else { ! line = xmalloc(len + 1); *line = '\0'; } ! /* Append buffer to line. strncat will terminate. */ ! strncat(line, buf, len); n++; /* Continuation: get next line? */ len = strlen(line); if (len > 0 && line[len - 1] == '\\') { line[len - 1] = '\0'; /* Ignore escaped backslash at EOL. */ if (len > 1 && line[len - 2] != '\\') continue; --- 88,122 ---- cfg_add_cause(causes, "%s: %s", path, strerror(errno)); return (CMD_RETURN_ERROR); } cfg_references++; + n = 0; line = NULL; retval = CMD_RETURN_NORMAL; while ((buf = fgetln(f, &len))) { if (buf[len - 1] == '\n') len--; ! /* Current line is the continuation of the previous one. */ ! if (line != NULL) { ! newlen = strlen(line) + len + 1; ! line = xrealloc(line, 1, newlen); ! } else { ! newlen = len + 1; ! line = xmalloc(newlen); *line = '\0'; } ! /* Append current line to the previous. */ ! strlcat(line, buf, newlen); n++; /* Continuation: get next line? */ len = strlen(line); if (len > 0 && line[len - 1] == '\\') { line[len - 1] = '\0'; + /* Ignore escaped backslash at EOL. */ if (len > 1 && line[len - 2] != '\\') continue; *************** *** 127,137 **** cfg_add_cause(causes, "%s: %u: %s", path, n, cause); free(cause); continue; ! } else ! free(buf); if (cmdlist == NULL) continue; - cfg_cause = NULL; if (ctxin == NULL) { ctx.msgdata = NULL; --- 131,140 ---- cfg_add_cause(causes, "%s: %u: %s", path, n, cause); free(cause); continue; ! } ! free(buf); if (cmdlist == NULL) continue; if (ctxin == NULL) { ctx.msgdata = NULL; *************** *** 162,169 **** } cmd_list_free(cmdlist); if (cfg_cause != NULL) { ! cfg_add_cause( ! causes, "%s: %d: %s", path, n, cfg_cause); free(cfg_cause); } } --- 165,171 ---- } cmd_list_free(cmdlist); if (cfg_cause != NULL) { ! cfg_add_cause(causes, "%s: %d: %s", path, n, cfg_cause); free(cfg_cause); } }