From 8515d1011cc7dcbbd4db1b80af5496559f3cec87 Mon Sep 17 00:00:00 2001 From: FlavioJS Date: Tue, 27 Nov 2007 23:06:37 +0000 Subject: * Added safesnprintf to strlib.c/h (bugreport:372) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11828 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/common/strlib.c | 25 +++++++++++++++++++++++++ src/common/strlib.h | 5 +++++ 2 files changed, 30 insertions(+) (limited to 'src/common') 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); -- cgit v1.2.3-60-g2f50