Check returned pointer is valid.

Klocwork #233
This commit is contained in:
Neal Norwitz 2006-08-12 02:06:34 +00:00
parent b45f351832
commit 6b4953fd3d
5 changed files with 28 additions and 2 deletions

View File

@ -123,6 +123,7 @@ option '-uall,-bsddb'.
import os import os
import sys import sys
import signal
import getopt import getopt
import random import random
import warnings import warnings
@ -289,6 +290,12 @@ def main(tests=None, testdir=None, verbose=0, quiet=False, generate=False,
if single and fromfile: if single and fromfile:
usage(2, "-s and -f don't go together!") usage(2, "-s and -f don't go together!")
def handle_signal(*args):
raise RuntimeError('signal received %s' % args)
# Provide a traceback if we are terminated.
signal.signal(signal.SIGTERM, handle_signal)
good = [] good = []
bad = [] bad = []
skipped = [] skipped = []

View File

@ -105,6 +105,12 @@ CField_FromDesc(PyObject *desc, int index,
StgDictObject *idict; StgDictObject *idict;
if (adict && adict->proto) { if (adict && adict->proto) {
idict = PyType_stgdict(adict->proto); idict = PyType_stgdict(adict->proto);
if (!idict) {
PyErr_SetString(PyExc_TypeError,
"has no _stginfo_");
Py_DECREF(self);
return NULL;
}
if (idict->getfunc == getentry("c")->getfunc) { if (idict->getfunc == getentry("c")->getfunc) {
struct fielddesc *fd = getentry("s"); struct fielddesc *fd = getentry("s");
getfunc = fd->getfunc; getfunc = fd->getfunc;

View File

@ -486,9 +486,10 @@ function_call(PyObject *func, PyObject *arg, PyObject *kw)
Py_ssize_t nk, nd; Py_ssize_t nk, nd;
argdefs = PyFunction_GET_DEFAULTS(func); argdefs = PyFunction_GET_DEFAULTS(func);
/* XXX(nnorwitz): don't we know argdefs is either NULL or a tuple? */
if (argdefs != NULL && PyTuple_Check(argdefs)) { if (argdefs != NULL && PyTuple_Check(argdefs)) {
d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0); d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
nd = PyTuple_Size(argdefs); nd = PyTuple_GET_SIZE(argdefs);
} }
else { else {
d = NULL; d = NULL;
@ -517,7 +518,7 @@ function_call(PyObject *func, PyObject *arg, PyObject *kw)
result = PyEval_EvalCodeEx( result = PyEval_EvalCodeEx(
(PyCodeObject *)PyFunction_GET_CODE(func), (PyCodeObject *)PyFunction_GET_CODE(func),
PyFunction_GET_GLOBALS(func), (PyObject *)NULL, PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
&PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg), &PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg),
k, nk, d, nd, k, nk, d, nd,
PyFunction_GET_CLOSURE(func)); PyFunction_GET_CLOSURE(func));

View File

@ -229,6 +229,15 @@ PyEval_InitThreads(void)
main_thread = PyThread_get_thread_ident(); main_thread = PyThread_get_thread_ident();
} }
void
_PyEval_FiniThreads(void)
{
if (interpreter_lock)
PyThread_free_lock(interpreter_lock);
interpreter_lock = 0;
main_thread = 0;
}
void void
PyEval_AcquireLock(void) PyEval_AcquireLock(void)
{ {

View File

@ -60,6 +60,7 @@ static void call_sys_exitfunc(void);
static void call_ll_exitfuncs(void); static void call_ll_exitfuncs(void);
extern void _PyUnicode_Init(void); extern void _PyUnicode_Init(void);
extern void _PyUnicode_Fini(void); extern void _PyUnicode_Fini(void);
extern void _PyEval_FiniThreads(void);
#ifdef WITH_THREAD #ifdef WITH_THREAD
extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);
@ -461,6 +462,8 @@ Py_Finalize(void)
_PyUnicode_Fini(); _PyUnicode_Fini();
#endif #endif
_PyEval_FiniThreads();
/* XXX Still allocated: /* XXX Still allocated:
- various static ad-hoc pointers to interned strings - various static ad-hoc pointers to interned strings
- int and float free list blocks - int and float free list blocks