[Python-checkins] CVS: python/dist/src/Objects abstract.c,2.94,2.95 object.c,2.162,2.163
Guido van Rossum
gvanrossum@users.sourceforge.net
Fri, 01 Mar 2002 14:23:55 -0800
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv29045
Modified Files:
abstract.c object.c
Log Message:
SF patch 514641 (Naofumi Honda) - Negative ob_size of LongObjects
Due to the bizarre definition of _PyLong_Copy(), creating an instance
of a subclass of long with a negative value could cause core dumps
later on. Unfortunately it looks like the behavior of _PyLong_Copy()
is quite intentional, so the fix is more work than feels comfortable.
This fix is almost, but not quite, the code that Naofumi Honda added;
in addition, I added a test case.
Index: abstract.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/abstract.c,v
retrieving revision 2.94
retrieving revision 2.95
diff -C2 -d -r2.94 -r2.95
*** abstract.c 5 Jan 2002 10:50:30 -0000 2.94
--- abstract.c 1 Mar 2002 22:23:53 -0000 2.95
***************
*** 934,939 ****
return o;
}
! if (PyLong_Check(o))
! return _PyLong_Copy((PyLongObject *)o);
if (PyString_Check(o))
/* need to do extra error checking that PyLong_FromString()
--- 934,947 ----
return o;
}
! if (PyLong_Check(o)) {
! PyObject *res;
!
! res = _PyLong_Copy((PyLongObject *)o);
! if (res != NULL)
! ((PyLongObject *)res)->ob_size =
! ((PyLongObject *)o)->ob_size;
!
! return res;
! }
if (PyString_Check(o))
/* need to do extra error checking that PyLong_FromString()
Index: object.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/object.c,v
retrieving revision 2.162
retrieving revision 2.163
diff -C2 -d -r2.162 -r2.163
*** object.c 4 Dec 2001 15:54:53 -0000 2.162
--- object.c 1 Mar 2002 22:23:53 -0000 2.163
***************
*** 1192,1197 ****
return NULL;
if (dictoffset < 0) {
! const size_t size = _PyObject_VAR_SIZE(tp,
! ((PyVarObject *)obj)->ob_size);
dictoffset += (long)size;
assert(dictoffset > 0);
--- 1192,1203 ----
return NULL;
if (dictoffset < 0) {
! int tsize;
! size_t size;
!
! tsize = ((PyVarObject *)obj)->ob_size;
! if (tsize < 0)
! tsize = -tsize;
! size = _PyObject_VAR_SIZE(tp, tsize);
!
dictoffset += (long)size;
assert(dictoffset > 0);