restructure fp_setreadl so as to avoid refleaks (closes #27981)
This commit is contained in:
parent
7927e75758
commit
35ee948fa5
|
@ -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. */
|
||||
|
|
Loading…
Reference in New Issue