From: Hirokazu Yamamoto Date: Sat, 8 Nov 2008 03:46:17 +0000 (+0000) Subject: Issue #4071: ntpath.abspath returned an empty string for long unicode path. X-Git-Tag: v2.7a1~2674 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed29bb49f8c6305d00e589fb503f10d5aedd99a1;p=thirdparty%2FPython%2Fcpython.git Issue #4071: ntpath.abspath returned an empty string for long unicode path. --- diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 39387a92be1c..409974aa2ba2 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2389,13 +2389,27 @@ posix__getfullpathname(PyObject *self, PyObject *args) if (unicode_file_names()) { PyUnicodeObject *po; if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po)) { - Py_UNICODE woutbuf[MAX_PATH*2]; + Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po); + Py_UNICODE woutbuf[MAX_PATH*2], *woutbufp = woutbuf; Py_UNICODE *wtemp; - if (!GetFullPathNameW(PyUnicode_AS_UNICODE(po), - sizeof(woutbuf)/sizeof(woutbuf[0]), - woutbuf, &wtemp)) - return win32_error("GetFullPathName", ""); - return PyUnicode_FromUnicode(woutbuf, wcslen(woutbuf)); + DWORD result; + PyObject *v; + result = GetFullPathNameW(wpath, + sizeof(woutbuf)/sizeof(woutbuf[0]), + woutbuf, &wtemp); + if (result > sizeof(woutbuf)/sizeof(woutbuf[0])) { + woutbufp = malloc(result * sizeof(Py_UNICODE)); + if (!woutbufp) + return PyErr_NoMemory(); + result = GetFullPathNameW(wpath, result, woutbufp, &wtemp); + } + if (result) + v = PyUnicode_FromUnicode(woutbufp, wcslen(woutbufp)); + else + v = win32_error_unicode("GetFullPathNameW", wpath); + if (woutbufp != woutbuf) + free(woutbufp); + return v; } /* Drop the argument parsing error as narrow strings are also valid. */