]> granicus.if.org Git - python/commitdiff
Patch for bug http://bugs.python.org/issue1293
authorChristian Heimes <christian@cheimes.de>
Wed, 7 Nov 2007 17:26:16 +0000 (17:26 +0000)
committerChristian Heimes <christian@cheimes.de>
Wed, 7 Nov 2007 17:26:16 +0000 (17:26 +0000)
The patch doesn't do the whole name mangling mambo jambo on purpose. MS sure does some weird things and I don't feel like reimplementing ntpath.normpath in C. If the user does deliberately something stupid he is on his own.

TODO: Backport to 2.6 (maybe 2.5?) and document that users should only do sys.path.append(os.path.normpath(somepath)) if they want to be on the safe side.

Python/import.c

index 289a1fbe05ab4e8028da69114f3e13a758979e0b..d2922e98d99d1be2c74593f78590185aca93229d 100644 (file)
@@ -2922,6 +2922,7 @@ static int
 NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
 {
        char *path;
+       Py_ssize_t pathlen;
 
        if (!_PyArg_NoKeywords("NullImporter()", kwds))
                return -1;
@@ -2930,14 +2931,31 @@ NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
                              &path))
                return -1;
 
-       if (strlen(path) == 0) {
+       pathlen = strlen(path);
+       if (pathlen == 0) {
                PyErr_SetString(PyExc_ImportError, "empty pathname");
                return -1;
        } else {
                struct stat statbuf;
                int rv;
 
+#ifdef MS_WINDOWS
+               /* MS Windows' stat chokes on paths like C:\\path\\. Try to
+                * recover *one* time by stripping of a trailing slash or
+                * back slash. http://bugs.python.org/issue1293
+                */
                rv = stat(path, &statbuf);
+               if (rv != 0 && pathlen <= MAXPATHLEN &&
+                   (path[pathlen-1] == '/' || path[pathlen-1] == '\\')) {
+                       char mangled[MAXPATHLEN+1];
+
+                       strcpy(mangled, path);
+                       mangled[pathlen-1] = '\0';
+                       rv = stat(mangled, &statbuf);
+               }
+#else
+               rv = stat(path, &statbuf);
+#endif
                if (rv == 0) {
                        /* it exists */
                        if (S_ISDIR(statbuf.st_mode)) {