[Python-checkins] python/dist/src/Modules posixmodule.c, 2.317, 2.318

loewis at users.sourceforge.net loewis at users.sourceforge.net
Wed Jun 2 05:57:59 EDT 2004


Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20167/Modules

Modified Files:
	posixmodule.c 
Log Message:
Patch #954115: Fix os.stat handling of UNC roots.
Will backport to 2.3.

Index: posixmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/posixmodule.c,v
retrieving revision 2.317
retrieving revision 2.318
diff -C2 -d -r2.317 -r2.318
*** posixmodule.c	4 May 2004 08:10:37 -0000	2.317
--- posixmodule.c	2 Jun 2004 09:57:56 -0000	2.318
***************
*** 893,896 ****
--- 893,956 ----
  }
  
+ #ifdef MS_WINDOWS
+ 
+ /* IsUNCRoot -- test whether the supplied path is of the form \\SERVER\SHARE\,
+    where / can be used in place of \ and the trailing slash is optional.
+    Both SERVER and SHARE must have at least one character.
+ */
+ 
+ #define ISSLASHA(c) ((c) == '\\' || (c) == '/')
+ #define ISSLASHW(c) ((c) == L'\\' || (c) == L'/')
+ #define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
+ 
+ static BOOL 
+ IsUNCRootA(char *path, int pathlen)
+ {
+ 	#define ISSLASH ISSLASHA
+ 
+ 	int i, share;
+ 
+ 	if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1]))
+ 		/* minimum UNCRoot is \\x\y */
+ 		return FALSE;
+ 	for (i = 2; i < pathlen ; i++)
+ 		if (ISSLASH(path[i])) break;
+ 	if (i == 2 || i == pathlen)
+ 		/* do not allow \\\SHARE or \\SERVER */
+ 		return FALSE;
+ 	share = i+1;
+ 	for (i = share; i < pathlen; i++)
+ 		if (ISSLASH(path[i])) break;
+ 	return (i != share && (i == pathlen || i == pathlen-1));
+ 
+ 	#undef ISSLASH
+ }
+ 
+ #ifdef Py_WIN_WIDE_FILENAMES
+ static BOOL 
+ IsUNCRootW(Py_UNICODE *path, int pathlen)
+ {
+ 	#define ISSLASH ISSLASHW
+ 
+ 	int i, share;
+ 
+ 	if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1]))
+ 		/* minimum UNCRoot is \\x\y */
+ 		return FALSE;
+ 	for (i = 2; i < pathlen ; i++)
+ 		if (ISSLASH(path[i])) break;
+ 	if (i == 2 || i == pathlen)
+ 		/* do not allow \\\SHARE or \\SERVER */
+ 		return FALSE;
+ 	share = i+1;
+ 	for (i = share; i < pathlen; i++)
+ 		if (ISSLASH(path[i])) break;
+ 	return (i != share && (i == pathlen || i == pathlen-1));
+ 
+ 	#undef ISSLASH
+ }
+ #endif /* Py_WIN_WIDE_FILENAMES */
+ #endif /* MS_WINDOWS */
+ 
  static PyObject *
  posix_do_stat(PyObject *self, PyObject *args,
***************
*** 932,944 ****
  			   drive root (/ or \) or a specific drive's root (like c:\ or c:/).
  			*/
! 			if (pathlen > 0 &&
! 				(wpath[pathlen-1]== L'\\' || wpath[pathlen-1] == L'/')) {
! 	    			/* It does end with a slash -- exempt the root drive cases. */
! 	    			/* XXX UNC root drives should also be exempted? */
! 				if (pathlen == 1 || (pathlen == 3 && wpath[1] == L':'))
! 	    			/* leave it alone */;
! 	    		else {
! 					/* nuke the trailing backslash */
! 					wpath[pathlen-1] = L'\0';
  				}
  			}
--- 992,1011 ----
  			   drive root (/ or \) or a specific drive's root (like c:\ or c:/).
  			*/
! 			if (pathlen > 0) {
! 				if (ISSLASHW(wpath[pathlen-1])) {
! 	    				/* It does end with a slash -- exempt the root drive cases. */
! 					if (pathlen == 1 || (pathlen == 3 && wpath[1] == L':') || 
! 						IsUNCRootW(wpath, pathlen))
! 	    					/* leave it alone */;
! 					else {
! 						/* nuke the trailing backslash */
! 						wpath[pathlen-1] = L'\0';
! 					}
! 				}
! 				else if (ISSLASHW(wpath[1]) && pathlen < ARRAYSIZE(wpath)-1 && 
! 					IsUNCRootW(wpath, pathlen)) {
! 					/* UNC root w/o trailing slash: add one when there's room */
! 					wpath[pathlen++] = L'\\';
! 					wpath[pathlen] = L'\0';
  				}
  			}
***************
*** 975,988 ****
  	   drive root (/ or \) or a specific drive's root (like c:\ or c:/).
  	*/
! 	if (pathlen > 0 &&
! 	    (path[pathlen-1]== '\\' || path[pathlen-1] == '/')) {
! 	    	/* It does end with a slash -- exempt the root drive cases. */
! 	    	/* XXX UNC root drives should also be exempted? */
! 	    	if (pathlen == 1 || (pathlen == 3 && path[1] == ':'))
! 	    		/* leave it alone */;
! 	    	else {
! 			/* nuke the trailing backslash */
  			strncpy(pathcopy, path, pathlen);
! 			pathcopy[pathlen-1] = '\0';
  			path = pathcopy;
  		}
--- 1042,1064 ----
  	   drive root (/ or \) or a specific drive's root (like c:\ or c:/).
  	*/
! 	if (pathlen > 0) {
! 		if (ISSLASHA(path[pathlen-1])) {
! 			/* It does end with a slash -- exempt the root drive cases. */
! 			if (pathlen == 1 || (pathlen == 3 && path[1] == ':') || 
! 				IsUNCRootA(path, pathlen))
! 	    			/* leave it alone */;
! 			else {
! 				/* nuke the trailing backslash */
! 				strncpy(pathcopy, path, pathlen);
! 				pathcopy[pathlen-1] = '\0';
! 				path = pathcopy;
! 			}
! 		}
! 		else if (ISSLASHA(path[1]) && pathlen < ARRAYSIZE(pathcopy)-1 && 
! 			IsUNCRootA(path, pathlen)) {
! 			/* UNC root w/o trailing slash: add one when there's room */
  			strncpy(pathcopy, path, pathlen);
! 			pathcopy[pathlen++] = '\\';
! 			pathcopy[pathlen] = '\0';
  			path = pathcopy;
  		}




More information about the Python-checkins mailing list