mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
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:
parent
9c11135ce0
commit
947c626dc5
13 changed files with 0 additions and 51 deletions
9
README
9
README
|
@ -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.
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ','
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue