[Python-checkins] python/nondist/sandbox/datetime obj_date.c,1.35,1.36 obj_datetime.c,1.28,1.29

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
2002年12月06日 19:12:59 -0800


Update of /cvsroot/python/python/nondist/sandbox/datetime
In directory sc8-pr-cvs1:/tmp/cvs-serv4101
Modified Files:
	obj_date.c obj_datetime.c 
Log Message:
Fixed leaks in the date and datetime picklers. Along with the leaks in
Python that got fixed, there are no leaks visible now in the Python or
C implementations.
Also reworked all the pickle support functions to raise errors when
their arguments suck, instead of just asserting they're correct. While
these are intended to be module-private functions, there's really nothing
to stop a user from calling them.
Index: obj_date.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/obj_date.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -C2 -d -r1.35 -r1.36
*** obj_date.c	6 Dec 2002 17:20:58 -0000	1.35
--- obj_date.c	7 Dec 2002 03:12:57 -0000	1.36
***************
*** 435,440 ****
 	unsigned char *pdata = (unsigned char*)PyString_AsString(state);
 
! 	assert(len == _PyDateTime_DATE_DATA_SIZE);
! 
 	memcpy(self->data, pdata, _PyDateTime_DATE_DATA_SIZE);
 	self->hashcode = -1;
--- 435,444 ----
 	unsigned char *pdata = (unsigned char*)PyString_AsString(state);
 
! 	if (! PyString_Check(state) ||
! 	 len != _PyDateTime_DATE_DATA_SIZE) {
! 		PyErr_SetString(PyExc_TypeError,
! 				"bad argument to date.__setstate__");
! 		return NULL;
! 	}
 	memcpy(self->data, pdata, _PyDateTime_DATE_DATA_SIZE);
 	self->hashcode = -1;
***************
*** 451,458 ****
 	PyObject *result = NULL;
 
! 	assert(date->ob_type == &PyDateTime_DateType);
 	state = date_getstate(date);
! 	if (state)
 		result = Py_BuildValue("O(O)", date_unpickler_object, state);
 	return result;
 }
--- 455,469 ----
 	PyObject *result = NULL;
 
! 	if (date->ob_type != &PyDateTime_DateType) {
! 		PyErr_Format(PyExc_TypeError,
! 			 "bad type passed to date pickler: %s",
! 			 date->ob_type->tp_name);
! 		return NULL;
! 	}
 	state = date_getstate(date);
! 	if (state) {
 		result = Py_BuildValue("O(O)", date_unpickler_object, state);
+ 		Py_DECREF(state);
+ 	}
 	return result;
 }
***************
*** 464,468 ****
 
 	if (! PyString_CheckExact(arg)) {
! 		PyErr_BadInternalCall();
 		return NULL;
 	}
--- 475,481 ----
 
 	if (! PyString_CheckExact(arg)) {
! 		PyErr_Format(PyExc_TypeError,
! 			 "bad type passed to date unpickler: %s",
! 			 arg->ob_type->tp_name);
 		return NULL;
 	}
Index: obj_datetime.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/obj_datetime.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -C2 -d -r1.28 -r1.29
*** obj_datetime.c	6 Dec 2002 21:03:09 -0000	1.28
--- obj_datetime.c	7 Dec 2002 03:12:57 -0000	1.29
***************
*** 497,502 ****
 	unsigned char *pdata = (unsigned char*)PyString_AsString(state);
 
! 	assert(len == _PyDateTime_DATETIME_DATA_SIZE);
! 
 	memcpy(self->data, pdata, _PyDateTime_DATETIME_DATA_SIZE);
 	self->hashcode = -1;
--- 497,506 ----
 	unsigned char *pdata = (unsigned char*)PyString_AsString(state);
 
! 	if (! PyString_Check(state) ||
! 	 len != _PyDateTime_DATETIME_DATA_SIZE) {
! 		PyErr_SetString(PyExc_TypeError,
! 				"bad argument to datetime.__setstate__");
! 		return NULL;
! 	}
 	memcpy(self->data, pdata, _PyDateTime_DATETIME_DATA_SIZE);
 	self->hashcode = -1;
***************
*** 513,522 ****
 	PyObject *result = NULL;
 
! 	assert(datetime->ob_type == &PyDateTime_DateTimeType);
 	state = datetime_getstate(datetime);
! 	if (state)
 		result = Py_BuildValue("O(O)",
 				 datetime_unpickler_object,
 				 state);
 	return result;
 }
--- 517,533 ----
 	PyObject *result = NULL;
 
! 	if (datetime->ob_type != &PyDateTime_DateTimeType) {
! 		PyErr_Format(PyExc_TypeError,
! 			 "bad type passed to datetime pickler: %s",
! 			 datetime->ob_type->tp_name);
! 		return NULL;
! 	}
 	state = datetime_getstate(datetime);
! 	if (state) {
 		result = Py_BuildValue("O(O)",
 				 datetime_unpickler_object,
 				 state);
+ 		Py_DECREF(state);
+ 	}
 	return result;
 }
***************
*** 528,532 ****
 
 	if (! PyString_CheckExact(arg)) {
! 		PyErr_BadInternalCall();
 		return NULL;
 	}
--- 539,545 ----
 
 	if (! PyString_CheckExact(arg)) {
! 		PyErr_Format(PyExc_TypeError,
! 			 "bad type passed to datetime unpickler: %s",
! 			 arg->ob_type->tp_name);
 		return NULL;
 	}

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