[Python-3000-checkins] r58903 - python/branches/py3k/Python/import.c

christian.heimes python-3000-checkins at python.org
Wed Nov 7 18:26:17 CET 2007


Author: christian.heimes
Date: Wed Nov  7 18:26:16 2007
New Revision: 58903

Modified:
   python/branches/py3k/Python/import.c
Log:
Patch for bug http://bugs.python.org/issue1293

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.

Modified: python/branches/py3k/Python/import.c
==============================================================================
--- python/branches/py3k/Python/import.c	(original)
+++ python/branches/py3k/Python/import.c	Wed Nov  7 18:26:16 2007
@@ -2922,6 +2922,7 @@
 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 @@
 			      &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)) {


More information about the Python-3000-checkins mailing list