]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
_wrealpath() and _Py_wreadlink() support surrogates (PEP 383)
authorVictor Stinner <victor.stinner@haypocalc.com>
Thu, 7 Oct 2010 11:06:49 +0000 (11:06 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Thu, 7 Oct 2010 11:06:49 +0000 (11:06 +0000)
Use _Py_wchar2char() to support surrogate characters in the input path.

Modules/getpath.c
Python/sysmodule.c

index 6f2e5371c865ad553d822c9c0256d22648cf59f7..06d0cae2ea7e5c8e589624b215afc294348ed72d 100644 (file)
@@ -179,15 +179,18 @@ _wgetcwd(wchar_t *buf, size_t size)
 int
 _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)
 {
+    char *cpath;
     char cbuf[PATH_MAX];
-    char cpath[PATH_MAX];
     int res;
-    size_t r1 = wcstombs(cpath, path, PATH_MAX);
-    if (r1 == (size_t)-1 || r1 >= PATH_MAX) {
+    size_t r1;
+
+    cpath = _Py_wchar2char(path);
+    if (cpath == NULL) {
         errno = EINVAL;
         return -1;
     }
     res = (int)readlink(cpath, cbuf, PATH_MAX);
+    PyMem_Free(cpath);
     if (res == -1)
         return -1;
     if (res == PATH_MAX) {
index 97809d27b0b2d33bb142733f6e9f219ad3601dfd..e95a91f042d897a38efe98cbeb6da1c2be39ce4e 100644 (file)
@@ -1661,16 +1661,17 @@ makeargvobject(int argc, wchar_t **argv)
 static wchar_t*
 _wrealpath(const wchar_t *path, wchar_t *resolved_path)
 {
-    char cpath[PATH_MAX];
+    char *cpath;
     char cresolved_path[PATH_MAX];
     char *res;
     size_t r;
-    r = wcstombs(cpath, path, PATH_MAX);
-    if (r == (size_t)-1 || r >= PATH_MAX) {
+    cpath = _Py_wchar2char(path);
+    if (cpath == NULL) {
         errno = EINVAL;
         return NULL;
     }
     res = realpath(cpath, cresolved_path);
+    PyMem_Free(cpath);
     if (res == NULL)
         return NULL;
     r = mbstowcs(resolved_path, cresolved_path, PATH_MAX);