@@ -554,25 +554,17 @@ parse_save_field(ReaderObj *self)
554554static int
555555parse_grow_buff (ReaderObj * self )
556556{
557- if (self -> field_size == 0 ) {
558- self -> field_size = 4096 ;
559- if (self -> field != NULL )
560- PyMem_Free (self -> field );
561- self -> field = PyMem_New (Py_UCS4 , self -> field_size );
562- }
563- else {
564- Py_UCS4 * field = self -> field ;
565- if (self -> field_size > PY_SSIZE_T_MAX / 2 ) {
566- PyErr_NoMemory ();
567- return 0 ;
568- }
569- self -> field_size *= 2 ;
570- self -> field = PyMem_Resize (field , Py_UCS4 , self -> field_size );
571- }
572- if (self -> field == NULL ) {
557+ assert ((size_t )self -> field_size <= PY_SSIZE_T_MAX / sizeof (Py_UCS4 ));
558+
559+ Py_ssize_t field_size_new = self -> field_size ? 2 * self -> field_size : 4096 ;
560+ Py_UCS4 * field_new = self -> field ;
561+ PyMem_Resize (field_new , Py_UCS4 , field_size_new );
562+ if (field_new == NULL ) {
573563 PyErr_NoMemory ();
574564 return 0 ;
575565 }
566+ self -> field = field_new ;
567+ self -> field_size = field_size_new ;
576568 return 1 ;
577569}
578570
@@ -1088,31 +1080,18 @@ join_append_data(WriterObj *self, unsigned int field_kind, void *field_data,
10881080static int
10891081join_check_rec_size (WriterObj * self , Py_ssize_t rec_len )
10901082{
1091-
1092- if (rec_len < 0 || rec_len > PY_SSIZE_T_MAX - MEM_INCR ) {
1093- PyErr_NoMemory ();
1094- return 0 ;
1095- }
1083+ assert (rec_len >= 0 );
10961084
10971085 if (rec_len > self -> rec_size ) {
1098- if (self -> rec_size == 0 ) {
1099- self -> rec_size = (rec_len / MEM_INCR + 1 ) * MEM_INCR ;
1100- if (self -> rec != NULL )
1101- PyMem_Free (self -> rec );
1102- self -> rec = PyMem_New (Py_UCS4 , self -> rec_size );
1103- }
1104- else {
1105- Py_UCS4 * old_rec = self -> rec ;
1106-
1107- self -> rec_size = (rec_len / MEM_INCR + 1 ) * MEM_INCR ;
1108- self -> rec = PyMem_Resize (old_rec , Py_UCS4 , self -> rec_size );
1109- if (self -> rec == NULL )
1110- PyMem_Free (old_rec );
1111- }
1112- if (self -> rec == NULL ) {
1086+ size_t rec_size_new = (size_t )(rec_len / MEM_INCR + 1 ) * MEM_INCR ;
1087+ Py_UCS4 * rec_new = self -> rec ;
1088+ PyMem_Resize (rec_new , Py_UCS4 , rec_size_new );
1089+ if (rec_new == NULL ) {
11131090 PyErr_NoMemory ();
11141091 return 0 ;
11151092 }
1093+ self -> rec = rec_new ;
1094+ self -> rec_size = (Py_ssize_t )rec_size_new ;
11161095 }
11171096 return 1 ;
11181097}
0 commit comments