diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2010-10-15 16:41:02 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2010-10-15 16:41:02 -0700 |
commit | 94fbd0b8d206102757cecd3dbd67cd701fb70470 (patch) | |
tree | 985134a429fc1bd82d9036dc1400140271ae7639 | |
parent | 7634709500bc97448244a46a06621273d0cac9cc (diff) | |
parent | a66a47e168804aa0a62a3a5810d7f8dd9b647dab (diff) | |
download | syslinux-94fbd0b8d206102757cecd3dbd67cd701fb70470.tar.gz |
Merge remote branch 'liu/master'syslinux-4.03-pre6
-rw-r--r-- | com32/lib/memmem.c | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/com32/lib/memmem.c b/com32/lib/memmem.c index 8558a80d..7c42f1c3 100644 --- a/com32/lib/memmem.c +++ b/com32/lib/memmem.c @@ -18,26 +18,35 @@ void *memmem(const void *haystack, size_t n, const void *needle, size_t m) size_t j, k, l; - if (m > n) - return NULL; + if (m > n || !m || !n) + return NULL; - if (x[0] == x[1]) { - k = 2; - l = 1; - } else { - k = 1; - l = 2; - } + if (1 != m) { + if (x[0] == x[1]) { + k = 2; + l = 1; + } else { + k = 1; + l = 2; + } - j = 0; - while (j <= n - m) { - if (x[1] != y[j + 1]) { - j += k; - } else { - if (!memcmp(x + 2, y + j + 2, m - 2) && x[0] == y[j]) - return (void *)&y[j]; - j += l; - } + j = 0; + while (j <= n - m) { + if (x[1] != y[j + 1]) { + j += k; + } else { + if (!memcmp(x + 2, y + j + 2, m - 2) + && x[0] == y[j]) + return (void *)&y[j]; + j += l; + } + } + } else { + do { + if (*y == *x) + return (void *)y; + y++; + } while (--n); } return NULL; |