From 06d9ee89e5678acbca4fde1e6f82b3e7c55d6139 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Sun, 18 Dec 2016 12:22:58 +0100 Subject: [PATCH] history: encode newlines in filenames as nulls So they will not break a line in the positionlog file in two. (Strangely, the reading in of such a log file already decodes nulls back into newlines.) This fixes https://savannah.gnu.org/bugs/?49877. --- src/files.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/files.c b/src/files.c index 13cc6191..155dd0db 100644 --- a/src/files.c +++ b/src/files.c @@ -3056,12 +3056,21 @@ void save_poshistory(void) chmod(poshist, S_IRUSR | S_IWUSR); for (posptr = position_history; posptr != NULL; posptr = posptr->next) { + size_t length; + /* Assume 20 decimal positions each for line and column number, * plus two spaces, plus the line feed, plus the null byte. */ statusstr = charalloc(strlen(posptr->filename) + 44); sprintf(statusstr, "%s %ld %ld\n", posptr->filename, (long)posptr->lineno, (long)posptr->xno); - if (fwrite(statusstr, sizeof(char), strlen(statusstr), hist) < strlen(statusstr)) + length = strlen(statusstr); + + /* Encode newlines in filenames as nulls. */ + sunder(statusstr); + /* Restore the terminating newline. */ + statusstr[length - 1] = '\n'; + + if (fwrite(statusstr, sizeof(char), length, hist) < length) fprintf(stderr, _("Error writing %s: %s\n"), poshist, strerror(errno)); free(statusstr); }