]> granicus.if.org Git - file/commitdiff
Use memmem to speed up searches if available (Michael Schroeder)
authorChristos Zoulas <christos@zoulas.com>
Wed, 27 Feb 2019 16:52:23 +0000 (16:52 +0000)
committerChristos Zoulas <christos@zoulas.com>
Wed, 27 Feb 2019 16:52:23 +0000 (16:52 +0000)
configure.ac
src/softmagic.c

index ec296aa4db416c2db6d752ad494a57b70c922e50..402f75dd5f3fed652ad32ee80bd538259b7e1d10 100644 (file)
@@ -151,7 +151,7 @@ else
 fi])
 
 dnl Checks for functions
-AC_CHECK_FUNCS(strerror strndup strtoul mkstemp mkostemp utimes utime wcwidth strtof newlocale uselocale freelocale setlocale)
+AC_CHECK_FUNCS(strerror strndup strtoul mkstemp mkostemp utimes utime wcwidth strtof newlocale uselocale freelocale setlocale memmem)
 
 dnl Provide implementation of some required functions if necessary
 AC_REPLACE_FUNCS(getopt_long asprintf vasprintf strlcpy strlcat getline ctime_r asctime_r localtime_r gmtime_r pread strcasestr fmtcheck dprintf)
index cfc1781287fc0fd371912d85f9efe6f1c1f4a454..9999ef6ff09efc553d4fa7960f7a4d68562e61de 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: softmagic.c,v 1.278 2019/02/20 02:35:27 christos Exp $")
+FILE_RCSID("@(#)$File: softmagic.c,v 1.279 2019/02/27 16:52:23 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -2063,6 +2063,29 @@ magiccheck(struct magic_set *ms, struct magic *m)
                slen = MIN(m->vallen, sizeof(m->value.s));
                l = 0;
                v = 0;
+#ifdef HAVE_MEMMEM
+               if (slen > 0 && m->str_flags == 0) {
+                       const char *found;
+                       if (m->str_range != 0
+                           && ms->search.s_len >= m->str_range + slen) {
+                               found = memmem(ms->search.s,
+                                   m->str_range + slen, m->value.s, slen);
+                       } else {
+                               found = memmem(ms->search.s,
+                                   ms->search.s_len, m->value.s, slen);
+                               if (!found)
+                                       return 0;
+                       }
+                       if (!found) {
+                               v = 1;
+                       } else {
+                               idx = found - ms->search.s;
+                               ms->search.offset += idx;
+                               ms->search.rm_len = ms->search.s_len - idx;
+                       }
+                       break;
+               }
+#endif
 
                for (idx = 0; m->str_range == 0 || idx < m->str_range; idx++) {
                        if (slen + idx > ms->search.s_len)