mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
gh-106242: Fix path truncation in os.path.normpath (GH-106816)
This commit is contained in:
parent
607f18c894
commit
0932272431
5 changed files with 30 additions and 9 deletions
|
@ -2377,12 +2377,14 @@ _Py_find_basename(const wchar_t *filename)
|
|||
path, which will be within the original buffer. Guaranteed to not
|
||||
make the path longer, and will not fail. 'size' is the length of
|
||||
the path, if known. If -1, the first null character will be assumed
|
||||
to be the end of the path. */
|
||||
to be the end of the path. 'normsize' will be set to contain the
|
||||
length of the resulting normalized path. */
|
||||
wchar_t *
|
||||
_Py_normpath(wchar_t *path, Py_ssize_t size)
|
||||
_Py_normpath_and_size(wchar_t *path, Py_ssize_t size, Py_ssize_t *normsize)
|
||||
{
|
||||
assert(path != NULL);
|
||||
if (!path[0] || size == 0) {
|
||||
if (!path[0] && size < 0 || size == 0) {
|
||||
*normsize = 0;
|
||||
return path;
|
||||
}
|
||||
wchar_t *pEnd = size >= 0 ? &path[size] : NULL;
|
||||
|
@ -2431,11 +2433,7 @@ _Py_normpath(wchar_t *path, Py_ssize_t size)
|
|||
*p2++ = lastC = *p1;
|
||||
}
|
||||
}
|
||||
if (sepCount) {
|
||||
minP2 = p2; // Invalid path
|
||||
} else {
|
||||
minP2 = p2 - 1; // Absolute path has SEP at minP2
|
||||
}
|
||||
minP2 = p2 - 1;
|
||||
}
|
||||
#else
|
||||
// Skip past two leading SEPs
|
||||
|
@ -2495,13 +2493,28 @@ _Py_normpath(wchar_t *path, Py_ssize_t size)
|
|||
while (--p2 != minP2 && *p2 == SEP) {
|
||||
*p2 = L'\0';
|
||||
}
|
||||
} else {
|
||||
--p2;
|
||||
}
|
||||
*normsize = p2 - path + 1;
|
||||
#undef SEP_OR_END
|
||||
#undef IS_SEP
|
||||
#undef IS_END
|
||||
return path;
|
||||
}
|
||||
|
||||
/* In-place path normalisation. Returns the start of the normalized
|
||||
path, which will be within the original buffer. Guaranteed to not
|
||||
make the path longer, and will not fail. 'size' is the length of
|
||||
the path, if known. If -1, the first null character will be assumed
|
||||
to be the end of the path. */
|
||||
wchar_t *
|
||||
_Py_normpath(wchar_t *path, Py_ssize_t size)
|
||||
{
|
||||
Py_ssize_t norm_length;
|
||||
return _Py_normpath_and_size(path, size, &norm_length);
|
||||
}
|
||||
|
||||
|
||||
/* Get the current directory. buflen is the buffer size in wide characters
|
||||
including the null character. Decode the path from the locale encoding.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue