]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #29073: bytearray formatting no longer truncates on first null byte.
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 28 Dec 2016 07:54:22 +0000 (09:54 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 28 Dec 2016 07:54:22 +0000 (09:54 +0200)
Lib/test/test_format.py
Misc/NEWS
Objects/bytearrayobject.c

index 0e83a69bff05c1ccf593f86dad07a1656a6beaf5..565bb79d7ee29a342f31fe9e171138e5adcb2bd4 100644 (file)
@@ -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")
 
index d11136d78e82c11b33d3e637c46f474e9f65e5e3..82f147d6dbd82be86f10ce9403bdb8aa61848291 100644 (file)
--- 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()
index 6d4c6a1b0e68f144d945864c2094bd05c4751aee..3fad6d80b59e5a717b8a4cb55c76de52ea27cdf5 100644 (file)
@@ -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);