mirror of https://github.com/python/cpython.git
Patch by Brian Hooper, somewhat augmented by GvR, to strip a trailing
backslash from the pathname argument to stat() on Windows -- while on Unix, stat("/bin/") succeeds and does the same thing as stat("/bin"), on Windows, stat("\\windows\\") fails while stat("\\windows") succeeds. This modified version of the patch recognizes both / and \. (This is odd behavior of the MS C library, since os.listdir("\\windows\\") succeeds!)
This commit is contained in:
parent
e0cd291b81
commit
ace88aebbb
|
@ -549,8 +549,36 @@ posix_do_stat(self, args, format, statfunc)
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char *path;
|
char *path;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
#ifdef MS_WIN32
|
||||||
|
int pathlen;
|
||||||
|
char pathcopy[MAX_PATH];
|
||||||
|
#endif /* MS_WIN32 */
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, format, &path))
|
if (!PyArg_ParseTuple(args, format, &path))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
#ifdef MS_WIN32
|
||||||
|
pathlen = strlen(path);
|
||||||
|
/* the library call can blow up if the file name is too long! */
|
||||||
|
if (pathlen > MAX_PATH) {
|
||||||
|
errno = ENAMETOOLONG;
|
||||||
|
return posix_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((pathlen > 0) && (path[pathlen-1] == '\\' || path[pathlen-1] == '/')) {
|
||||||
|
/* exception for drive root */
|
||||||
|
if (!((pathlen == 3) &&
|
||||||
|
(path[1] == ':') &&
|
||||||
|
(path[2] == '\\' || path[2] == '/')))
|
||||||
|
{
|
||||||
|
strncpy(pathcopy, path, pathlen);
|
||||||
|
pathcopy[pathlen-1] = '\0'; /* nuke the trailing backslash */
|
||||||
|
path = pathcopy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* MS_WIN32 */
|
||||||
|
|
||||||
Py_BEGIN_ALLOW_THREADS
|
Py_BEGIN_ALLOW_THREADS
|
||||||
res = (*statfunc)(path, &st);
|
res = (*statfunc)(path, &st);
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
|
|
Loading…
Reference in New Issue