Unfortunately, neither the `memmem` nor the `strnstr` functions are part of any C standard but are merely extensions of C that are implemented by e.g. glibc. Thus, there is no standardized way to search for a string in a block of memory with a limited size, and using `strstr` is to be considered unsafe in case where the buffer has not been sanitized. In fact, there are some uses of `strstr` in exactly that unsafe way in our codebase. Provide a new function `git__memmem` that implements the `memmem` semantics. That is in a given haystack of `n` bytes, search for the occurrence of a byte sequence of `m` bytes and return a pointer to the first occurrence. The implementation chosen is the "Not So Naive" algorithm from [1]. It was chosen as the implementation is comparably simple while still being reasonably efficient in most cases. Preprocessing happens in constant time and space, searching has a time complexity of O(n*m) with a slightly sub-linear average case. [1]: http://www-igm.univ-mlv.fr/~lecroq/string/ (cherry picked from commit 83e8a6b3)
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| array.c | Loading commit data... | |
| bitvec.c | Loading commit data... | |
| buffer.c | Loading commit data... | |
| copy.c | Loading commit data... | |
| dirent.c | Loading commit data... | |
| encoding.c | Loading commit data... | |
| env.c | Loading commit data... | |
| errors.c | Loading commit data... | |
| features.c | Loading commit data... | |
| filebuf.c | Loading commit data... | |
| ftruncate.c | Loading commit data... | |
| futils.c | Loading commit data... | |
| hex.c | Loading commit data... | |
| iconv.c | Loading commit data... | |
| init.c | Loading commit data... | |
| link.c | Loading commit data... | |
| memmem.c | Loading commit data... | |
| mkdir.c | Loading commit data... | |
| oid.c | Loading commit data... | |
| oidmap.c | Loading commit data... | |
| opts.c | Loading commit data... | |
| path.c | Loading commit data... | |
| pool.c | Loading commit data... | |
| posix.c | Loading commit data... | |
| pqueue.c | Loading commit data... | |
| rmdir.c | Loading commit data... | |
| sha1.c | Loading commit data... | |
| sortedcache.c | Loading commit data... | |
| stat.c | Loading commit data... | |
| stream.c | Loading commit data... | |
| string.c | Loading commit data... | |
| strmap.c | Loading commit data... | |
| strtol.c | Loading commit data... | |
| structinit.c | Loading commit data... | |
| useragent.c | Loading commit data... | |
| vector.c | Loading commit data... | |
| zstream.c | Loading commit data... |