]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Patch #788249: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().
authorMartin v. Löwis <martin@v.loewis.de>
Thu, 4 Sep 2003 19:02:20 +0000 (19:02 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 4 Sep 2003 19:02:20 +0000 (19:02 +0000)
Fixes #603724.

Include/fileobject.h
Misc/NEWS
Objects/fileobject.c

index e2053df2e4f7c1427c0fd78ae98f49a6ad3d84b7..2ec4b24a2b819381b1cecadeefbc284317d2ee68 100644 (file)
@@ -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 */
index e93ad40a014ae710f452be3f298510fde9382494..8181baf4b140c58f0d04e7105d4ca097b069e6b2 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@ What's New in Python 2.3.1?
 Core and builtins
 -----------------
 
+- Bug #603724: Pass an explicit buffer to setvbuf in PyFile_SetBufSize().
+
 - Bug #795506:  The % formatting operator did not support '%F' as
   had been documented.
 
index 1cc6def62cd6fadb52d20e880265e7e9b8cdd7f1..bf00039183005dc260386289288dbe6b350b65bf 100644 (file)
@@ -282,25 +282,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 */
        }
 }
@@ -375,6 +387,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
@@ -1927,6 +1940,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;