[Python-checkins] CVS: python/dist/src/Python import.c,2.177,2.178

Tim Peters tim_one@users.sourceforge.net
Wed, 04 Jul 2001 20:47:55 -0700


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv29177/Python

Modified Files:
	import.c 
Log Message:
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.


Index: import.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/import.c,v
retrieving revision 2.177
retrieving revision 2.178
diff -C2 -r2.177 -r2.178
*** import.c	2001/04/29 22:21:25	2.177
--- import.c	2001/07/05 03:47:53	2.178
***************
*** 1195,1218 ****
  find_init_module(char *buf)
  {
! 	size_t save_len = strlen(buf);
  	size_t i = save_len;
  	struct stat statbuf;
  
  	if (save_len + 13 >= MAXPATHLEN)
  		return 0;
  	buf[i++] = SEP;
! 	strcpy(buf+i, "__init__.py");
  	if (stat(buf, &statbuf) == 0) {
! 		buf[save_len] = '\0';
! 		return 1;
  	}
! 	i += strlen(buf+i);
! 	if (Py_OptimizeFlag)
! 		strcpy(buf+i, "o");
! 	else
! 		strcpy(buf+i, "c");
  	if (stat(buf, &statbuf) == 0) {
! 		buf[save_len] = '\0';
! 		return 1;
  	}
  	buf[save_len] = '\0';
--- 1195,1235 ----
  find_init_module(char *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;
! 	pname = buf + i;
! 	strcpy(pname, "__init__.py");
  	if (stat(buf, &statbuf) == 0) {
! 		if (case_ok(buf,
! 			    save_len + 9,	/* len("/__init__") */
! 		            8,   		/* len("__init__") */
! 		            pname)) {
! 			buf[save_len] = '\0';
! 			return 1;
! 		}
  	}
! 	i += strlen(pname);
! 	strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
  	if (stat(buf, &statbuf) == 0) {
! 		if (case_ok(buf,
! 			    save_len + 9,	/* len("/__init__") */
! 		            8,   		/* len("__init__") */
! 		            pname)) {
! 			buf[save_len] = '\0';
! 			return 1;
! 		}
  	}
  	buf[save_len] = '\0';