diff options
-rw-r--r-- | Changelog-Trunk.txt | 1 | ||||
-rw-r--r-- | src/common/strlib.c | 25 | ||||
-rw-r--r-- | src/common/strlib.h | 5 |
3 files changed, 31 insertions, 0 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 869abd50b..4d8df25be 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2007/11/27 + * Added safesnprintf to strlib.c/h (bugreport:372) [FlavioJS] * removed login/char server_fd[] arrays, added server[].fd instead * TXT/SQL login server code synchronization [ultramage] - exported several core structures to login.h 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); |