]> granicus.if.org Git - python/commitdiff
Handle allocation failures gracefully. Found with failmalloc.
authorNeal Norwitz <nnorwitz@gmail.com>
Fri, 21 Jul 2006 05:32:28 +0000 (05:32 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Fri, 21 Jul 2006 05:32:28 +0000 (05:32 +0000)
Many (all?) of these could be backported.

Misc/NEWS
Objects/typeobject.c
Objects/unicodeobject.c
Python/import.c
Python/pystate.c
Python/sysmodule.c

index 7339db2ec59c65f27276e79658e67bffdf7bcc1a..43bede1977be3d9cae736669bd968cd13c03afe1 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.5 release candidate 1?
 Core and builtins
 -----------------
 
+- Fix some potential crashes found with failmalloc.
+
 - Fix warnings reported by Klocwork's static analysis tool.
 
 - Bug #1512814, Fix incorrect lineno's when code within a function
index 2046972646efed5e02ae2e4a2417e106ae1483a0..6b484304a3777de81a2802ec7980cad68d1c305b 100644 (file)
@@ -3260,6 +3260,8 @@ PyType_Ready(PyTypeObject *type)
        if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
                if (type->tp_doc != NULL) {
                        PyObject *doc = PyString_FromString(type->tp_doc);
+                       if (doc == NULL)
+                               goto error;
                        PyDict_SetItemString(type->tp_dict, "__doc__", doc);
                        Py_DECREF(doc);
                } else {
index 08fdb3f2fe1380bec19a2900984c08f3856df6dd..096dfc6ee1fa473681346a63475cab4a865a2dac 100644 (file)
@@ -7918,6 +7918,9 @@ void _PyUnicode_Init(void)
     unicode_freelist = NULL;
     unicode_freelist_size = 0;
     unicode_empty = _PyUnicode_New(0);
+    if (!unicode_empty)
+       return;
+
     strcpy(unicode_default_encoding, "ascii");
     for (i = 0; i < 256; i++)
        unicode_latin1[i] = NULL;
index 2c0468bf8e0b302e935971472aa823ad596014c3..2073c4369b7636cd0cc584809a0fdddb630fcc88 100644 (file)
@@ -116,6 +116,8 @@ _PyImport_Init(void)
        for (scan = _PyImport_StandardFiletab; scan->suffix != NULL; ++scan)
                ++countS;
        filetab = PyMem_NEW(struct filedescr, countD + countS + 1);
+       if (filetab == NULL)
+               Py_FatalError("Can't intiialize import file table.");
        memcpy(filetab, _PyImport_DynLoadFiletab,
               countD * sizeof(struct filedescr));
        memcpy(filetab + countD, _PyImport_StandardFiletab,
@@ -239,8 +241,11 @@ lock_import(void)
        long me = PyThread_get_thread_ident();
        if (me == -1)
                return; /* Too bad */
-       if (import_lock == NULL)
+       if (import_lock == NULL) {
                import_lock = PyThread_allocate_lock();
+               if (import_lock == NULL)
+                       return;  /* Nothing much we can do. */
+       }
        if (import_lock_thread == me) {
                import_lock_level++;
                return;
@@ -259,7 +264,7 @@ static int
 unlock_import(void)
 {
        long me = PyThread_get_thread_ident();
-       if (me == -1)
+       if (me == -1 || import_lock == NULL)
                return 0; /* Too bad */
        if (import_lock_thread != me)
                return -1;
index eca26c78c8b5329000b8489e148891f6d44689a9..3fae85be88e661ca3a851c38304b1ba86fb25653 100644 (file)
@@ -63,6 +63,10 @@ PyInterpreterState_New(void)
 
        if (interp != NULL) {
                HEAD_INIT();
+#ifdef WITH_THREAD
+               if (head_mutex == NULL)
+                       Py_FatalError("Can't initialize threads for interpreter");
+#endif
                interp->modules = NULL;
                interp->sysdict = NULL;
                interp->builtins = NULL;
index ea1388b6412469ca0d1c33d57eacf9e609a2cebc..2dbe2839a681cf82b06d9dc7ebf0a248878286f1 100644 (file)
@@ -1137,41 +1137,38 @@ _PySys_Init(void)
 #elif PY_RELEASE_LEVEL == PY_RELEASE_LEVEL_FINAL
        s = "final";
 #endif
-       PyDict_SetItemString(sysdict, "version_info",
-                            v = Py_BuildValue("iiisi", PY_MAJOR_VERSION,
+
+#define SET_SYS_FROM_STRING(key, value)                        \
+       v = value;                                      \
+       if (v != NULL)                                  \
+               PyDict_SetItemString(sysdict, key, v);  \
+       Py_XDECREF(v)
+
+       SET_SYS_FROM_STRING("version_info",
+                           Py_BuildValue("iiisi", PY_MAJOR_VERSION,
                                               PY_MINOR_VERSION,
                                               PY_MICRO_VERSION, s,
                                               PY_RELEASE_SERIAL));
-       Py_XDECREF(v);
-       PyDict_SetItemString(sysdict, "api_version",
-                            v = PyInt_FromLong(PYTHON_API_VERSION));
-       Py_XDECREF(v);
-       PyDict_SetItemString(sysdict, "copyright",
-                            v = PyString_FromString(Py_GetCopyright()));
-       Py_XDECREF(v);
-       PyDict_SetItemString(sysdict, "platform",
-                            v = PyString_FromString(Py_GetPlatform()));
-       Py_XDECREF(v);
-       PyDict_SetItemString(sysdict, "executable",
-                            v = PyString_FromString(Py_GetProgramFullPath()));
-       Py_XDECREF(v);
-       PyDict_SetItemString(sysdict, "prefix",
-                            v = PyString_FromString(Py_GetPrefix()));
-       Py_XDECREF(v);
-       PyDict_SetItemString(sysdict, "exec_prefix",
-                  v = PyString_FromString(Py_GetExecPrefix()));
-       Py_XDECREF(v);
-       PyDict_SetItemString(sysdict, "maxint",
-                            v = PyInt_FromLong(PyInt_GetMax()));
-       Py_XDECREF(v);
+       SET_SYS_FROM_STRING("api_version",
+                           PyInt_FromLong(PYTHON_API_VERSION));
+       SET_SYS_FROM_STRING("copyright",
+                           PyString_FromString(Py_GetCopyright()));
+       SET_SYS_FROM_STRING("platform",
+                           PyString_FromString(Py_GetPlatform()));
+       SET_SYS_FROM_STRING("executable",
+                           PyString_FromString(Py_GetProgramFullPath()));
+       SET_SYS_FROM_STRING("prefix",
+                           PyString_FromString(Py_GetPrefix()));
+       SET_SYS_FROM_STRING("exec_prefix",
+                           PyString_FromString(Py_GetExecPrefix()));
+       SET_SYS_FROM_STRING("maxint",
+                           PyInt_FromLong(PyInt_GetMax()));
 #ifdef Py_USING_UNICODE
-       PyDict_SetItemString(sysdict, "maxunicode",
-                            v = PyInt_FromLong(PyUnicode_GetMax()));
-       Py_XDECREF(v);
+       SET_SYS_FROM_STRING("maxunicode",
+                           PyInt_FromLong(PyUnicode_GetMax()));
 #endif
-       PyDict_SetItemString(sysdict, "builtin_module_names",
-                  v = list_builtin_module_names());
-       Py_XDECREF(v);
+       SET_SYS_FROM_STRING("builtin_module_names",
+                           list_builtin_module_names());
        {
                /* Assumes that longs are at least 2 bytes long.
                   Should be safe! */
@@ -1183,18 +1180,16 @@ _PySys_Init(void)
                        value = "big";
                else
                        value = "little";
-               PyDict_SetItemString(sysdict, "byteorder",
-                                    v = PyString_FromString(value));
-               Py_XDECREF(v);
+               SET_SYS_FROM_STRING("byteorder",
+                                   PyString_FromString(value));
        }
 #ifdef MS_COREDLL
-       PyDict_SetItemString(sysdict, "dllhandle",
-                            v = PyLong_FromVoidPtr(PyWin_DLLhModule));
-       Py_XDECREF(v);
-       PyDict_SetItemString(sysdict, "winver",
-                            v = PyString_FromString(PyWin_DLLVersionString));
-       Py_XDECREF(v);
+       SET_SYS_FROM_STRING("dllhandle",
+                           PyLong_FromVoidPtr(PyWin_DLLhModule));
+       SET_SYS_FROM_STRING("winver",
+                           PyString_FromString(PyWin_DLLVersionString));
 #endif
+#undef SET_SYS_FROM_STRING
        if (warnoptions == NULL) {
                warnoptions = PyList_New(0);
        }