summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt1
-rw-r--r--src/common/strlib.c25
-rw-r--r--src/common/strlib.h5
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);