diff options
-rw-r--r-- | Changelog-Trunk.txt | 2 | ||||
-rw-r--r-- | src/common/strlib.c | 23 | ||||
-rw-r--r-- | src/common/strlib.h | 2 |
3 files changed, 20 insertions, 7 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 4c01252e0..ff85e5425 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -3,6 +3,8 @@ Date Added AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. +2009/04/20 + * Fixed safestrncpy trashing the memory before dst when n == 0. (since r10667) [FlavioJS] 2009/04/15 * Monster Spiral Pierce is now a ranged misc attack [Playtester] - it always gets blocked by Pneuma, but never by Safety Wall diff --git a/src/common/strlib.c b/src/common/strlib.c index 9b97aabba..c1d26622a 100644 --- a/src/common/strlib.c +++ b/src/common/strlib.c @@ -301,14 +301,25 @@ int config_switch(const char* str) return (int)strtol(str, NULL, 0); } -/// always nul-terminates the string +/// strncpy that always nul-terminates the string char* safestrncpy(char* dst, const char* src, size_t n) { - char* ret; - ret = strncpy(dst, src, n); - if( ret != NULL ) - ret[n - 1] = '\0'; - return ret; + if( n > 0 ) + { + char* d = dst; + const char* s = src; + d[--n] = '\0';/* nul-terminate string */ + for( ; n > 0; --n ) + { + if( (*d++ = *s++) == '\0' ) + {/* nul-pad remaining bytes */ + while( --n > 0 ) + *d++ = '\0'; + break; + } + } + } + return dst; } /// doesn't crash on null pointer diff --git a/src/common/strlib.h b/src/common/strlib.h index 1ba26ca4c..42034e4c1 100644 --- a/src/common/strlib.h +++ b/src/common/strlib.h @@ -31,7 +31,7 @@ size_t strnlen (const char* string, size_t maxlen); int e_mail_check(char* email); int config_switch(const char* str); -/// always nul-terminates the string +/// strncpy that always nul-terminates the string char* safestrncpy(char* dst, const char* src, size_t n); /// doesn't crash on null pointer |