]> granicus.if.org Git - python/commitdiff
_PyBytesWriter_Alloc(): only use 10 bytes of the small buffer in debug mode to
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 14 Oct 2015 10:02:39 +0000 (12:02 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 14 Oct 2015 10:02:39 +0000 (12:02 +0200)
enhance code to detect buffer under- and overflow.

Objects/bytesobject.c

index 2d4cf4b9ec09bd950666ae1c45c84a14a6cb5333..88106477d2cc1ba0ef4ec249f067b4bdf4920cd3 100644 (file)
@@ -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);