fix here string parsing problem found by Stéphane Chazelas
This commit is contained in:
25
lex.c
25
lex.c
@@ -23,7 +23,7 @@
|
||||
|
||||
#include "sh.h"
|
||||
|
||||
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.194 2014/11/19 18:44:11 tg Exp $");
|
||||
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.195 2014/12/15 22:50:10 tg Exp $");
|
||||
|
||||
/*
|
||||
* states while lexing word
|
||||
@@ -1027,17 +1027,24 @@ yylex(int cf)
|
||||
/* copy word to unprefixed string ident */
|
||||
sp = yylval.cp;
|
||||
dp = ident;
|
||||
if ((cf & HEREDELIM) && (sp[1] == '<'))
|
||||
while ((dp - ident) < IDENT) {
|
||||
if ((c = *sp++) == CHAR)
|
||||
*dp++ = *sp++;
|
||||
else if ((c != OQUOTE) && (c != CQUOTE))
|
||||
break;
|
||||
if ((cf & HEREDELIM) && (sp[1] == '<')) {
|
||||
herestringloop:
|
||||
switch ((c = *sp++)) {
|
||||
case CHAR:
|
||||
++sp;
|
||||
/* FALLTHROUGH */
|
||||
case OQUOTE:
|
||||
case CQUOTE:
|
||||
goto herestringloop;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
else
|
||||
/* dummy value */
|
||||
*dp++ = 'x';
|
||||
} else
|
||||
while ((dp - ident) < IDENT && (c = *sp++) == CHAR)
|
||||
*dp++ = *sp++;
|
||||
/* Make sure the ident array stays '\0' padded */
|
||||
/* make sure the ident array stays NUL padded */
|
||||
memset(dp, 0, (ident + IDENT) - dp + 1);
|
||||
if (c != EOS)
|
||||
/* word is not unquoted */
|
||||
|
Reference in New Issue
Block a user