summaryrefslogtreecommitdiff
path: root/src/common/strlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/strlib.c')
-rw-r--r--src/common/strlib.c23
1 files changed, 17 insertions, 6 deletions
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