Fix:
* crashes on memory allocation failure found with failmalloc
* memory leaks found with valgrind
* compiler warnings in opt mode which would lead to invalid memory reads
* problem using wrong name in decimal module reported by pychecker
Update the valgrind suppressions file with new leaks that are small/one-time
leaks we don't care about (ie, they are too hard to fix).
TBR=barry
TESTED=./python -E -tt ./Lib/test/regrtest.py -uall (both debug and opt modes)
in opt mode:
valgrind -q --leak-check=yes --suppressions=Misc/valgrind-python.supp \
./python -E -tt ./Lib/test/regrtest.py -uall,-bsddb,-compiler \
-x test_logging test_ssl test_multiprocessing
valgrind -q --leak-check=yes --suppressions=Misc/valgrind-python.supp \
./python -E -tt ./Lib/test/regrtest.py test_multiprocessing
for i in `seq 1 4000` ; do
LD_PRELOAD=~/local/lib/libfailmalloc.so FAILMALLOC_INTERVAL=$i \
./python -c pass
done
At least some of these fixes should probably be backported to 2.5.
diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c
index cd38ecd..dabf9f1 100644
--- a/Modules/_ctypes/stgdict.c
+++ b/Modules/_ctypes/stgdict.c
@@ -416,6 +416,7 @@
ffi_ofs = 0;
}
+ assert(stgdict->format == NULL);
if (isStruct && !isPacked) {
stgdict->format = alloc_format_string(NULL, "T{");
} else {
@@ -539,7 +540,9 @@
#undef realdict
if (isStruct && !isPacked) {
+ char *ptr = stgdict->format;
stgdict->format = alloc_format_string(stgdict->format, "}");
+ PyMem_Free(ptr);
if (stgdict->format == NULL)
return -1;
}
diff --git a/Modules/_fileio.c b/Modules/_fileio.c
index 58462dd..6b3a98d 100644
--- a/Modules/_fileio.c
+++ b/Modules/_fileio.c
@@ -278,6 +278,7 @@
ret = -1;
done:
+ PyMem_Free(name);
return ret;
}
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index e297240..628780f 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -784,7 +784,8 @@
#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)
ItimerError = PyErr_NewException("signal.ItimerError",
PyExc_IOError, NULL);
- PyDict_SetItemString(d, "ItimerError", ItimerError);
+ if (ItimerError != NULL)
+ PyDict_SetItemString(d, "ItimerError", ItimerError);
#endif
if (!PyErr_Occurred())