shell: Fix unsigned char promotion and truncation
When a char is promoted to an int, it needs to be signed as otherwise
comparisons on it may fail. Alternatively, an integer needs to be
truncated to char before comparing it against another char.
Reported-by: Juergen Daubert <j.daubert@posteo.de>
Fixes: e878137f63e6 ("expand: Do not call rmescapes in expari")
Fixes: c5bf9702ea11 ("expand: Add multi-byte support to pmatch")
Fixes: 8f01c3796f0f ("[PARSER] Add FAKEEOFMARK for expandstr")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
diff --git a/src/expand.c b/src/expand.c
index 912384d..8c8bf0e 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -1914,7 +1914,7 @@
if (c == '?' || c == '[')
c = CTLESC;
for (;;) {
- if (c != CTLESC) {
+ if (c != (char)CTLESC) {
/* Stop should be null-terminated
* as it is passed as a string to
* strpbrk(3).
@@ -1985,7 +1985,7 @@
p++;
if (*p == (char)CTLESC)
p++;
- else if (*p == CTLMBCHAR) {
+ else if (*p == (char)CTLMBCHAR) {
mbp = mbnext(p);
p += mbp & 0xff;
p += mbp >> 8;
diff --git a/src/parser.c b/src/parser.c
index eb402a7..5714958 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1240,7 +1240,7 @@
markloc = out - (char *)stackblock();
for (p = eofmark; STPUTC(c, out), *p; p++) {
- if (c != *p)
+ if (c != (signed char)*p)
goto more_heredoc;
c = pgetc();