diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-06-25 13:02:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-25 13:02:43 (GMT) |
commit | 3939c321c90283b49eddde762656e4b1940e7150 (patch) | |
tree | f2b8429629e80925feac81280c7696a16a0328ea /Modules/getpath.c | |
parent | 080b6b40fa6c6ddc79dcfcadab575bb1be3f47e9 (diff) | |
download | cpython-3939c321c90283b49eddde762656e4b1940e7150.zip cpython-3939c321c90283b49eddde762656e4b1940e7150.tar.gz cpython-3939c321c90283b49eddde762656e4b1940e7150.tar.bz2 |
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/getpath.c')
-rw-r--r-- | Modules/getpath.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/Modules/getpath.c b/Modules/getpath.c index 5f80738..751c0b7 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -240,7 +240,7 @@ static PyStatus joinpath(wchar_t *buffer, const wchar_t *stuff, size_t buflen) { size_t n, k; - if (stuff[0] != SEP) { + if (!_Py_isabs(stuff)) { n = wcslen(buffer); if (n >= buflen) { return PATHLEN_ERR(); @@ -283,7 +283,7 @@ safe_wcscpy(wchar_t *dst, const wchar_t *src, size_t n) static PyStatus copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen) { - if (p[0] == SEP) { + if (_Py_isabs(p)) { if (safe_wcscpy(path, p, pathlen) < 0) { return PATHLEN_ERR(); } @@ -312,7 +312,7 @@ copy_absolute(wchar_t *path, const wchar_t *p, size_t pathlen) static PyStatus absolutize(wchar_t *path, size_t path_len) { - if (path[0] == SEP) { + if (_Py_isabs(path)) { return _PyStatus_OK(); } @@ -761,7 +761,7 @@ calculate_program_full_path(const PyConfig *config, * absolutize() should help us out below */ else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) && - execpath[0] == SEP) + _Py_isabs(execpath)) { size_t len; wchar_t *path = Py_DecodeLocale(execpath, &len); @@ -815,7 +815,7 @@ calculate_program_full_path(const PyConfig *config, else { program_full_path[0] = '\0'; } - if (program_full_path[0] != SEP && program_full_path[0] != '\0') { + if (!_Py_isabs(program_full_path) && program_full_path[0] != '\0') { status = absolutize(program_full_path, program_full_path_len); if (_PyStatus_EXCEPTION(status)) { return status; @@ -916,7 +916,7 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_pat const size_t buflen = Py_ARRAY_LENGTH(tmpbuffer); int linklen = _Py_wreadlink(program_full_path, tmpbuffer, buflen); while (linklen != -1) { - if (tmpbuffer[0] == SEP) { + if (_Py_isabs(tmpbuffer)) { /* tmpbuffer should never be longer than MAXPATHLEN, but extra check does not hurt */ if (safe_wcscpy(calculate->argv0_path, tmpbuffer, argv0_path_len) < 0) { @@ -1046,7 +1046,7 @@ calculate_module_search_path(const PyConfig *config, while (1) { wchar_t *delim = wcschr(defpath, DELIM); - if (defpath[0] != SEP) { + if (!_Py_isabs(defpath)) { /* Paths are relative to prefix */ bufsz += prefixsz; } @@ -1088,7 +1088,7 @@ calculate_module_search_path(const PyConfig *config, while (1) { wchar_t *delim = wcschr(defpath, DELIM); - if (defpath[0] != SEP) { + if (!_Py_isabs(defpath)) { wcscat(buf, prefix); if (prefixsz >= 2 && prefix[prefixsz - 2] != SEP && defpath[0] != (delim ? DELIM : L'\0')) |