=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cfg.c,v retrieving revision 1.12 retrieving revision 1.13 diff -c -r1.12 -r1.13 *** src/usr.bin/tmux/cfg.c 2010/12/29 21:28:32 1.12 --- src/usr.bin/tmux/cfg.c 2011/08/24 10:46:01 1.13 *************** *** 1,4 **** ! /* $OpenBSD: cfg.c,v 1.12 2010/12/29 21:28:32 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cfg.c,v 1.13 2011/08/24 10:46:01 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 92,113 **** retval = 0; while ((buf = fgetln(f, &len))) { if (buf[len - 1] == '\n') ! buf[len - 1] = '\0'; else { ! line = xrealloc(line, 1, len + 1); ! memcpy(line, buf, len); ! line[len] = '\0'; ! buf = line; } n++; if (cmd_string_parse(buf, &cmdlist, &cause) != 0) { if (cause == NULL) continue; cfg_add_cause(causes, "%s: %u: %s", path, n, cause); xfree(cause); continue; ! } if (cmdlist == NULL) continue; cfg_cause = NULL; --- 92,128 ---- retval = 0; 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'; + continue; + } + buf = line; + line = NULL; + if (cmd_string_parse(buf, &cmdlist, &cause) != 0) { + xfree(buf); if (cause == NULL) continue; cfg_add_cause(causes, "%s: %u: %s", path, n, cause); xfree(cause); continue; ! } else ! xfree(buf); if (cmdlist == NULL) continue; cfg_cause = NULL; *************** *** 131,142 **** retval = 1; cmd_list_free(cmdlist); if (cfg_cause != NULL) { ! cfg_add_cause(causes, "%s: %d: %s", path, n, cfg_cause); xfree(cfg_cause); } } ! if (line != NULL) xfree(line); fclose(f); return (retval); --- 146,161 ---- retval = 1; cmd_list_free(cmdlist); if (cfg_cause != NULL) { ! cfg_add_cause( ! causes, "%s: %d: %s", path, n, cfg_cause); xfree(cfg_cause); } } ! if (line != NULL) { ! cfg_add_cause(causes, ! "%s: %d: line continuation at end of file", path, n); xfree(line); + } fclose(f); return (retval);