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
diff --git a/lib/libc/snprintf.c b/lib/libc/snprintf.c
index 3b175ed..f34cefd 100644
--- a/lib/libc/snprintf.c
+++ b/lib/libc/snprintf.c
@@ -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 @@
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 @@
} 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);
}
}