Merge changes from topic "snprintf-fix" into integration

* changes:
  fix(libc): snprintf: include stdint.h
  fix(libc): limit snprintf radix value
  fix(libc): fix snprintf corner cases
This commit is contained in:
Joanna Farley 2022-02-11 18:51:25 +01:00 committed by TrustedFirmware Code Review
commit b22f18e365
1 changed files with 14 additions and 24 deletions

View File

@ -6,6 +6,7 @@
#include <assert.h>
#include <stdarg.h>
#include <stdint.h>
#include <common/debug.h>
#include <plat/common/platform.h>
@ -40,6 +41,12 @@ static void unsigned_num_print(char **s, size_t n, size_t *chars_printed,
unsigned int rem;
char ascii_a = capitalise ? 'A' : 'a';
if (radix < 10) {
ERROR("snprintf: unsupported radix '%d'.", radix);
plat_panic_handler();
assert(0); /* Unreachable */
}
do {
rem = unum % radix;
if (rem < 10U) {
@ -52,31 +59,14 @@ static void unsigned_num_print(char **s, size_t n, size_t *chars_printed,
} while (unum > 0U);
width = i;
if (padn > width) {
(*chars_printed) += (size_t)padn;
} else {
(*chars_printed) += (size_t)width;
for (i = padn - width; i > 0; i--) {
CHECK_AND_PUT_CHAR(*s, n, *chars_printed, padc);
}
if (*chars_printed < n) {
if (padn > 0) {
while (width < padn) {
*(*s)++ = padc;
padn--;
}
}
while (--i >= 0) {
*(*s)++ = num_buf[i];
}
if (padn < 0) {
while (width < -padn) {
*(*s)++ = padc;
padn++;
}
}
for (i = width; i > 0; i--) {
CHECK_AND_PUT_CHAR(*s, n, *chars_printed, num_buf[i - 1]);
}
for (i = width + padn; i < 0; i++) {
CHECK_AND_PUT_CHAR(*s, n, *chars_printed, padc);
}
}