aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorHeinrich Schuchardt2023-08-22 12:21:13 +0200
committerHeinrich Schuchardt2023-08-23 08:02:59 +0200
commit175e4b01beed25dedbd17a082786ec2e6739f1b3 (patch)
tree6bb771c48fe1605ef861c2519d14a9362a478ff5 /cmd
parent976fb2ffa3875a7bed9866bf5cf939a81c423ef8 (diff)
cmd: setexpr: fix printf_str()
If vsnprintf() returns a negative number, (i >= remaining) will possibly be true: 'i' is of type signed int and 'remaining' is of the unsigned type size_t. The C language will convert i to an unsigned type before the comparison. This can result in the wrong error type being indicated. Checking for negative i should be done first. Fixes: f4f8d8bb1abc ("cmd: setexpr: add format string handling") Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/printf.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/cmd/printf.c b/cmd/printf.c
index e0246767431..0c6887e0d6e 100644
--- a/cmd/printf.c
+++ b/cmd/printf.c
@@ -144,10 +144,10 @@ static void printf_str(struct print_inf *inf, char *format, ...)
i = vsnprintf(inf->str + inf->offset, remaining, format, args);
va_end(args);
- if (i >= remaining)
- inf->error |= PRINT_TRUNCATED_ERROR;
- else if (i < 0)
+ if (i < 0)
inf->error |= PRINT_CONVERSION_ERROR;
+ else if ((unsigned int)i >= remaining)
+ inf->error |= PRINT_TRUNCATED_ERROR;
else
inf->offset += i;
}