summaryrefslogtreecommitdiffstats
path: root/Parser
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2016-09-13 05:06:58 (GMT)
committerBenjamin Peterson <benjamin@python.org>2016-09-13 05:06:58 (GMT)
commit35ee948fa5dddbee29b8a5a2abbceaab7f862a95 (patch)
tree231817e34319fc7269ca37ed6347ea7d63b4f4e4 /Parser
parent7927e75758e8ac7285876490d7192c9953eb4ac4 (diff)
downloadcpython-35ee948fa5dddbee29b8a5a2abbceaab7f862a95.zip
cpython-35ee948fa5dddbee29b8a5a2abbceaab7f862a95.tar.gz
cpython-35ee948fa5dddbee29b8a5a2abbceaab7f862a95.tar.bz2
restructure fp_setreadl so as to avoid refleaks (closes #27981)
Diffstat (limited to 'Parser')
-rw-r--r--Parser/tokenizer.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c
index 184ffe7..eda1542 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -497,16 +497,12 @@ error:
static int
fp_setreadl(struct tok_state *tok, const char* enc)
{
- PyObject *readline = NULL, *stream = NULL, *io = NULL;
+ PyObject *readline, *io, *stream;
_Py_IDENTIFIER(open);
_Py_IDENTIFIER(readline);
int fd;
long pos;
- io = PyImport_ImportModuleNoBlock("io");
- if (io == NULL)
- goto cleanup;
-
fd = fileno(tok->fp);
/* Due to buffering the file offset for fd can be different from the file
* position of tok->fp. If tok->fp was opened in text mode on Windows,
@@ -517,27 +513,33 @@ fp_setreadl(struct tok_state *tok, const char* enc)
if (pos == -1 ||
lseek(fd, (off_t)(pos > 0 ? pos - 1 : pos), SEEK_SET) == (off_t)-1) {
PyErr_SetFromErrnoWithFilename(PyExc_OSError, NULL);
- goto cleanup;
+ return 0;
}
+ io = PyImport_ImportModuleNoBlock("io");
+ if (io == NULL)
+ return 0;
+
stream = _PyObject_CallMethodId(io, &PyId_open, "isisOOO",
fd, "r", -1, enc, Py_None, Py_None, Py_False);
+ Py_DECREF(io);
if (stream == NULL)
- goto cleanup;
+ return 0;
readline = _PyObject_GetAttrId(stream, &PyId_readline);
+ Py_DECREF(stream);
+ if (readline == NULL)
+ return 0;
Py_XSETREF(tok->decoding_readline, readline);
+
if (pos > 0) {
- if (PyObject_CallObject(readline, NULL) == NULL) {
- readline = NULL;
- goto cleanup;
- }
+ PyObject *bufobj = PyObject_CallObject(readline, NULL);
+ if (bufobj == NULL)
+ return 0;
+ Py_DECREF(bufobj);
}
- cleanup:
- Py_XDECREF(stream);
- Py_XDECREF(io);
- return readline != NULL;
+ return 1;
}
/* Fetch the next byte from TOK. */