Nmap Development mailing list archives
[PATCH] Rewrite strcasestr()
From: Kris Katterjohn <kjak () ispwest com>
Date: Thu, 02 Mar 2006 20:08:22 -0600
The attached patch simplifies strcasestr() in nbase/nbase_str.c to be similar to our str[n]casecmp() functions. -rwxr-xr-x 1 kjak root 1964705 2006-03-02 19:46 nmap* -rwxr-xr-x 1 kjak root 1964985 2006-03-02 19:38 nmap.orig* -rw-r--r-- 1 kjak root 5104 2006-03-02 19:46 nbase/nbase_str.o -rw-r--r-- 1 kjak root 5320 2006-03-02 19:38 nbase/nbase_str.o.orig I copied my strcasestr() to another file and did like 8 tests and printed the details about the return value from mine and the one in my library (I had to define _GNU_SOURCE to get it). The results all matched, so it seems to work fine and it's smaller than the current one in nmap. In case you're wondering, I undefined HAVE_STRCASESTR when compiling the above when testing, because (I didn't check where) somewhere USE_GNU is defined and gives me my library's strcasestr(). So the above is actually using the current nmap implementation of strcasestr() and mine. I also added an if in there to check for strlen(needle) > strlen(haystack) so the rest won't be executed if we know it won't match; though this probably won't happen much, if at all. I do have one question, though. Why is it okay for strcasestr() to crash if needle is NULL? I just copied it over to my version because there's probably a good reason behind it that I'm not seeing. Thanks, Kris Katterjohn
--- nbase/nbase_str.c.orig 2006-03-02 19:12:06.000000000 -0600
+++ nbase/nbase_str.c 2006-03-02 19:48:09.000000000 -0600
@@ -103,37 +103,40 @@
#include <string.h>
#ifndef HAVE_STRCASESTR
-char *strcasestr(const char *haystack, const char *pneedle) {
-char buf[512];
-unsigned int needlelen;
-const char *p;
-char *needle, *q, *foundto;
-
-/* Should crash if !pneedle -- this is OK */
-if (!*pneedle) return (char *) haystack;
-if (!haystack) return NULL;
-
-needlelen = (unsigned int) strlen(pneedle);
- if (needlelen >= sizeof(buf)) {
- needle = (char *) malloc(needlelen + 1);
- } else needle = buf;
- p = pneedle; q = needle;
- while((*q++ = tolower(*p++)))
- ;
- p = haystack - 1; foundto = needle;
- while(*++p) {
- if(tolower(*p) == *foundto) {
- if(!*++foundto) {
- /* Yeah, we found it */
- if (needlelen >= sizeof(buf))
- free(needle);
- return (char *) (p - needlelen + 1);
- }
- } else foundto = needle;
- }
- if (needlelen >= sizeof(buf))
- free(needle);
- return NULL;
+char *strcasestr(const char *haystack, const char *needle)
+{
+ char *h, *n, *ret;
+ int x;
+
+ if (!haystack)
+ return NULL;
+
+ /* Should crash if !needle -- this is OK */
+ if (!*needle)
+ return (char *) haystack;
+
+ /* needle can't be in haystack if it's longer than it */
+ if (strlen(needle) > strlen(haystack))
+ return NULL;
+
+ h = malloc(strlen(haystack) + 1);
+ n = malloc(strlen(needle) + 1);
+
+ for (x = 0; x < strlen(haystack) + 1; x++)
+ h[x] = tolower(haystack[x]);
+ for (x = 0; x < strlen(needle) + 1; x++)
+ n[x] = tolower(needle[x]);
+
+ ret = strstr(h, n);
+
+ /* If n was found in h, set ret to needle's position in haystack */
+ if (ret)
+ ret = (char *) &haystack[ret - h];
+
+ free(h);
+ free(n);
+
+ return ret;
}
#endif
_______________________________________________ Sent through the nmap-dev mailing list http://cgi.insecure.org/mailman/listinfo/nmap-dev
Current thread:
- [PATCH] Rewrite strcasestr() Kris Katterjohn (Mar 02)
- Re: [PATCH] Rewrite strcasestr() Fyodor (Mar 05)
- Re: [PATCH] Rewrite strcasestr() Kris Katterjohn (Mar 05)
- Re: [PATCH] Rewrite strcasestr() Fyodor (Mar 05)
