From 6f5ff3f3eb7abc2f4750c1319b560f67faf546ac Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Sat, 12 Aug 2006 01:43:40 +0000 Subject: [PATCH] Klocwork made another run and found a bunch more problems. This is the first batch of fixes that should be easy to verify based on context. This fixes problem numbers: 220 (ast), 323-324 (symtable), 321-322 (structseq), 215 (array), 210 (hotshot), 182 (codecs), 209 (etree). --- Misc/README.klocwork | 4 ++++ Modules/_codecsmodule.c | 3 ++- Modules/_elementtree.c | 2 +- Modules/_hotshot.c | 5 +++++ Modules/arraymodule.c | 4 ++++ Objects/structseq.c | 4 ++++ Python/ast.c | 2 ++ Python/symtable.c | 7 ++++++- 8 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Misc/README.klocwork b/Misc/README.klocwork index a22715ed029..6d2f57fc73a 100644 --- a/Misc/README.klocwork +++ b/Misc/README.klocwork @@ -23,4 +23,8 @@ in addition to any analysis. False positives were also annotated so that the comments can be reviewed and reversed if the analysis was incorrect. +A second run was performed on 10-Aug-2006. The tool was tuned to remove +some false positives and perform some additional checks. ~150 new +warnings were produced, primarily related to dereferencing NULL pointers. + Contact python-dev@python.org for more information. diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c index 405fd7a29ac..4dbceb78be6 100644 --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -192,7 +192,8 @@ escape_encode(PyObject *self, buf = PyString_AS_STRING (str); len = PyString_GET_SIZE (str); memmove(buf, buf+1, len-2); - _PyString_Resize(&str, len-2); + if (_PyString_Resize(&str, len-2) < 0) + return NULL; return codec_tuple(str, PyString_Size(str)); } diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c index b468e71b3d4..c9e524f74cf 100644 --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -809,7 +809,7 @@ element_findtext(ElementObject* self, PyObject* args) PyObject* text = element_get_text(item); if (text == Py_None) return PyString_FromString(""); - Py_INCREF(text); + Py_XINCREF(text); return text; } } diff --git a/Modules/_hotshot.c b/Modules/_hotshot.c index 6d9776f1e65..21bd3839026 100644 --- a/Modules/_hotshot.c +++ b/Modules/_hotshot.c @@ -313,6 +313,11 @@ unpack_string(LogReaderObject *self, PyObject **pvalue) return err; buf = (char *)malloc(len); + if (!buf) { + PyErr_NoMemory(); + return ERR_EXCEPTION; + } + for (i=0; i < len; i++) { ch = fgetc(self->logfp); buf[i] = ch; diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index ba154cae140..14e5e5d2d78 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -702,6 +702,8 @@ array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v) /* Special case "a[i:j] = a" -- copy b first */ int ret; v = array_slice(b, 0, n); + if (!v) + return -1; ret = array_ass_slice(a, ilow, ihigh, v); Py_DECREF(v); return ret; @@ -1708,6 +1710,8 @@ array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value) if (self == av) { value = array_slice(av, 0, av->ob_size); av = (arrayobject*)value; + if (!av) + return -1; } else { Py_INCREF(value); diff --git a/Objects/structseq.c b/Objects/structseq.c index e074810df3a..7ac2a1f61e3 100644 --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -215,6 +215,8 @@ structseq_contains(PyStructSequence *obj, PyObject *o) PyObject *tup; int result; tup = make_tuple(obj); + if (!tup) + return -1; result = PySequence_Contains(tup, o); Py_DECREF(tup); return result; @@ -226,6 +228,8 @@ structseq_hash(PyObject *obj) PyObject *tup; long result; tup = make_tuple((PyStructSequence*) obj); + if (!tup) + return -1; result = PyObject_Hash(tup); Py_DECREF(tup); return result; diff --git a/Python/ast.c b/Python/ast.c index ca832aa5e15..b356192d892 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -2197,6 +2197,8 @@ alias_for_import_name(struct compiling *c, const node *n) } else { alias_ty a = alias_for_import_name(c, CHILD(n, 0)); + if (!a) + return NULL; if (strcmp(STR(CHILD(n, 1)), "as") != 0) { ast_error(n, "must use 'as' in import"); return NULL; diff --git a/Python/symtable.c b/Python/symtable.c index 439a24349df..3e58b5034ed 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -915,6 +915,8 @@ symtable_new_tmpname(struct symtable *st) PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++st->st_cur->ste_tmpname); tmp = PyString_InternFromString(tmpname); + if (!tmp) + return 0; if (!symtable_add_def(st, tmp, DEF_LOCAL)) return 0; Py_DECREF(tmp); @@ -1323,8 +1325,11 @@ symtable_visit_alias(struct symtable *st, alias_ty a) PyObject *name = (a->asname == NULL) ? a->name : a->asname; const char *base = PyString_AS_STRING(name); char *dot = strchr(base, '.'); - if (dot) + if (dot) { store_name = PyString_FromStringAndSize(base, dot - base); + if (!store_name) + return 0; + } else { store_name = name; Py_INCREF(store_name);