diff options
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/strlib.c | 25 | ||||
-rw-r--r-- | src/common/strlib.h | 5 |
2 files changed, 30 insertions, 0 deletions
diff --git a/src/common/strlib.c b/src/common/strlib.c index d0b312f0a..db47c969b 100644 --- a/src/common/strlib.c +++ b/src/common/strlib.c @@ -316,6 +316,31 @@ size_t safestrnlen(const char* string, size_t maxlen) return ( string != NULL ) ? strnlen(string, maxlen) : 0; } +/// Works like snprintf, but always nul-terminates the buffer. +/// Returns the size of the string (without nul-terminator) +/// or -1 if the buffer is too small. +/// +/// @param buf Target buffer +/// @param sz Size of the buffer (including nul-terminator) +/// @param fmt Format string +/// @param ... Format arguments +/// @return The size of the string or -1 if the buffer is too small +int safesnprintf(char* buf, size_t sz, const char* fmt, ...) +{ + va_list ap; + int ret; + + va_start(ap,fmt); + ret = vsnprintf(buf, sz, fmt, ap); + va_end(ap); + if( ret < 0 || (size_t)ret >= sz ) + {// overflow + buf[sz-1] = '\0';// always nul-terminate + return -1; + } + return ret; +} + /// Returns the line of the target position in the string. /// Lines start at 1. int strline(const char* str, size_t pos) diff --git a/src/common/strlib.h b/src/common/strlib.h index 4df5a51d2..31e364e2a 100644 --- a/src/common/strlib.h +++ b/src/common/strlib.h @@ -37,6 +37,11 @@ char* safestrncpy(char* dst, const char* src, size_t n); /// doesn't crash on null pointer size_t safestrnlen(const char* string, size_t maxlen); +/// Works like snprintf, but always nul-terminates the buffer. +/// Returns the size of the string (without nul-terminator) +/// or -1 if the buffer is too small. +int safesnprintf(char* buf, size_t sz, const char* fmt, ...); + /// Returns the line of the target position in the string. /// Lines start at 1. int strline(const char* str, size_t pos); |