Skip to content

Commit 276c315

Browse files
committed
Add test_grow_error()
PyBytesWriter_Grow() no longer calls byteswriter_resize() if grow is smaller than 0.
1 parent e029931 commit 276c315

2 files changed

Lines changed: 39 additions & 18 deletions

File tree

‎Lib/test/test_capi/test_bytes.py‎

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,26 @@ def test_resize_canary(self):
473473
self.assertEqual(writer.get_data(), b'')
474474
self.assertEqual(writer.finish(), b'')
475475

476+
@support.nomemtest
477+
def test_resize_error(self):
478+
# Test PyBytesWriter_Resize() error
479+
init = b'x' * self.LARGE_BUFFER
480+
writer = self.create_writer(len(init))
481+
writer.write(0, init)
482+
size = len(init) + 100
483+
try:
484+
with self.assertRaises(MemoryError):
485+
_testcapi.set_nomemory(0)
486+
writer.resize(size)
487+
finally:
488+
_testcapi.remove_mem_hooks()
489+
suffix = b'still working'
490+
writer.write_bytes(suffix, -1)
491+
self.assertEqual(writer.finish(), init + suffix)
492+
493+
# Note: PyBytesWriter_Resize() leaves the buffer unchanged (no resize)
494+
# if the new size is smaller than the allocated size
495+
476496
def test_grow(self):
477497
# Test PyBytesWriter_Grow()
478498
writer = self.create_writer(0)
@@ -533,26 +553,24 @@ def test_grow_canary(self):
533553
self.assertEqual(writer.get_data(), b'')
534554
self.assertEqual(writer.finish(), b'')
535555

536-
537556
@support.nomemtest
538-
def test_resize_error(self):
539-
# Test PyBytesWriter_Resize() error
557+
def test_grow_error(self):
558+
# Test PyBytesWriter_Grow() error
540559
init = b'x' * self.LARGE_BUFFER
541560
writer = self.create_writer(len(init))
542561
writer.write(0, init)
543-
size = len(init) + 100
544562
try:
545563
with self.assertRaises(MemoryError):
546564
_testcapi.set_nomemory(0)
547-
writer.resize(size)
565+
writer.grow(100)
548566
finally:
549567
_testcapi.remove_mem_hooks()
550568
suffix = b'still working'
551569
writer.write_bytes(suffix, -1)
552570
self.assertEqual(writer.finish(), init + suffix)
553571

554-
# Note: PyBytesWriter_Resize() leaves the buffer unchanged (no resize)
555-
# if the new size is smaller than the allocated size
572+
# Note: PyBytesWriter_Grow() leaves the buffer unchanged (no resize)
573+
# if grow is negative.
556574

557575
def test_format_i(self):
558576
# Test PyBytesWriter_Format()

‎Objects/bytesobject.c‎

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3883,21 +3883,21 @@ PyBytesWriter_GetSize(PyBytesWriter *writer)
38833883

38843884

38853885
int
3886-
PyBytesWriter_Resize(PyBytesWriter *writer, Py_ssize_t size)
3886+
PyBytesWriter_Resize(PyBytesWriter *writer, Py_ssize_t new_size)
38873887
{
3888-
if (size < 0) {
3888+
if (new_size < 0) {
38893889
PyErr_SetString(PyExc_ValueError, "size must be >= 0");
38903890
return -1;
38913891
}
3892-
if (writer->size < size) {
3893-
if (byteswriter_resize(writer, size, 1) < 0) {
3892+
if (writer->size < new_size) {
3893+
if (byteswriter_resize(writer, new_size, 1) < 0) {
38943894
return -1;
38953895
}
38963896
}
38973897
else {
38983898
// The buffer is already large enough. Never shrink the buffer.
38993899
}
3900-
writer->size = size;
3900+
writer->size = new_size;
39013901
#ifdef Py_DEBUG
39023902
byteswriter_write_canary_byte(writer);
39033903
#endif
@@ -3925,24 +3925,27 @@ PyBytesWriter_Grow(PyBytesWriter *writer, Py_ssize_t grow)
39253925
return 0;
39263926
}
39273927

3928-
if (grow >= 0) {
3928+
if (grow > 0) {
39293929
if (grow > PY_SSIZE_T_MAX - writer->size) {
39303930
PyErr_NoMemory();
39313931
return -1;
39323932
}
3933+
Py_ssize_t new_size = writer->size + grow;
3934+
3935+
if (byteswriter_resize(writer, new_size, 1) < 0) {
3936+
return -1;
3937+
}
3938+
writer->size = new_size;
39333939
}
39343940
else {
39353941
if (writer->size + grow < 0) {
39363942
PyErr_SetString(PyExc_ValueError, "invalid size");
39373943
return -1;
39383944
}
3945+
// The buffer is already large enough. Never shrink the buffer.
3946+
writer->size = writer->size + grow;
39393947
}
3940-
Py_ssize_t size = writer->size + grow;
39413948

3942-
if (byteswriter_resize(writer, size, 1) < 0) {
3943-
return -1;
3944-
}
3945-
writer->size = size;
39463949
#ifdef Py_DEBUG
39473950
byteswriter_write_canary_byte(writer);
39483951
#endif

0 commit comments

Comments
 (0)