(original) (raw)

changeset: 84565:1a1869baec4c user: Victor Stinner victor.stinner@gmail.com date: Thu Jul 11 22:56:25 2013 +0200 files: Modules/_pickle.c description: Issue #18408: Fix _Pickler_New() and _Unpickler_New(): initialize all attributes before handling errors _Pickler_New() now calls PyObject_GC_Del() instead of Py_DECREF() on error, because the pickle object is created using PyObject_GC_New(). Fix a crash in the destructor when an attribute is not initiallized. diff -r ff93930a53c0 -r 1a1869baec4c Modules/_pickle.c --- a/Modules/_pickle.c Thu Jul 11 22:52:19 2013 +0200 +++ b/Modules/_pickle.c Thu Jul 11 22:56:25 2013 +0200 @@ -774,18 +774,15 @@ self->fast_nesting = 0; self->fix_imports = 0; self->fast_memo = NULL; + self->max_output_len = WRITE_BUF_SIZE; + self->output_len = 0; self->memo = PyMemoTable_New(); - if (self->memo == NULL) { - Py_DECREF(self); - return NULL; - } - self->max_output_len = WRITE_BUF_SIZE; - self->output_len = 0; self->output_buffer = PyBytes_FromStringAndSize(NULL, self->max_output_len); - if (self->output_buffer == NULL) { - Py_DECREF(self); + + if (self->memo == NULL || self->output_buffer == NULL) { + PyObject_GC_Del(self); return NULL; } return self; @@ -1136,20 +1133,6 @@ if (self == NULL) return NULL; - self->stack = (Pdata *)Pdata_New(); - if (self->stack == NULL) { - Py_DECREF(self); - return NULL; - } - memset(&self->buffer, 0, sizeof(Py_buffer)); - - self->memo_size = 32; - self->memo = _Unpickler_NewMemo(self->memo_size); - if (self->memo == NULL) { - Py_DECREF(self); - return NULL; - } - self->arg = NULL; self->pers_func = NULL; self->input_buffer = NULL; @@ -1167,6 +1150,15 @@ self->marks_size = 0; self->proto = 0; self->fix_imports = 0; + memset(&self->buffer, 0, sizeof(Py_buffer)); + self->memo_size = 32; + self->memo = _Unpickler_NewMemo(self->memo_size); + self->stack = (Pdata *)Pdata_New(); + + if (self->memo == NULL || self->stack == NULL) { + Py_DECREF(self); + return NULL; + } return self; } /victor.stinner@gmail.com