mirror of https://github.com/python/cpython
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:
parent
b4fd4d37a1
commit
d12f86ce96
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue