From 901c543dda30af8c77ed232693b09127bca89f64 Mon Sep 17 00:00:00 2001 From: Matthias Andree Date: Wed, 16 Nov 2005 03:40:15 +0000 Subject: Fix segfault when run control file ends with a backslash inside an unterminated quoted string. In quoted strings, support backslash as last character on a line to join the following line to the current. svn path=/trunk/; revision=4446 --- rcfile_l.l | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'rcfile_l.l') diff --git a/rcfile_l.l b/rcfile_l.l index 89728f59..506e8e20 100644 --- a/rcfile_l.l +++ b/rcfile_l.l @@ -234,26 +234,30 @@ char *tp; /* target buffer for digested string */ { int cval = 0; - if (*cp == '\\' && strchr("0123456789xX", cp[1])) + /* we MUST check for NUL explicitly, as strchr(string, 0) will + * always succeed! */ + if (*cp == '\\' && cp[1] && strchr("0123456789xX", cp[1])) { char *dp; const char *hex = "00112233445566778899aAbBcCdDeEfF"; int dcount = 0; if (*++cp == 'x' || *cp == 'X') - for (++cp; (dp = strchr(hex, *cp)) && (dcount++ < 2); cp++) + for (++cp; *cp && (dp = strchr(hex, *cp)) && (dcount++ < 2); cp++) cval = (cval * 16) + (dp - hex) / 2; else if (*cp == '0') - while (strchr("01234567",*cp) != (char*)NULL && (dcount++ < 3)) + while (*cp && strchr("01234567",*cp) != (char*)NULL && (dcount++ < 3)) cval = (cval * 8) + (*cp++ - '0'); else - while ((strchr("0123456789",*cp)!=(char*)NULL)&&(dcount++ < 3)) + while (*cp && (strchr("0123456789",*cp)!=(char*)NULL)&&(dcount++ < 3)) cval = (cval * 10) + (*cp++ - '0'); } else if (*cp == '\\') /* C-style character escapes */ { switch (*++cp) { + case '\n': cp++; continue; /* backslash before LF to join lines */ + case '\0': goto done; /* ignore backslash at file end */ case '\\': cval = '\\'; break; case 'n': cval = '\n'; break; case 't': cval = '\t'; break; @@ -267,5 +271,6 @@ char *tp; /* target buffer for digested string */ cval = *cp++; *tp++ = cval; } +done: *tp = '\0'; } -- cgit v1.2.3