Commit 4de39e12 authored by Tim Peters's avatar Tim Peters

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.
parent 575a7639
...@@ -1194,26 +1194,43 @@ case_ok(char *buf, int len, int namelen, char *name) ...@@ -1194,26 +1194,43 @@ case_ok(char *buf, int len, int namelen, char *name)
static int static int
find_init_module(char *buf) find_init_module(char *buf)
{ {
size_t save_len = strlen(buf); const size_t save_len = strlen(buf);
size_t i = save_len; size_t i = save_len;
char *pname; /* pointer to start of __init__ */
struct stat statbuf; 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) if (save_len + 13 >= MAXPATHLEN)
return 0; return 0;
buf[i++] = SEP; buf[i++] = SEP;
strcpy(buf+i, "__init__.py"); pname = buf + i;
strcpy(pname, "__init__.py");
if (stat(buf, &statbuf) == 0) { if (stat(buf, &statbuf) == 0) {
buf[save_len] = '\0'; if (case_ok(buf,
return 1; save_len + 9, /* len("/__init__") */
8, /* len("__init__") */
pname)) {
buf[save_len] = '\0';
return 1;
}
} }
i += strlen(buf+i); i += strlen(pname);
if (Py_OptimizeFlag) strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
strcpy(buf+i, "o");
else
strcpy(buf+i, "c");
if (stat(buf, &statbuf) == 0) { if (stat(buf, &statbuf) == 0) {
buf[save_len] = '\0'; if (case_ok(buf,
return 1; save_len + 9, /* len("/__init__") */
8, /* len("__init__") */
pname)) {
buf[save_len] = '\0';
return 1;
}
} }
buf[save_len] = '\0'; buf[save_len] = '\0';
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment