mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
sh: Avoid negative character values from $'\Uffffffff' etc.
The negative value was not expected and generated the low 8 bits as a byte, which may be an invalid character encoding. The final shift in creating the negative value was undefined as well. Make the temporary variable unsigned to fix this.
This commit is contained in:
parent
6460ee789a
commit
5e03b81fd4
3 changed files with 15 additions and 5 deletions
|
|
@ -1195,7 +1195,8 @@ parsebackq(char *out, struct nodelist **pbqlist,
|
|||
static char *
|
||||
readcstyleesc(char *out)
|
||||
{
|
||||
int c, v, i, n;
|
||||
int c, vc, i, n;
|
||||
unsigned int v;
|
||||
|
||||
c = pgetc();
|
||||
switch (c) {
|
||||
|
|
@ -1310,12 +1311,12 @@ readcstyleesc(char *out)
|
|||
default:
|
||||
synerror("Bad escape sequence");
|
||||
}
|
||||
v = (char)v;
|
||||
vc = (char)v;
|
||||
/*
|
||||
* We can't handle NUL bytes.
|
||||
* POSIX says we should skip till the closing quote.
|
||||
*/
|
||||
if (v == '\0') {
|
||||
if (vc == '\0') {
|
||||
while ((c = pgetc()) != '\'') {
|
||||
if (c == '\\')
|
||||
c = pgetc();
|
||||
|
|
@ -1332,9 +1333,9 @@ readcstyleesc(char *out)
|
|||
pungetc();
|
||||
return out;
|
||||
}
|
||||
if (SQSYNTAX[v] == CCTL)
|
||||
if (SQSYNTAX[vc] == CCTL)
|
||||
USTPUTC(CTLESC, out);
|
||||
USTPUTC(v, out);
|
||||
USTPUTC(vc, out);
|
||||
return out;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ FILES+= dollar-quote9.0
|
|||
FILES+= dollar-quote10.0
|
||||
FILES+= dollar-quote11.0
|
||||
FILES+= dollar-quote12.0
|
||||
FILES+= dollar-quote13.0
|
||||
FILES+= empty-braces1.0
|
||||
FILES+= empty-cmd1.0
|
||||
FILES+= for1.0
|
||||
|
|
|
|||
8
bin/sh/tests/parser/dollar-quote13.0
Normal file
8
bin/sh/tests/parser/dollar-quote13.0
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
# $FreeBSD$
|
||||
|
||||
# This Unicode escape sequence that has never been in range should either
|
||||
# fail to expand or expand to a fallback.
|
||||
|
||||
c=$(eval printf %s \$\'\\Uffffff41\' 2>/dev/null)
|
||||
r=$(($? != 0))
|
||||
[ "$r.$c" = '1.' ] || [ "$r.$c" = '0.?' ] || [ "$r.$c" = $'0.\u2222' ]
|
||||
Loading…
Reference in a new issue