diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2003-09-04 19:01:46 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2003-09-04 19:01:46 (GMT) |
commit | 1e3bdf6c459a2e324730dda2db53ad845ad39532 (patch) | |
tree | d9402a5bd98c5efe7bca7779f48e9632e608541f | |
parent | fa3bdea018c511dbfabec8c2860b36523448b217 (diff) | |
download | cpython-1e3bdf6c459a2e324730dda2db53ad845ad39532.zip cpython-1e3bdf6c459a2e324730dda2db53ad845ad39532.tar.gz cpython-1e3bdf6c459a2e324730dda2db53ad845ad39532.tar.bz2 |
Patch #788249: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().
Fixes #603724. Will backport to 2.3.
-rw-r--r-- | Include/fileobject.h | 1 | ||||
-rw-r--r-- | Objects/fileobject.c | 24 |
2 files changed, 20 insertions, 5 deletions
diff --git a/Include/fileobject.h b/Include/fileobject.h index e2053df..2ec4b24 100644 --- a/Include/fileobject.h +++ b/Include/fileobject.h @@ -19,6 +19,7 @@ typedef struct { char* f_buf; /* Allocated readahead buffer */ char* f_bufend; /* Points after last occupied position */ char* f_bufptr; /* Current buffer position */ + char *f_setbuf; /* Buffer for setbuf(3) and setvbuf(3) */ #ifdef WITH_UNIVERSAL_NEWLINES int f_univ_newline; /* Handle any newline convention */ int f_newlinetypes; /* Types of newlines seen */ diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 13354c8..bddd81e 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -283,25 +283,37 @@ PyFile_FromString(char *name, char *mode) void PyFile_SetBufSize(PyObject *f, int bufsize) { + PyFileObject *file = (PyFileObject *)f; if (bufsize >= 0) { -#ifdef HAVE_SETVBUF int type; switch (bufsize) { case 0: type = _IONBF; break; +#ifdef HAVE_SETVBUF case 1: type = _IOLBF; bufsize = BUFSIZ; break; +#endif default: 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, - type, bufsize); +#ifdef HAVE_SETVBUF + setvbuf(file->f_fp, file->f_setbuf, type, bufsize); #else /* !HAVE_SETVBUF */ - if (bufsize <= 1) - setbuf(((PyFileObject *)f)->f_fp, (char *)NULL); + setbuf(file->f_fp, file->f_setbuf); #endif /* !HAVE_SETVBUF */ } } @@ -376,6 +388,7 @@ static PyObject * file_close(PyFileObject *f) { int sts = 0; + PyMem_Free(f->f_setbuf); if (f->f_fp != NULL) { if (f->f_close != NULL) { Py_BEGIN_ALLOW_THREADS @@ -1928,6 +1941,7 @@ file_init(PyObject *self, PyObject *args, PyObject *kwds) } if (open_the_file(foself, name, mode) == NULL) goto Error; + foself->f_setbuf = NULL; PyFile_SetBufSize(self, bufsize); goto Done; |