Commit 1fe8cbc2 authored by Martin v. Löwis's avatar Martin v. Löwis

Patch #788249: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().

Fixes #603724. Will backport to 2.3.
parent 379d78ef
...@@ -19,6 +19,7 @@ typedef struct { ...@@ -19,6 +19,7 @@ typedef struct {
char* f_buf; /* Allocated readahead buffer */ char* f_buf; /* Allocated readahead buffer */
char* f_bufend; /* Points after last occupied position */ char* f_bufend; /* Points after last occupied position */
char* f_bufptr; /* Current buffer position */ char* f_bufptr; /* Current buffer position */
char *f_setbuf; /* Buffer for setbuf(3) and setvbuf(3) */
#ifdef WITH_UNIVERSAL_NEWLINES #ifdef WITH_UNIVERSAL_NEWLINES
int f_univ_newline; /* Handle any newline convention */ int f_univ_newline; /* Handle any newline convention */
int f_newlinetypes; /* Types of newlines seen */ int f_newlinetypes; /* Types of newlines seen */
......
...@@ -283,25 +283,37 @@ PyFile_FromString(char *name, char *mode) ...@@ -283,25 +283,37 @@ PyFile_FromString(char *name, char *mode)
void void
PyFile_SetBufSize(PyObject *f, int bufsize) PyFile_SetBufSize(PyObject *f, int bufsize)
{ {
PyFileObject *file = (PyFileObject *)f;
if (bufsize >= 0) { if (bufsize >= 0) {
#ifdef HAVE_SETVBUF
int type; int type;
switch (bufsize) { switch (bufsize) {
case 0: case 0:
type = _IONBF; type = _IONBF;
break; break;
#ifdef HAVE_SETVBUF
case 1: case 1:
type = _IOLBF; type = _IOLBF;
bufsize = BUFSIZ; bufsize = BUFSIZ;
break; break;
#endif
default: default:
type = _IOFBF; type = _IOFBF;
#ifndef HAVE_SETVBUF
bufsize = BUFSIZ;
#endif
break;
}
fflush(file->f_fp);
if (type == _IONBF) {
PyMem_Free(file->f_setbuf);
file->f_setbuf = NULL;
} else {
file->f_setbuf = PyMem_Realloc(file->f_setbuf, bufsize);
} }
setvbuf(((PyFileObject *)f)->f_fp, (char *)NULL, #ifdef HAVE_SETVBUF
type, bufsize); setvbuf(file->f_fp, file->f_setbuf, type, bufsize);
#else /* !HAVE_SETVBUF */ #else /* !HAVE_SETVBUF */
if (bufsize <= 1) setbuf(file->f_fp, file->f_setbuf);
setbuf(((PyFileObject *)f)->f_fp, (char *)NULL);
#endif /* !HAVE_SETVBUF */ #endif /* !HAVE_SETVBUF */
} }
} }
...@@ -376,6 +388,7 @@ static PyObject * ...@@ -376,6 +388,7 @@ static PyObject *
file_close(PyFileObject *f) file_close(PyFileObject *f)
{ {
int sts = 0; int sts = 0;
PyMem_Free(f->f_setbuf);
if (f->f_fp != NULL) { if (f->f_fp != NULL) {
if (f->f_close != NULL) { if (f->f_close != NULL) {
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
...@@ -1928,6 +1941,7 @@ file_init(PyObject *self, PyObject *args, PyObject *kwds) ...@@ -1928,6 +1941,7 @@ file_init(PyObject *self, PyObject *args, PyObject *kwds)
} }
if (open_the_file(foself, name, mode) == NULL) if (open_the_file(foself, name, mode) == NULL)
goto Error; goto Error;
foself->f_setbuf = NULL;
PyFile_SetBufSize(self, bufsize); PyFile_SetBufSize(self, bufsize);
goto Done; goto Done;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment