[Python-checkins] CVS: python/dist/src/Objects stringobject.c,2.55,2.56

Barry A. Warsaw bwarsaw@cnri.reston.va.us
Mon, 6 Mar 2000 09:52:21 -0500 (EST)


Update of /projects/cvsroot/python/dist/src/Objects
In directory anthem:/home/bwarsaw/projects/python/Objects
Modified Files:
	stringobject.c 
Log Message:
string_join(): Fix memory leaks discovered by Charles Waldman (and a
few other paths through the function that leaked).
Index: stringobject.c
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Objects/stringobject.c,v
retrieving revision 2.55
retrieving revision 2.56
diff -C2 -r2.55 -r2.56
*** stringobject.c	2000年02月29日 13:59:28	2.55
--- stringobject.c	2000年03月06日 14:52:18	2.56
***************
*** 710,715 ****
 			slen = PyString_GET_SIZE(sitem);
 			while (reslen + slen + seplen >= sz) {
! 				if (_PyString_Resize(&res, sz*2))
 					goto finally;
 				sz *= 2;
 				p = PyString_AsString(res) + reslen;
--- 710,717 ----
 			slen = PyString_GET_SIZE(sitem);
 			while (reslen + slen + seplen >= sz) {
! 				if (_PyString_Resize(&res, sz*2)) {
! 					Py_DECREF(sitem);
 					goto finally;
+ 				}
 				sz *= 2;
 				p = PyString_AsString(res) + reslen;
***************
*** 721,724 ****
--- 723,727 ----
 			}
 			memcpy(p, PyString_AS_STRING(sitem), slen);
+ 			Py_DECREF(sitem);
 			p += slen;
 			reslen += slen;
***************
*** 729,740 ****
 			PyObject *item = PySequence_GetItem(seq, i);
 			PyObject *sitem;
! 			if (!item || !(sitem = PyObject_Str(item))) {
! 				Py_XDECREF(item);
 				goto finally;
! 			}
 			slen = PyString_GET_SIZE(sitem);
 			while (reslen + slen + seplen >= sz) {
! 				if (_PyString_Resize(&res, sz*2))
 					goto finally;
 				sz *= 2;
 				p = PyString_AsString(res) + reslen;
--- 732,749 ----
 			PyObject *item = PySequence_GetItem(seq, i);
 			PyObject *sitem;
! 
! 			if (!item)
 				goto finally;
! 			sitem = PyObject_Str(item);
! 			Py_DECREF(item);
! 			if (!sitem)
! 				goto finally;
! 
 			slen = PyString_GET_SIZE(sitem);
 			while (reslen + slen + seplen >= sz) {
! 				if (_PyString_Resize(&res, sz*2)) {
! 					Py_DECREF(sitem);
 					goto finally;
+ 				}
 				sz *= 2;
 				p = PyString_AsString(res) + reslen;
***************
*** 746,749 ****
--- 755,759 ----
 			}
 			memcpy(p, PyString_AS_STRING(sitem), slen);
+ 			Py_DECREF(sitem);
 			p += slen;
 			reslen += slen;

AltStyle によって変換されたページ (->オリジナル) /