From c72ffe71f1f1ba521bd716d83f76242bdf94ea18 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 17 Sep 2025 16:58:32 +0100 Subject: [PATCH] gh-129813, PEP 782: Set invalid bytes in PyBytesWriter (#139054) Initialize the buffer with 0xFF byte pattern when creating a writer object, but also when resizing/growing the writer. --- Objects/bytesobject.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 0fd7983d51e0..cd314fdd5b1e 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -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; } -- 2.47.3