Fix a problem for long symlinks in conda (#15908) [backport]

* d8c80ea69d (diff-e1d8e552330911f9f779f85b6f2c00a15e790dcc3fbb3b28f5da1d660a30c5b8)
This commit is contained in:
Christopher Dunn
2020-11-12 02:32:38 -06:00
committed by GitHub
parent 402df0b061
commit c6ceefea6d

View File

@@ -1172,6 +1172,7 @@ when not defined(windows) and not weirdTarget:
else: result = S_ISLNK(rawInfo.st_mode)
const
maxSymlinkLen = 1024
ExeExts* = ## Platform specific file extension for executables.
## On Windows ``["exe", "cmd", "bat"]``, on Posix ``[""]``.
when defined(windows): ["exe", "cmd", "bat"] else: [""]
@@ -1213,11 +1214,11 @@ proc findExe*(exe: string, followSymlinks: bool = true;
when not defined(windows):
while followSymlinks: # doubles as if here
if x.checkSymlink:
var r = newString(256)
var len = readlink(x, r, 256)
var r = newString(maxSymlinkLen)
var len = readlink(x, r, maxSymlinkLen)
if len < 0:
raiseOSError(osLastError(), exe)
if len > 256:
if len > maxSymlinkLen:
r = newString(len+1)
len = readlink(x, r, len)
setLen(r, len)
@@ -2561,11 +2562,11 @@ proc expandSymlink*(symlinkPath: string): string {.noWeirdTarget.} =
when defined(windows):
result = symlinkPath
else:
result = newString(256)
var len = readlink(symlinkPath, result, 256)
result = newString(maxSymlinkLen)
var len = readlink(symlinkPath, result, maxSymlinkLen)
if len < 0:
raiseOSError(osLastError(), symlinkPath)
if len > 256:
if len > maxSymlinkLen:
result = newString(len+1)
len = readlink(symlinkPath, result, len)
setLen(result, len)
@@ -2863,9 +2864,9 @@ when not weirdTarget and (defined(freebsd) or defined(dragonfly) or defined(netb
when not weirdTarget and (defined(linux) or defined(solaris) or defined(bsd) or defined(aix)):
proc getApplAux(procPath: string): string =
result = newString(256)
var len = readlink(procPath, result, 256)
if len > 256:
result = newString(maxSymlinkLen)
var len = readlink(procPath, result, maxSymlinkLen)
if len > maxSymlinkLen:
result = newString(len+1)
len = readlink(procPath, result, len)
setLen(result, len)