[Python-checkins] r69659 - in python/branches/io-c/Modules: _iomodule.h io.c

benjamin.peterson python-checkins at python.org
Mon Feb 16 03:55:48 CET 2009


Author: benjamin.peterson
Date: Mon Feb 16 03:55:48 2009
New Revision: 69659
Log:
fix segfault on initialization failing
Modified:
 python/branches/io-c/Modules/_iomodule.h
 python/branches/io-c/Modules/io.c
Modified: python/branches/io-c/Modules/_iomodule.h
==============================================================================
--- python/branches/io-c/Modules/_iomodule.h	(original)
+++ python/branches/io-c/Modules/_iomodule.h	Mon Feb 16 03:55:48 2009
@@ -96,6 +96,7 @@
 extern PyModuleDef _PyIO_Module;
 
 typedef struct {
+ int initialized;
 PyObject *os_module;
 PyObject *locale_module;
 
Modified: python/branches/io-c/Modules/io.c
==============================================================================
--- python/branches/io-c/Modules/io.c	(original)
+++ python/branches/io-c/Modules/io.c	Mon Feb 16 03:55:48 2009
@@ -560,14 +560,19 @@
 
 static int
 iomodule_traverse(_PyIO_State *mod, visitproc visit, void *arg) {
+ if (!mod->initialized)
+ return 0;
 Py_VISIT(mod->os_module);
 if (mod->locale_module != NULL)
 Py_VISIT(mod->locale_module);
+ Py_VISIT(mod->unsupported_operation);
 return 0;
 }
 
 static int
 iomodule_clear(_PyIO_State *mod) {
+ if (!mod->initialized)
+ return 0;
 Py_CLEAR(mod->os_module);
 if (mod->locale_module != NULL)
 Py_CLEAR(mod->locale_module);
@@ -605,7 +610,7 @@
 PyInit__io(void)
 {
 PyObject *m = PyModule_Create(&_PyIO_Module);
- _PyIO_State *state;
+ _PyIO_State *state = NULL;
 PyTypeObject *base;
 if (m == NULL)
 goto fail;
@@ -763,9 +768,15 @@
 if (!(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))
 goto fail;
 
+ state->initialized = 1;
+
 return m;
 
 fail:
+ if (state != NULL) {
+ Py_XDECREF(state->os_module);
+ Py_XDECREF(state->unsupported_operation);
+ }
 Py_XDECREF(m);
 return NULL;
 }


More information about the Python-checkins mailing list

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