summaryrefslogtreecommitdiff
path: root/Modules/posixmodule.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-06-25 15:02:43 +0200
committerGitHub <noreply@github.com>2019-06-25 15:02:43 +0200
commit3939c321c90283b49eddde762656e4b1940e7150 (patch)
treef2b8429629e80925feac81280c7696a16a0328ea /Modules/posixmodule.c
parent080b6b40fa6c6ddc79dcfcadab575bb1be3f47e9 (diff)
downloadcpython-git-3939c321c90283b49eddde762656e4b1940e7150.tar.gz
bpo-20443: _PyConfig_Read() gets the absolute path of run_filename (GH-14053)
Python now gets the absolute path of the script filename specified on the command line (ex: "python3 script.py"): the __file__ attribute of the __main__ module, sys.argv[0] and sys.path[0] become an absolute path, rather than a relative path. * Add _Py_isabs() and _Py_abspath() functions. * _PyConfig_Read() now tries to get the absolute path of run_filename, but keeps the relative path if _Py_abspath() fails. * Reimplement os._getfullpathname() using _Py_abspath(). * Use _Py_isabs() in getpath.c.
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r--Modules/posixmodule.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index b2fd45b901..10549d6f60 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -3784,29 +3784,25 @@ static PyObject *
os__getfullpathname_impl(PyObject *module, path_t *path)
/*[clinic end generated code: output=bb8679d56845bc9b input=332ed537c29d0a3e]*/
{
- wchar_t woutbuf[MAX_PATH], *woutbufp = woutbuf;
- wchar_t *wtemp;
- DWORD result;
- PyObject *v;
+ wchar_t *abspath;
- result = GetFullPathNameW(path->wide,
- Py_ARRAY_LENGTH(woutbuf),
- woutbuf, &wtemp);
- if (result > Py_ARRAY_LENGTH(woutbuf)) {
- woutbufp = PyMem_New(wchar_t, result);
- if (!woutbufp)
- return PyErr_NoMemory();
- result = GetFullPathNameW(path->wide, result, woutbufp, &wtemp);
+ /* _Py_abspath() is implemented with GetFullPathNameW() on Windows */
+ if (_Py_abspath(path->wide, &abspath) < 0) {
+ return win32_error_object("GetFullPathNameW", path->object);
}
- if (result) {
- v = PyUnicode_FromWideChar(woutbufp, wcslen(woutbufp));
- if (path->narrow)
- Py_SETREF(v, PyUnicode_EncodeFSDefault(v));
- } else
- v = win32_error_object("GetFullPathNameW", path->object);
- if (woutbufp != woutbuf)
- PyMem_Free(woutbufp);
- return v;
+ if (abspath == NULL) {
+ return PyErr_NoMemory();
+ }
+
+ PyObject *str = PyUnicode_FromWideChar(abspath, wcslen(abspath));
+ PyMem_RawFree(abspath);
+ if (str == NULL) {
+ return NULL;
+ }
+ if (path->narrow) {
+ Py_SETREF(str, PyUnicode_EncodeFSDefault(str));
+ }
+ return str;
}