mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-23 13:36:05 +00:00
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:
commit
b22f18e365
1 changed files with 14 additions and 24 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue