]> granicus.if.org Git - python/commitdiff
Export function sanitize_the_mode from fileobject.c as _PyFile_SanitizeMode(). Use...
authorKristján Valur Jónsson <kristjan@ccpgames.com>
Thu, 26 Apr 2007 09:15:08 +0000 (09:15 +0000)
committerKristján Valur Jónsson <kristjan@ccpgames.com>
Thu, 26 Apr 2007 09:15:08 +0000 (09:15 +0000)
Include/fileobject.h
Modules/posixmodule.c
Objects/fileobject.c

index ebbb521d17be986a7e049c5195f2e26270209f82..9fd0646be47341da78ef211be59e893ac48c4a22 100644 (file)
@@ -57,6 +57,11 @@ PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding;
 char *Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *);
 size_t Py_UniversalNewlineFread(char *, size_t, FILE *, PyObject *);
 
+/* A routine to do sanity checking on the file mode string.  returns
+   non-zero on if an exception occurred
+*/
+int _PyFile_SanitizeMode(char *mode);
+
 #ifdef __cplusplus
 }
 #endif
index bb1dc4f3a83de2f26fc5b19675c9164e38f146e3..29ef1dcc99e8842fcb13815082c5e511916c2750 100644 (file)
@@ -6259,16 +6259,23 @@ static PyObject *
 posix_fdopen(PyObject *self, PyObject *args)
 {
        int fd;
-       char *mode = "r";
+       char *orgmode = "r";
        int bufsize = -1;
        FILE *fp;
        PyObject *f;
-       if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
+       char *mode;
+       if (!PyArg_ParseTuple(args, "i|si", &fd, &orgmode, &bufsize))
                return NULL;
 
-       if (mode[0] != 'r' && mode[0] != 'w' && mode[0] != 'a') {
-               PyErr_Format(PyExc_ValueError,
-                            "invalid file mode '%s'", mode);
+       /* Sanitize mode.  See fileobject.c */
+       mode = PyMem_MALLOC(strlen(orgmode)+3);
+       if (!mode) {
+               PyErr_NoMemory();
+               return NULL;
+       }
+       strcpy(mode, orgmode);
+       if (_PyFile_SanitizeMode(mode)) {
+               PyMem_FREE(mode);
                return NULL;
        }
        Py_BEGIN_ALLOW_THREADS
@@ -6289,10 +6296,11 @@ posix_fdopen(PyObject *self, PyObject *args)
 #else
        fp = fdopen(fd, mode);
 #endif
+       PyMem_FREE(mode);
        Py_END_ALLOW_THREADS
        if (fp == NULL)
                return posix_error();
-       f = PyFile_FromFile(fp, "<fdopen>", mode, fclose);
+       f = PyFile_FromFile(fp, "<fdopen>", orgmode, fclose);
        if (f != NULL)
                PyFile_SetBufSize(f, bufsize);
        return f;
index 18801874a8d858763bad60f6bc2c6b7b08f4849e..ac093ce9c92cac3e8bf7fa4288ef4b1661c036c1 100644 (file)
@@ -139,17 +139,16 @@ fill_file_fields(PyFileObject *f, FILE *fp, PyObject *name, char *mode,
    ignore stuff they don't understand... write or append mode with
    universal newline support is expressly forbidden by PEP 278.
    Additionally, remove the 'U' from the mode string as platforms
-   won't know what it is. */
-/* zero return is kewl - one is un-kewl */
-static int
-sanitize_the_mode(char *mode)
+   won't know what it is. Non-zero return signals an exception */
+int
+_PyFile_SanitizeMode(char *mode)
 {
        char *upos;
        size_t len = strlen(mode);
 
        if (!len) {
                PyErr_SetString(PyExc_ValueError, "empty mode string");
-               return 1;
+               return -1;
        }
 
        upos = strchr(mode, 'U');
@@ -160,7 +159,7 @@ sanitize_the_mode(char *mode)
                        PyErr_Format(PyExc_ValueError, "universal newline "
                                     "mode can only be used with modes "
                                     "starting with 'r'");
-                       return 1;
+                       return -1;
                }
 
                if (mode[0] != 'r') {
@@ -175,7 +174,7 @@ sanitize_the_mode(char *mode)
        } else if (mode[0] != 'r' && mode[0] != 'w' && mode[0] != 'a') {
                PyErr_Format(PyExc_ValueError, "mode string must begin with "
                            "one of 'r', 'w', 'a' or 'U', not '%.200s'", mode);
-               return 1;
+               return -1;
        }
 
        return 0;
@@ -204,7 +203,7 @@ open_the_file(PyFileObject *f, char *name, char *mode)
        }
        strcpy(newmode, mode);
 
-       if (sanitize_the_mode(newmode)) {
+       if (_PyFile_SanitizeMode(newmode)) {
                f = NULL;
                goto cleanup;
        }