SF bug 515943: searching for data with \0 in mmap.

mmap_find_method():  this obtained the string to find via s#, but it
ignored its length, acting as if it were \0-terminated instead.

Someone please run on Linux too (the extended test_mmap works on Windows).

Bugfix candidate.
This commit is contained in:
Tim Peters 2002-03-08 05:43:32 +00:00
parent 02d2212c8e
commit c9ffa068d1
2 changed files with 30 additions and 9 deletions

View File

@ -244,6 +244,31 @@ def test_both():
except OSError: except OSError:
pass pass
# Do a tougher .find() test. SF bug 515943 pointed out that, in 2.2,
# searching for data with embedded \0 bytes didn't work.
f = open(TESTFN, 'w+')
try: # unlink TESTFN no matter what
data = 'aabaac\x00deef\x00\x00aa\x00'
n = len(data)
f.write(data)
m = mmap.mmap(f.fileno(), n)
f.close()
for start in range(n+1):
for finish in range(start, n+1):
slice = data[start : finish]
vereq(m.find(slice), data.find(slice))
vereq(m.find(slice + 'x'), -1)
finally:
try:
os.unlink(TESTFN)
except OSError:
pass
print ' Test passed' print ' Test passed'
test_both() test_both()

View File

@ -251,20 +251,16 @@ mmap_find_method(mmap_object *self,
start = 0; start = 0;
else if ((size_t)start > self->size) else if ((size_t)start > self->size)
start = self->size; start = self->size;
p = self->data + start;
while (p < e) { for (p = self->data + start; p + len <= e; ++p) {
char *s = p; int i;
char *n = needle; for (i = 0; i < len && needle[i] == p[i]; ++i)
while ((s<e) && (*n) && !(*s-*n)) { /* nothing */;
s++, n++; if (i == len) {
}
if (!*n) {
return Py_BuildValue ( return Py_BuildValue (
"l", "l",
(long) (p - self->data)); (long) (p - self->data));
} }
p++;
} }
return Py_BuildValue ("l", (long) -1); return Py_BuildValue ("l", (long) -1);
} }