_PyBytesWriter_Alloc(): only use 10 bytes of the small buffer in debug mode to

enhance code to detect buffer under- and overflow.
This commit is contained in:
Victor Stinner 2015-10-14 12:02:39 +02:00
parent f091033b14
commit f6358a7e4c
1 changed files with 13 additions and 1 deletions

View File

@ -4053,8 +4053,20 @@ _PyBytesWriter_Alloc(_PyBytesWriter *writer, Py_ssize_t size)
writer->use_small_buffer = 1; writer->use_small_buffer = 1;
#ifdef Py_DEBUG #ifdef Py_DEBUG
/* the last byte is reserved, it must be '\0' */
writer->allocated = sizeof(writer->small_buffer) - 1; 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; writer->small_buffer[writer->allocated] = 0;
#else #else
writer->allocated = sizeof(writer->small_buffer); writer->allocated = sizeof(writer->small_buffer);