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.
diff --git a/Python/import.c b/Python/import.c
index ef3e0e6..7443724 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -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;