mirror of https://github.com/python/cpython
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:
parent
02d2212c8e
commit
c9ffa068d1
|
@ -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()
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue