From: Christian Heimes Date: Fri, 30 Nov 2007 10:18:26 +0000 (+0000) Subject: Partial fix for bug #1306 X-Git-Tag: v3.0a2~69 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c8967002353864e012567125d7824abaeeb31dd3;p=thirdparty%2FPython%2Fcpython.git Partial fix for bug #1306 Multiple reinitializations of Python 3.0 failed on a system without a hardcoded default fs encoding. The patch makes sure that the default fs encoding is freed and reset to NULL on e.g. Linux. I've also taken the liberty to increase the debugging in Objects/object.c:_Py_ForgetReference(). The method is used to validate the reference chain. Reinitialization still fails in the 3rd round of my test suite: * ob object : type : str refcount: 0 address : 0x821c840 * op->_ob_prev->_ob_next object : type : str refcount: 0 address : 0x821c840 * op->_ob_next->_ob_prev object : bytearray(b'') type : bytearray refcount: 1 address : 0x826b838 Fatal Python error: UNREF invalid object --- diff --git a/Include/fileobject.h b/Include/fileobject.h index 40d871aea5df..0f40089ef196 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -20,6 +20,7 @@ PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); If non-NULL, this is different than the default encoding for strings */ PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding; +PyAPI_DATA(const int) Py_HasFileSystemDefaultEncoding; /* Internal API diff --git a/Objects/object.c b/Objects/object.c index df93a192d607..641467364040 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -1532,8 +1532,15 @@ _Py_ForgetReference(register PyObject *op) if (op->ob_refcnt < 0) Py_FatalError("UNREF negative refcnt"); if (op == &refchain || - op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) + op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) { + fprintf(stderr, "* ob\n"); + _PyObject_Dump(op); + fprintf(stderr, "* op->_ob_prev->_ob_next\n"); + _PyObject_Dump(op->_ob_prev->_ob_next); + fprintf(stderr, "* op->_ob_next->_ob_prev\n"); + _PyObject_Dump(op->_ob_next->_ob_prev); Py_FatalError("UNREF invalid object"); + } #ifdef SLOW_UNREF_CHECK for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) { if (p == op) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index b109ba7c3b81..fb7e223367ee 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -16,10 +16,13 @@ */ #if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T) const char *Py_FileSystemDefaultEncoding = "mbcs"; +const int Py_HasFileSystemDefaultEncoding = 1; #elif defined(__APPLE__) const char *Py_FileSystemDefaultEncoding = "utf-8"; +const int Py_HasFileSystemDefaultEncoding = 1; #else const char *Py_FileSystemDefaultEncoding = NULL; /* use default */ +const int Py_HasFileSystemDefaultEncoding = 0; #endif static PyObject * diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 0ba8646ab5d2..5766b2385e53 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -502,6 +502,12 @@ Py_Finalize(void) /* Cleanup Unicode implementation */ _PyUnicode_Fini(); + /* reset file system default encoding */ + if (!Py_HasFileSystemDefaultEncoding) { + free((char*)Py_FileSystemDefaultEncoding); + Py_FileSystemDefaultEncoding = NULL; + } + /* XXX Still allocated: - various static ad-hoc pointers to interned strings - int and float free list blocks