diff options
author | Sonny Rao <sonnyrao@chromium.org> | 2011-11-02 09:52:08 +0000 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2011-12-17 23:33:20 +0100 |
commit | 046a37bd53f479915bcd5041e0834dad576371a2 (patch) | |
tree | b869392a16be5b8a3313e4c20e5b10a871329a3d /include/vsprintf.h | |
parent | 9785c905cff109e48415904e518ca559918e7fd0 (diff) |
Add safe vsnprintf and snprintf library functions
From: Sonny Rao <sonnyrao@chromium.org>
These functions are useful in U-Boot because they allow a graceful failure
rather than an unpredictable stack overflow when printf() buffers are
exceeded.
Mostly copied from the Linux kernel. I copied vscnprintf and
scnprintf so we can change printf and vprintf to use the safe
implementation but still return the correct values.
(Simon Glass <sjg@chromium.org> modified this commit a little)
Signed-off-by: Sonny Rao <sonnyrao@chromium.org>
Diffstat (limited to 'include/vsprintf.h')
-rw-r--r-- | include/vsprintf.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/include/vsprintf.h b/include/vsprintf.h index 065144669ff..5195598f973 100644 --- a/include/vsprintf.h +++ b/include/vsprintf.h @@ -36,4 +36,23 @@ int sprintf(char *buf, const char *fmt, ...) int vsprintf(char *buf, const char *fmt, va_list args); char *simple_itoa(ulong i); +#ifdef CONFIG_SYS_VSNPRINTF +int snprintf(char *buf, size_t size, const char *fmt, ...) + __attribute__ ((format (__printf__, 3, 4))); +int scnprintf(char *buf, size_t size, const char *fmt, ...) + __attribute__ ((format (__printf__, 3, 4))); +int vsnprintf(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 */ + #endif |