Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 921842f

Browse files
committed
Fixed resizestring() to work if reference tracing is turned on.
The realloc() call would move the list head without fixing the pointers to in the the chain of allocated objects...
1 parent da0c6bd commit 921842f

1 file changed

Lines changed: 13 additions & 6 deletions

File tree

Objects/stringobject.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,24 +296,31 @@ resizestring(pv, newsize)
296296
object **pv;
297297
int newsize;
298298
{
299-
register stringobject *v;
300-
v = (stringobject *) *pv;
299+
register object *v;
300+
register stringobject *sv;
301+
v = *pv;
301302
if (!is_stringobject(v) || v->ob_refcnt != 1) {
302303
*pv = 0;
303304
DECREF(v);
304305
err_badcall();
305306
return -1;
306307
}
308+
/* XXX UNREF/NEWREF interface should be more symmetrical */
309+
#ifdef TRACE_REFS
310+
--ref_total;
311+
#endif
312+
UNREF(v);
307313
*pv = (object *)
308314
realloc((char *)v,
309315
sizeof(stringobject) + newsize * sizeof(char));
310316
if (*pv == NULL) {
311-
DECREF(v);
317+
DEL(v);
312318
err_nomem();
313319
return -1;
314320
}
315-
v = (stringobject *) *pv;
316-
v->ob_size = newsize;
317-
v->ob_sval[newsize] = '\0';
321+
NEWREF(*pv);
322+
sv = (stringobject *) *pv;
323+
sv->ob_size = newsize;
324+
sv->ob_sval[newsize] = '\0';
318325
return 0;
319326
}

0 commit comments

Comments
 (0)