A memory block allocated with one API was being handed over to an object that used another API to release it.
This commit is contained in:
Kristján Valur Jónsson 2009-09-28 13:08:48 +00:00
parent b4fd4d37a1
commit d12f86ce96
1 changed files with 11 additions and 3 deletions

View File

@ -243,16 +243,24 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
err_ret->text = text; err_ret->text = text;
} }
} else if (tok->encoding != NULL) { } else if (tok->encoding != NULL) {
/* 'nodes->n_str' uses PyObject_*, while 'tok->encoding' was
* allocated using PyMem_
*/
node* r = PyNode_New(encoding_decl); node* r = PyNode_New(encoding_decl);
if (!r) { if (r)
r->n_str = PyObject_MALLOC(strlen(tok->encoding)+1);
if (!r || !r->n_str) {
err_ret->error = E_NOMEM; err_ret->error = E_NOMEM;
if (r)
PyObject_FREE(r);
n = NULL; n = NULL;
goto done; goto done;
} }
r->n_str = tok->encoding; strcpy(r->n_str, tok->encoding);
PyMem_FREE(tok->encoding);
tok->encoding = NULL;
r->n_nchildren = 1; r->n_nchildren = 1;
r->n_child = n; r->n_child = n;
tok->encoding = NULL;
n = r; n = r;
} }