vsprintf.c: Always enable CONFIG_SYS_VSNPRINTF

Enabling this function always removes some class of string saftey issues.
The size change here in general is about 400 bytes and this seems a reasonable
trade-off.

Cc: Peng Fan <peng.fan@nxp.com>
Cc: Peter Robinson <pbrobinson@gmail.com>
Cc: Fabio Estevam <fabio.estevam@freescale.com>
Cc: Adrian Alonso <aalonso@freescale.com>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
Tom Rini 2016-01-14 13:02:03 -05:00
parent 9c11135ce0
commit 947c626dc5
13 changed files with 0 additions and 51 deletions

9
README
View file

@ -890,15 +890,6 @@ The following options need to be configured:
'Sane' compilers will generate smaller code if 'Sane' compilers will generate smaller code if
CONFIG_PRE_CON_BUF_SZ is a power of 2 CONFIG_PRE_CON_BUF_SZ is a power of 2
- Safe printf() functions
Define CONFIG_SYS_VSNPRINTF to compile in safe versions of
the printf() functions. These are defined in
include/vsprintf.h and include snprintf(), vsnprintf() and
so on. Code size increase is approximately 300-500 bytes.
If this option is not given then these functions will
silently discard their buffer size argument - this means
you are not getting any overflow checking in this case.
- Boot Delay: CONFIG_BOOTDELAY - in seconds - Boot Delay: CONFIG_BOOTDELAY - in seconds
Delay before automatically booting the default image; Delay before automatically booting the default image;
set to -1 to disable autoboot. set to -1 to disable autoboot.

View file

@ -37,4 +37,3 @@ CONFIG_VIDEO_VESA=y
CONFIG_FRAMEBUFFER_SET_VESA_MODE=y CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
CONFIG_FRAMEBUFFER_VESA_MODE_11A=y CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
CONFIG_USE_PRIVATE_LIBGCC=y CONFIG_USE_PRIVATE_LIBGCC=y
CONFIG_SYS_VSNPRINTF=y

View file

@ -38,5 +38,4 @@ CONFIG_VIDEO_VESA=y
CONFIG_FRAMEBUFFER_SET_VESA_MODE=y CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
CONFIG_FRAMEBUFFER_VESA_MODE_11A=y CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
CONFIG_USE_PRIVATE_LIBGCC=y CONFIG_USE_PRIVATE_LIBGCC=y
CONFIG_SYS_VSNPRINTF=y
CONFIG_TPM=y CONFIG_TPM=y

View file

@ -33,5 +33,4 @@ CONFIG_VIDEO_VESA=y
CONFIG_FRAMEBUFFER_SET_VESA_MODE=y CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
CONFIG_FRAMEBUFFER_VESA_MODE_11A=y CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
CONFIG_USE_PRIVATE_LIBGCC=y CONFIG_USE_PRIVATE_LIBGCC=y
CONFIG_SYS_VSNPRINTF=y
CONFIG_TPM=y CONFIG_TPM=y

View file

@ -25,5 +25,4 @@ CONFIG_TPM_TIS_LPC=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_DM_USB=y CONFIG_DM_USB=y
CONFIG_USE_PRIVATE_LIBGCC=y CONFIG_USE_PRIVATE_LIBGCC=y
CONFIG_SYS_VSNPRINTF=y
CONFIG_TPM=y CONFIG_TPM=y

View file

@ -36,4 +36,3 @@ CONFIG_DM_USB=y
CONFIG_VIDEO_VESA=y CONFIG_VIDEO_VESA=y
CONFIG_FRAMEBUFFER_SET_VESA_MODE=y CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
CONFIG_USE_PRIVATE_LIBGCC=y CONFIG_USE_PRIVATE_LIBGCC=y
CONFIG_SYS_VSNPRINTF=y

View file

@ -28,4 +28,3 @@ CONFIG_TIMER=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_DM_USB=y CONFIG_DM_USB=y
CONFIG_USE_PRIVATE_LIBGCC=y CONFIG_USE_PRIVATE_LIBGCC=y
CONFIG_SYS_VSNPRINTF=y

View file

@ -39,4 +39,3 @@ CONFIG_VIDEO_VESA=y
CONFIG_FRAMEBUFFER_SET_VESA_MODE=y CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
CONFIG_FRAMEBUFFER_VESA_MODE_11A=y CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
CONFIG_USE_PRIVATE_LIBGCC=y CONFIG_USE_PRIVATE_LIBGCC=y
CONFIG_SYS_VSNPRINTF=y

View file

@ -30,4 +30,3 @@ CONFIG_VIDEO_VESA=y
CONFIG_FRAMEBUFFER_SET_VESA_MODE=y CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
CONFIG_FRAMEBUFFER_VESA_MODE_111=y CONFIG_FRAMEBUFFER_VESA_MODE_111=y
CONFIG_USE_PRIVATE_LIBGCC=y CONFIG_USE_PRIVATE_LIBGCC=y
CONFIG_SYS_VSNPRINTF=y

View file

@ -76,7 +76,6 @@ CONFIG_USB_EMUL=y
CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE=y
CONFIG_USB_KEYBOARD=y CONFIG_USB_KEYBOARD=y
CONFIG_SYS_USB_EVENT_POLL=y CONFIG_SYS_USB_EVENT_POLL=y
CONFIG_SYS_VSNPRINTF=y
CONFIG_CMD_DHRYSTONE=y CONFIG_CMD_DHRYSTONE=y
CONFIG_TPM=y CONFIG_TPM=y
CONFIG_LZ4=y CONFIG_LZ4=y

View file

@ -124,7 +124,6 @@ int sprintf(char *buf, const char *fmt, ...)
int vsprintf(char *buf, const char *fmt, va_list args); int vsprintf(char *buf, const char *fmt, va_list args);
char *simple_itoa(ulong i); char *simple_itoa(ulong i);
#ifdef CONFIG_SYS_VSNPRINTF
/** /**
* Format a string and place it in a buffer * Format a string and place it in a buffer
* *
@ -199,17 +198,6 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
* See the vsprintf() documentation for format string extensions over C99. * See the vsprintf() documentation for format string extensions over C99.
*/ */
int vscnprintf(char *buf, size_t size, const char *fmt, va_list args); int vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
#else
/*
* Use macros to silently drop the size parameter. Note that the 'cn'
* versions are the same as the 'n' versions since the functions assume
* there is always enough buffer space when !CONFIG_SYS_VSNPRINTF
*/
#define snprintf(buf, size, fmt, args...) sprintf(buf, fmt, ##args)
#define scnprintf(buf, size, fmt, args...) sprintf(buf, fmt, ##args)
#define vsnprintf(buf, size, fmt, args...) vsprintf(buf, fmt, ##args)
#define vscnprintf(buf, size, fmt, args...) vsprintf(buf, fmt, ##args)
#endif /* CONFIG_SYS_VSNPRINTF */
/** /**
* print_grouped_ull() - print a value with digits grouped by ',' * print_grouped_ull() - print a value with digits grouped by ','

View file

@ -27,15 +27,6 @@ config SYS_HZ
get_timer() must operate in milliseconds and this option must be get_timer() must operate in milliseconds and this option must be
set to 1000. set to 1000.
config SYS_VSNPRINTF
bool "Enable safe version of sprintf()"
help
Since sprintf() can overflow its buffer, it is common to use
snprintf() instead, which knows the buffer size and can avoid
overflow. However, this does increase code size slightly (for
Thumb-2, about 420 bytes). Enable this option for safety when
using sprintf() with data you do not control.
config USE_TINY_PRINTF config USE_TINY_PRINTF
bool "Enable tiny printf() version" bool "Enable tiny printf() version"
help help

View file

@ -141,7 +141,6 @@ static noinline char *put_dec(char *buf, uint64_t num)
#define SMALL 32 /* Must be 32 == 0x20 */ #define SMALL 32 /* Must be 32 == 0x20 */
#define SPECIAL 64 /* 0x */ #define SPECIAL 64 /* 0x */
#ifdef CONFIG_SYS_VSNPRINTF
/* /*
* Macro to add a new character to our output string, but only if it will * Macro to add a new character to our output string, but only if it will
* fit. The macro moves to the next character position in the output string. * fit. The macro moves to the next character position in the output string.
@ -151,9 +150,6 @@ static noinline char *put_dec(char *buf, uint64_t num)
*(str) = (ch); \ *(str) = (ch); \
++str; \ ++str; \
} while (0) } while (0)
#else
#define ADDCH(str, ch) (*(str)++ = (ch))
#endif
static char *number(char *buf, char *end, u64 num, static char *number(char *buf, char *end, u64 num,
int base, int size, int precision, int type) int base, int size, int precision, int type)
@ -441,13 +437,11 @@ static int vsnprintf_internal(char *buf, size_t size, const char *fmt,
/* 't' added for ptrdiff_t */ /* 't' added for ptrdiff_t */
char *end = buf + size; char *end = buf + size;
#ifdef CONFIG_SYS_VSNPRINTF
/* Make sure end is always >= buf - do we want this in U-Boot? */ /* Make sure end is always >= buf - do we want this in U-Boot? */
if (end < buf) { if (end < buf) {
end = ((void *)-1); end = ((void *)-1);
size = end - buf; size = end - buf;
} }
#endif
str = buf; str = buf;
for (; *fmt ; ++fmt) { for (; *fmt ; ++fmt) {
@ -609,21 +603,16 @@ repeat:
flags); flags);
} }
#ifdef CONFIG_SYS_VSNPRINTF
if (size > 0) { if (size > 0) {
ADDCH(str, '\0'); ADDCH(str, '\0');
if (str > end) if (str > end)
end[-1] = '\0'; end[-1] = '\0';
--str; --str;
} }
#else
*str = '\0';
#endif
/* the trailing null byte doesn't count towards the total */ /* the trailing null byte doesn't count towards the total */
return str - buf; return str - buf;
} }
#ifdef CONFIG_SYS_VSNPRINTF
int vsnprintf(char *buf, size_t size, const char *fmt, int vsnprintf(char *buf, size_t size, const char *fmt,
va_list args) va_list args)
{ {
@ -666,7 +655,6 @@ int scnprintf(char *buf, size_t size, const char *fmt, ...)
return i; return i;
} }
#endif /* CONFIG_SYS_VSNPRINT */
/** /**
* Format a string and place it in a buffer (va_list version) * Format a string and place it in a buffer (va_list version)