Issue #9246: On POSIX, os.getcwd() now supports paths longer than 1025 bytes

Patch written by William Orr.
This commit is contained in:
Victor Stinner 2015-04-25 00:16:10 +02:00
parent 9bdd61338d
commit 4403d7def0
2 changed files with 30 additions and 7 deletions

View File

@ -34,6 +34,9 @@ Core and Builtins
Library
-------
- Issue #9246: On POSIX, os.getcwd() now supports paths longer than 1025 bytes.
Patch written by William Orr.
- Issue #23008: Fixed resolving attributes with boolean value is False in pydoc.
- Fix asyncio issue 235: LifoQueue and PriorityQueue's put didn't

View File

@ -3418,12 +3418,15 @@ posix_lchown(PyObject *self, PyObject *args)
static PyObject *
posix_getcwd(int use_bytes)
{
char buf[1026];
char *res;
char *buf, *tmpbuf;
char *cwd;
const size_t chunk = 1024;
size_t buflen = 0;
PyObject *obj;
#ifdef MS_WINDOWS
if (!use_bytes) {
wchar_t wbuf[1026];
wchar_t wbuf[MAXPATHLEN];
wchar_t *wbuf2 = wbuf;
PyObject *resobj;
DWORD len;
@ -3457,14 +3460,31 @@ posix_getcwd(int use_bytes)
return NULL;
#endif
buf = cwd = NULL;
Py_BEGIN_ALLOW_THREADS
res = getcwd(buf, sizeof buf);
do {
buflen += chunk;
tmpbuf = PyMem_RawRealloc(buf, buflen);
if (tmpbuf == NULL)
break;
buf = tmpbuf;
cwd = getcwd(buf, buflen);
} while (cwd == NULL && errno == ERANGE);
Py_END_ALLOW_THREADS
if (res == NULL)
if (cwd == NULL) {
PyMem_RawFree(buf);
return posix_error();
}
if (use_bytes)
return PyBytes_FromStringAndSize(buf, strlen(buf));
return PyUnicode_DecodeFSDefault(buf);
obj = PyBytes_FromStringAndSize(buf, strlen(buf));
else
obj = PyUnicode_DecodeFSDefault(buf);
PyMem_RawFree(buf);
return obj;
}
PyDoc_STRVAR(posix_getcwd__doc__,