summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/ctypes/__init__.py4
-rw-r--r--Lib/ctypes/test/test_memfunctions.py2
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_ctypes/_ctypes.c6
4 files changed, 10 insertions, 5 deletions
diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
index 4ebdb797d7..5937304495 100644
--- a/Lib/ctypes/__init__.py
+++ b/Lib/ctypes/__init__.py
@@ -478,7 +478,7 @@ def cast(obj, typ):
return _cast(obj, obj, typ)
_string_at = CFUNCTYPE(py_object, c_void_p, c_int)(_string_at_addr)
-def string_at(ptr, size=0):
+def string_at(ptr, size=-1):
"""string_at(addr[, size]) -> string
Return the string at addr."""
@@ -490,7 +490,7 @@ except ImportError:
pass
else:
_wstring_at = CFUNCTYPE(py_object, c_void_p, c_int)(_wstring_at_addr)
- def wstring_at(ptr, size=0):
+ def wstring_at(ptr, size=-1):
"""wstring_at(addr[, size]) -> string
Return the string at addr."""
diff --git a/Lib/ctypes/test/test_memfunctions.py b/Lib/ctypes/test/test_memfunctions.py
index fbae2ce175..aef7a739fc 100644
--- a/Lib/ctypes/test/test_memfunctions.py
+++ b/Lib/ctypes/test/test_memfunctions.py
@@ -14,6 +14,7 @@ class MemFunctionsTest(unittest.TestCase):
self.failUnlessEqual(string_at(result), "Hello, World")
self.failUnlessEqual(string_at(result, 5), "Hello")
self.failUnlessEqual(string_at(result, 16), "Hello, World\0\0\0\0")
+ self.failUnlessEqual(string_at(result, 0), "")
def test_memset(self):
a = create_string_buffer(1000000)
@@ -54,6 +55,7 @@ class MemFunctionsTest(unittest.TestCase):
self.failUnlessEqual(wstring_at(a), "Hello, World")
self.failUnlessEqual(wstring_at(a, 5), "Hello")
self.failUnlessEqual(wstring_at(a, 16), "Hello, World\0\0\0\0")
+ self.failUnlessEqual(wstring_at(a, 0), "")
if __name__ == "__main__":
unittest.main()
diff --git a/Misc/NEWS b/Misc/NEWS
index 525c9bd9f0..a5b3fc7998 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -197,6 +197,9 @@ Extension Modules
Library
-------
+- Fix bug #1646630: ctypes.string_at(buf, 0) and ctypes.wstring_at(buf, 0)
+ returned string up to the first NUL character.
+
- Bug #1637850: make_table in difflib did not work with unicode
- Bugs #1676321: the empty() function in sched.py returned the wrong result
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 89c5aaea55..69d3157bcf 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -4531,9 +4531,9 @@ create_comerror(void)
#endif
static PyObject *
-string_at(const char *ptr, Py_ssize_t size)
+string_at(const char *ptr, int size)
{
- if (size == 0)
+ if (size == -1)
return PyString_FromString(ptr);
return PyString_FromStringAndSize(ptr, size);
}
@@ -4618,7 +4618,7 @@ cast(void *ptr, PyObject *src, PyObject *ctype)
static PyObject *
wstring_at(const wchar_t *ptr, int size)
{
- if (size == 0)
+ if (size == -1)
size = wcslen(ptr);
return PyUnicode_FromWideChar(ptr, size);
}