summaryrefslogtreecommitdiff
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-10-14 12:02:39 +0200
committerVictor Stinner <victor.stinner@gmail.com>2015-10-14 12:02:39 +0200
commit78bbe496aea0f410047563b0a7952c395d4d4706 (patch)
treef71fd7d58afd114ed9419b7cfb5437e6d5be45d2 /Objects
parent47e00fb4590ae2c64ec02a77a20af8130173b27d (diff)
downloadcpython-78bbe496aea0f410047563b0a7952c395d4d4706.tar.gz
_PyBytesWriter_Alloc(): only use 10 bytes of the small buffer in debug mode to
enhance code to detect buffer under- and overflow.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/bytesobject.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 2d4cf4b9ec..88106477d2 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -4053,8 +4053,20 @@ _PyBytesWriter_Alloc(_PyBytesWriter *writer, Py_ssize_t size)
writer->use_small_buffer = 1;
#ifdef Py_DEBUG
- /* the last byte is reserved, it must be '\0' */
writer->allocated = sizeof(writer->small_buffer) - 1;
+ /* In debug mode, don't use the full small buffer because it is less
+ efficient than bytes and bytearray objects to detect buffer underflow
+ and buffer overflow. Use 10 bytes of the small buffer to test also
+ code using the smaller buffer in debug mode.
+
+ Don't modify the _PyBytesWriter structure (use a shorter small buffer)
+ in debug mode to also be able to detect stack overflow when running
+ tests in debug mode. The _PyBytesWriter is large (more than 512 bytes),
+ if Py_EnterRecursiveCall() is not used in deep C callback, we may hit a
+ stack overflow. */
+ writer->allocated = Py_MIN(writer->allocated, 10);
+ /* _PyBytesWriter_CheckConsistency() requires the last byte to be 0,
+ to detect buffer overflow */
writer->small_buffer[writer->allocated] = 0;
#else
writer->allocated = sizeof(writer->small_buffer);