mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
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.
This commit is contained in:
parent
c90acb9599
commit
0f9431fb18
1 changed files with 28 additions and 11 deletions
|
@ -1194,26 +1194,43 @@ case_ok(char *buf, int len, int namelen, char *name)
|
|||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue