diff options
| author | Tim Peters <tim.peters@gmail.com> | 2001-07-05 03:47:53 +0000 | 
|---|---|---|
| committer | Tim Peters <tim.peters@gmail.com> | 2001-07-05 03:47:53 +0000 | 
| commit | 0f9431fb180986767c58416b7c8fa3da66933802 (patch) | |
| tree | 504f20fa950163d5194827f50ff7ef1eb99ca7bf | |
| parent | c90acb95997de32cc6014814e686804914a9c0c3 (diff) | |
| download | cpython-git-0f9431fb180986767c58416b7c8fa3da66933802.tar.gz | |
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.
| -rw-r--r-- | Python/import.c | 39 | 
1 files changed, 28 insertions, 11 deletions
diff --git a/Python/import.c b/Python/import.c index ef3e0e6d7a..7443724632 100644 --- a/Python/import.c +++ b/Python/import.c @@ -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;  | 
