]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-129813, PEP 782: Set invalid bytes in PyBytesWriter (#139054)
authorVictor Stinner <vstinner@python.org>
Wed, 17 Sep 2025 15:58:32 +0000 (16:58 +0100)
committerGitHub <noreply@github.com>
Wed, 17 Sep 2025 15:58:32 +0000 (17:58 +0200)
Initialize the buffer with 0xFF byte pattern when creating a writer
object, but also when resizing/growing the writer.

Objects/bytesobject.c

index 0fd7983d51e0e7216a7e851743cb7af53ee5b1bc..cd314fdd5b1e14a5cc26389f71aefa09d4d98734 100644 (file)
@@ -3805,12 +3805,12 @@ byteswriter_resize(PyBytesWriter *writer, Py_ssize_t size, int overallocate)
 {
     assert(size >= 0);
 
-    if (size <= byteswriter_allocated(writer)) {
+    Py_ssize_t old_allocated = byteswriter_allocated(writer);
+    if (size <= old_allocated) {
         return 0;
     }
 
-    overallocate &= writer->overallocate;
-    if (overallocate) {
+    if (overallocate & writer->overallocate) {
         if (size <= (PY_SSIZE_T_MAX - size / OVERALLOCATE_FACTOR)) {
             size += size / OVERALLOCATE_FACTOR;
         }
@@ -3849,6 +3849,15 @@ byteswriter_resize(PyBytesWriter *writer, Py_ssize_t size, int overallocate)
                writer->small_buffer,
                sizeof(writer->small_buffer));
     }
+
+#ifdef Py_DEBUG
+    Py_ssize_t allocated = byteswriter_allocated(writer);
+    if (overallocate && allocated > old_allocated) {
+        memset(byteswriter_data(writer) + old_allocated, 0xff,
+               allocated - old_allocated);
+    }
+#endif
+
     return 0;
 }
 
@@ -3869,9 +3878,6 @@ byteswriter_create(Py_ssize_t size, int use_bytearray)
             return NULL;
         }
     }
-#ifdef Py_DEBUG
-    memset(writer->small_buffer, 0xff, sizeof(writer->small_buffer));
-#endif
     writer->obj = NULL;
     writer->size = 0;
     writer->use_bytearray = use_bytearray;
@@ -3884,6 +3890,9 @@ byteswriter_create(Py_ssize_t size, int use_bytearray)
         }
         writer->size = size;
     }
+#ifdef Py_DEBUG
+    memset(byteswriter_data(writer), 0xff, byteswriter_allocated(writer));
+#endif
     return writer;
 }