]> granicus.if.org Git - python/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:01:46 +0000 (19:01 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Thu, 4 Sep 2003 19:01:46 +0000 (19:01 +0000)
Fixes #603724. Will backport to 2.3.

Include/fileobject.h
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 13354c8839bf3aa29dd012bc8e8b330a59145df5..bddd81e93ad23e64a74a5d0d2a9b1f633d9c4e2f 100644 (file)
@@ -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;