File shell-Fix-unsigned-char-promotion-and-truncation.patch of Package dash
From 5139d6a27763fc0be386e15634db21e45598b299 Mon Sep 17 00:00:00 2001
From: Herbert Xu <herbert@gondor.apana.org.au>
Date: Tue, 21 Oct 2025 21:29:32 +0800
Subject: 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>
---
src/expand.c | 4 ++--
src/parser.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
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 @@ static int pmatch(char *pattern, const char *string)
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 @@ static int pmatch(char *pattern, const char *string)
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 @@ checkend: {
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();
--
cgit 1.2.3-korg