From: Victor Stinner Date: Wed, 17 Sep 2025 15:58:32 +0000 (+0100) Subject: gh-129813, PEP 782: Set invalid bytes in PyBytesWriter (#139054) X-Git-Tag: v3.15.0a1~302 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c72ffe71f1f1ba521bd716d83f76242bdf94ea18;p=thirdparty%2FPython%2Fcpython.git 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. --- 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; }