diff Python/import.c @ 18388:06332b3c4335 legacy-trunk

SF bug #438295: [Windows] __init__.py cause strange behavior Probable fix (the bug report doesn't have enough info to say for sure). find_init_module(): Insist on a case-sensitive match for __init__ files. Given __INIT__.PY instead, find_init_module() thought that was fine, but the later attempt to do find_module("__INIT__.PY") didn't and its caller silently suppressed the resulting ImportError. Now find_init_module() refuses to accept __INIT__.PY to begin with. Bugfix candidate; specific to platforms with case-insensitive filesystems.
author Tim Peters <tim.peters@gmail.com>
date Thu, 05 Jul 2001 03:47:53 +0000
parents e06c36c13f12
children 763bb6fae280
line wrap: on
line diff
--- a/Python/import.c	Wed Jul 04 22:38:52 2001 +0000
+++ b/Python/import.c	Thu Jul 05 03:47:53 2001 +0000
@@ -1194,26 +1194,43 @@
 static int
 find_init_module(char *buf)
 {
-	size_t save_len = strlen(buf);
+	const size_t save_len = strlen(buf);
 	size_t i = save_len;
+	char *pname;  /* pointer to start of __init__ */
 	struct stat statbuf;
 
+/*	For calling case_ok(buf, len, namelen, name):
+ *	/a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
+ *	^                      ^                   ^    ^
+ *	|--------------------- buf ---------------------|
+ *	|------------------- len ------------------|
+ *	                       |------ name -------|
+ *	                       |----- namelen -----|
+ */
 	if (save_len + 13 >= MAXPATHLEN)
 		return 0;
 	buf[i++] = SEP;
-	strcpy(buf+i, "__init__.py");
+	pname = buf + i;
+	strcpy(pname, "__init__.py");
 	if (stat(buf, &statbuf) == 0) {
-		buf[save_len] = '\0';
-		return 1;
+		if (case_ok(buf,
+			    save_len + 9,	/* len("/__init__") */
+		            8,   		/* len("__init__") */
+		            pname)) {
+			buf[save_len] = '\0';
+			return 1;
+		}
 	}
-	i += strlen(buf+i);
-	if (Py_OptimizeFlag)
-		strcpy(buf+i, "o");
-	else
-		strcpy(buf+i, "c");
+	i += strlen(pname);
+	strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
 	if (stat(buf, &statbuf) == 0) {
-		buf[save_len] = '\0';
-		return 1;
+		if (case_ok(buf,
+			    save_len + 9,	/* len("/__init__") */
+		            8,   		/* len("__init__") */
+		            pname)) {
+			buf[save_len] = '\0';
+			return 1;
+		}
 	}
 	buf[save_len] = '\0';
 	return 0;