[Python-checkins] cpython: Catch PyUnicode_AS_UNICODE() errors

victor.stinner python-checkins at python.org
Thu Nov 17 00:47:01 CET 2011


http://hg.python.org/cpython/rev/a16d2a8a07cc
changeset:   73592:a16d2a8a07cc
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Thu Nov 17 00:45:54 2011 +0100
summary:
  Catch PyUnicode_AS_UNICODE() errors

files:
  Objects/unicodeobject.c |  33 +++++++++++++------
  Python/import.c         |  47 ++++++++++++++++++++--------
  2 files changed, 55 insertions(+), 25 deletions(-)


diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -3051,9 +3051,13 @@
 PyUnicode_EncodeFSDefault(PyObject *unicode)
 {
 #ifdef HAVE_MBCS
-    return PyUnicode_EncodeMBCS(PyUnicode_AS_UNICODE(unicode),
-                                PyUnicode_GET_SIZE(unicode),
-                                NULL);
+    const Py_UNICODE *wstr;
+    Py_ssize_t wlen;
+
+    wstr = PyUnicode_AsUnicodeAndSize(unicode, &wlen);
+    if (wstr == NULL)
+        return NULL;
+    return PyUnicode_EncodeMBCS(wstr, wlen, NULL);
 #elif defined(__APPLE__)
     return _PyUnicode_AsUTF8String(unicode, "surrogateescape");
 #else
@@ -3137,10 +3141,15 @@
                  (strcmp(lower, "iso-8859-1") == 0))
             return _PyUnicode_AsLatin1String(unicode, errors);
 #ifdef HAVE_MBCS
-        else if (strcmp(lower, "mbcs") == 0)
-            return PyUnicode_EncodeMBCS(PyUnicode_AS_UNICODE(unicode),
-                                        PyUnicode_GET_SIZE(unicode),
-                                        errors);
+        else if (strcmp(lower, "mbcs") == 0) {
+            const Py_UNICODE *wstr;
+            Py_ssize_t wlen;
+
+            wstr = PyUnicode_AsUnicodeAndSize(unicode, &wlen);
+            if (wstr == NULL)
+                return NULL;
+            return PyUnicode_EncodeMBCS(wstr, wlen, errors);
+        }
 #endif
         else if (strcmp(lower, "ascii") == 0)
             return _PyUnicode_AsASCIIString(unicode, errors);
@@ -5148,10 +5157,12 @@
 PyObject *
 PyUnicode_AsUTF32String(PyObject *unicode)
 {
-    return PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(unicode),
-                                 PyUnicode_GET_SIZE(unicode),
-                                 NULL,
-                                 0);
+    const Py_UNICODE *wstr;
+    Py_ssize_t wlen;
+    wstr = PyUnicode_AsUnicodeAndSize(unicode, &wlen);
+    if (wstr == NULL)
+        return NULL;
+    return PyUnicode_EncodeUTF32(wstr, wlen, NULL, 0);
 }
 
 /* --- UTF-16 Codec ------------------------------------------------------- */
diff --git a/Python/import.c b/Python/import.c
--- a/Python/import.c
+++ b/Python/import.c
@@ -1198,6 +1198,7 @@
     PyObject *cpathname_tmp;
 #ifdef MS_WINDOWS   /* since Windows uses different permissions  */
     mode_t mode = srcstat->st_mode & ~S_IEXEC;
+    wchar_t *wdirname, *wpathname, *wpathname_tmp;
 #else
     mode_t dirmode = (srcstat->st_mode |
                       S_IXUSR | S_IXGRP | S_IXOTH |
@@ -1230,7 +1231,12 @@
     }
 
 #ifdef MS_WINDOWS
-    res = CreateDirectoryW(PyUnicode_AS_UNICODE(dirname), NULL);
+    wdirname = PyUnicode_AsUnicode(dirname);
+    if (wdirname == NULL) {
+        PyErr_Clear();
+        return;
+    }
+    res = CreateDirectoryW(wdirname, NULL);
     ok = (res != 0);
     if (!ok && GetLastError() == ERROR_ALREADY_EXISTS)
         ok = 1;
@@ -1268,8 +1274,19 @@
         return;
     }
 #ifdef MS_WINDOWS
-    (void)DeleteFileW(PyUnicode_AS_UNICODE(cpathname_tmp));
-    fd = _wopen(PyUnicode_AS_UNICODE(cpathname_tmp),
+    wpathname = PyUnicode_AsUnicode(cpathname);
+    if (wpathname == NULL) {
+        PyErr_Clear();
+        return;
+    }
+    wpathname_tmp = PyUnicode_AsUnicode(cpathname_tmp);
+    if (wpathname_tmp == NULL) {
+        PyErr_Clear();
+        return;
+    }
+
+    (void)DeleteFileW(wpathname_tmp);
+    fd = _wopen(wpathname_tmp,
                 O_EXCL | O_CREAT | O_WRONLY | O_BINARY,
                 mode);
     if (0 <= fd)
@@ -1322,7 +1339,7 @@
         /* Don't keep partial file */
         fclose(fp);
 #ifdef MS_WINDOWS
-        (void)DeleteFileW(PyUnicode_AS_UNICODE(cpathname_tmp));
+        (void)DeleteFileW(wpathname_tmp);
         Py_DECREF(cpathname_tmp);
 #else
         (void) unlink(PyBytes_AS_STRING(cpathbytes_tmp));
@@ -1334,13 +1351,11 @@
     fclose(fp);
     /* Do a (hopefully) atomic rename */
 #ifdef MS_WINDOWS
-    if (!MoveFileExW(PyUnicode_AS_UNICODE(cpathname_tmp),
-                     PyUnicode_AS_UNICODE(cpathname),
-                     MOVEFILE_REPLACE_EXISTING)) {
+    if (!MoveFileExW(wpathname_tmp, wpathname, MOVEFILE_REPLACE_EXISTING)) {
         if (Py_VerboseFlag)
             PySys_FormatStderr("# can't write %R\n", cpathname);
         /* Don't keep tmp file */
-        (void) DeleteFileW(PyUnicode_AS_UNICODE(cpathname_tmp));
+        (void) DeleteFileW(wpathname_tmp);
         Py_DECREF(cpathname_tmp);
         return;
     }
@@ -1819,10 +1834,10 @@
     PyUnicode_CopyCharacters(filename, 0, path_unicode, 0, len);
     pos = len;
     if (addsep)
-        PyUnicode_WRITE(PyUnicode_KIND(filename), 
+        PyUnicode_WRITE(PyUnicode_KIND(filename),
                         PyUnicode_DATA(filename),
                         pos++, SEP);
-    PyUnicode_CopyCharacters(filename, pos, name, 0, 
+    PyUnicode_CopyCharacters(filename, pos, name, 0,
                              PyUnicode_GET_LENGTH(name));
 
     /* Check for package import (buf holds a directory name,
@@ -2268,18 +2283,22 @@
     WIN32_FIND_DATAW data;
     HANDLE h;
     int cmp;
-    wchar_t *wname;
+    wchar_t *wfilename, *wname;
     Py_ssize_t wname_len;
 
     if (Py_GETENV("PYTHONCASEOK") != NULL)
         return 1;
 
-    h = FindFirstFileW(PyUnicode_AS_UNICODE(filename), &data);
+    wfilename = PyUnicode_AsUnicode(filename);
+    if (wfilename == NULL)
+        return -1;
+
+    h = FindFirstFileW(wfilename, &data);
     if (h == INVALID_HANDLE_VALUE) {
         PyErr_Format(PyExc_NameError,
           "Can't find file for module %R\n(filename %R)",
           name, filename);
-        return 0;
+        return -1;
     }
     FindClose(h);
 
@@ -2831,7 +2850,7 @@
 
     if (!ensure_fromlist(tail, fromlist, prefix, 0))
         goto out;
-    
+
     result = tail;
     Py_INCREF(result);
   out:

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list