summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-02-01 19:19:26 +0000
committerultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-02-01 19:19:26 +0000
commite38f00cc342543973a5a1faaa2db067f63dcb9e4 (patch)
treebeb73be04d5d40fa20e453de040679bd65468e97
parent293439505d1fef24ca1596ee034d1897dc30ae0b (diff)
downloadhercules-e38f00cc342543973a5a1faaa2db067f63dcb9e4.tar.gz
hercules-e38f00cc342543973a5a1faaa2db067f63dcb9e4.tar.bz2
hercules-e38f00cc342543973a5a1faaa2db067f63dcb9e4.tar.xz
hercules-e38f00cc342543973a5a1faaa2db067f63dcb9e4.zip
Added string function strnlen
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9761 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r--Changelog-Trunk.txt4
-rw-r--r--src/common/strlib.c10
-rw-r--r--src/common/strlib.h5
3 files changed, 19 insertions, 0 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 8897f4c72..0bbc4bea6 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,10 @@ 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/02/01
+ * Added string function strnlen [ultramage]
+ - This thing is useful for removing potential out-of-bounds crashes.
+ Had to #ifdef it because some systems implement it, some don't provide
+ the header, and some don't have it at all. Adjust/improve as neccessary.
* Corrected homunculus's aspd being halved after using some aspd adjusting
skill.
* Removed the log info message 'created homunc...', and the 'loaded homunc'
diff --git a/src/common/strlib.c b/src/common/strlib.c
index 60ea266db..440a07742 100644
--- a/src/common/strlib.c
+++ b/src/common/strlib.c
@@ -192,3 +192,13 @@ char *_strtok_r(char *s1, const char *s2, char **lasts)
return ret;
}
#endif
+
+#if !defined(WIN32) || (defined(_MSC_VER) && _MSC_VER < 1400)
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+size_t strnlen (const char* string, size_t maxlen)
+{
+ const char* end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
+#endif
diff --git a/src/common/strlib.h b/src/common/strlib.h
index d3b9a1dec..f242b5cc4 100644
--- a/src/common/strlib.h
+++ b/src/common/strlib.h
@@ -21,4 +21,9 @@ char *_strtok_r(char *s1, const char *s2, char **lasts);
int remove_control_chars(unsigned char *);
char *trim(char *str, const char *delim);
const char *stristr(const char *haystack, const char *needle);
+
+#if !defined(WIN32) || (defined(_MSC_VER) && _MSC_VER < 1400)
+size_t strnlen (const char* string, size_t maxlen);
+#endif
+
#endif