diff options
author | Heinrich Schuchardt | 2023-08-22 12:21:13 +0200 |
---|---|---|
committer | Heinrich Schuchardt | 2023-08-23 08:02:59 +0200 |
commit | 175e4b01beed25dedbd17a082786ec2e6739f1b3 (patch) | |
tree | 6bb771c48fe1605ef861c2519d14a9362a478ff5 /cmd | |
parent | 976fb2ffa3875a7bed9866bf5cf939a81c423ef8 (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.c | 6 |
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; } |