summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2007-08-12 00:03:22 (GMT)
committerNeal Norwitz <nnorwitz@gmail.com>2007-08-12 00:03:22 (GMT)
commit41eaedd3613cebc83e6b9925499369992c7a7770 (patch)
tree634cd64458cf19662b6578cc48b80212a2b75bdf
parentbb217d9ed81fea4593d6341a5b17903d72ac3efe (diff)
downloadcpython-41eaedd3613cebc83e6b9925499369992c7a7770.zip
cpython-41eaedd3613cebc83e6b9925499369992c7a7770.tar.gz
cpython-41eaedd3613cebc83e6b9925499369992c7a7770.tar.bz2
Fix refleaks from execfile('file that contains a # coding: line')
Also simplify logic a bit in fp_setreadl.
-rw-r--r--Parser/tokenizer.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 284082d..2e700bc 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -369,6 +369,7 @@ fp_readl(char *s, int size, struct tok_state *tok)
PyObject* bufobj = tok->decoding_buffer;
const char *buf;
Py_ssize_t buflen;
+ int allocated = 0;
/* Ask for one less byte so we can terminate it */
assert(size > 0);
@@ -377,21 +378,34 @@ fp_readl(char *s, int size, struct tok_state *tok)
if (bufobj == NULL) {
bufobj = PyObject_CallObject(tok->decoding_readline, NULL);
if (bufobj == NULL)
- return error_ret(tok);
+ goto error;
+ allocated = 1;
+ }
+ if (PyObject_AsCharBuffer(bufobj, &buf, &buflen) < 0) {
+ goto error;
}
- if (PyObject_AsCharBuffer(bufobj, &buf, &buflen) < 0)
- return error_ret(tok);
if (buflen > size) {
+ Py_XDECREF(tok->decoding_buffer);
tok->decoding_buffer = PyBytes_FromStringAndSize(buf+size,
buflen-size);
if (tok->decoding_buffer == NULL)
- return error_ret(tok);
+ goto error;
buflen = size;
}
memcpy(s, buf, buflen);
s[buflen] = '\0';
- if (buflen == 0) return NULL; /* EOF */
+ if (buflen == 0) /* EOF */
+ s = NULL;
+ if (allocated) {
+ Py_DECREF(bufobj);
+ }
return s;
+
+error:
+ if (allocated) {
+ Py_XDECREF(bufobj);
+ }
+ return error_ret(tok);
}
/* Set the readline function for TOK to a StreamReader's
@@ -408,7 +422,6 @@ static int
fp_setreadl(struct tok_state *tok, const char* enc)
{
PyObject *readline = NULL, *stream = NULL, *io = NULL;
- int ok = 0;
io = PyImport_ImportModule("io");
if (io == NULL)
@@ -419,17 +432,14 @@ fp_setreadl(struct tok_state *tok, const char* enc)
if (stream == NULL)
goto cleanup;
+ Py_XDECREF(tok->decoding_readline);
readline = PyObject_GetAttrString(stream, "readline");
- if (readline == NULL)
- goto cleanup;
-
tok->decoding_readline = readline;
- ok = 1;
cleanup:
Py_XDECREF(stream);
Py_XDECREF(io);
- return ok;
+ return readline != NULL;
}
/* Fetch the next byte from TOK. */