Переглянути джерело

* Fixed safestrncpy trashing the memory before dst when n == 0. (since r10667, bugreport:2996)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13681 54d463be-8e91-2dee-dedb-b68131a5f0ec
FlavioJS 16 роки тому
батько
коміт
653ddafa5c
3 змінених файлів з 20 додано та 7 видалено
  1. 2 0
      Changelog-Trunk.txt
  2. 17 6
      src/common/strlib.c
  3. 1 1
      src/common/strlib.h

+ 2 - 0
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

+ 17 - 6
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

+ 1 - 1
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