summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-12-28 09:54:22 +0200
committerSerhiy Storchaka <storchaka@gmail.com>2016-12-28 09:54:22 +0200
commit9ae14e605a9b8d6a25a7e2640ef91a499ae479ad (patch)
tree743d5fd8fef0a79ba7dfd13f9fee4246534398e6
parent90bb1052d6d3c6f33da99228af072b27e700a3f6 (diff)
downloadcpython-9ae14e605a9b8d6a25a7e2640ef91a499ae479ad.tar.gz
Issue #29073: bytearray formatting no longer truncates on first null byte.
-rw-r--r--Lib/test/test_format.py7
-rw-r--r--Misc/NEWS2
-rw-r--r--Objects/bytearrayobject.c4
3 files changed, 12 insertions, 1 deletions
diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py
index 0e83a69bff..565bb79d7e 100644
--- a/Lib/test/test_format.py
+++ b/Lib/test/test_format.py
@@ -388,6 +388,13 @@ class FormatTest(unittest.TestCase):
else:
raise TestFailed('"%*d"%(maxsize, -127) should fail')
+ def test_nul(self):
+ # test the null character
+ testcommon("a\0b", (), 'a\0b')
+ testcommon("a%cb", (0,), 'a\0b')
+ testformat("a%sb", ('c\0d',), 'ac\0db')
+ testcommon(b"a%sb", (b'c\0d',), b'ac\0db')
+
def test_non_ascii(self):
testformat("\u20ac=%f", (1.0,), "\u20ac=1.000000")
diff --git a/Misc/NEWS b/Misc/NEWS
index d11136d78e..82f147d6db 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ Release date: TBA
Core and Builtins
-----------------
+- Issue #29073: bytearray formatting no longer truncates on first null byte.
+
- Issue #28932: Do not include <sys/random.h> if it does not exist.
- Issue #28147: Fix a memory leak in split-table dictionaries: setattr()
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index 6d4c6a1b0e..3fad6d80b5 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -283,13 +283,15 @@ bytearray_format(PyByteArrayObject *self, PyObject *args)
{
PyObject *bytes_in, *bytes_out, *res;
char *bytestring;
+ Py_ssize_t bytesize;
if (self == NULL || !PyByteArray_Check(self) || args == NULL) {
PyErr_BadInternalCall();
return NULL;
}
bytestring = PyByteArray_AS_STRING(self);
- bytes_in = PyBytes_FromString(bytestring);
+ bytesize = PyByteArray_GET_SIZE(self);
+ bytes_in = PyBytes_FromStringAndSize(bytestring, bytesize);
if (bytes_in == NULL)
return NULL;
bytes_out = _PyBytes_Format(bytes_in, args);