From c6ceefea6de2a0159f33722839bfe9a0ce9134e1 Mon Sep 17 00:00:00 2001 From: Christopher Dunn Date: Thu, 12 Nov 2020 02:32:38 -0600 Subject: [PATCH] Fix a problem for long symlinks in conda (#15908) [backport] * https://github.com/conda-forge/nim-feedstock/commit/d8c80ea69dca30d99073d33845ddd79f9892755b#diff-e1d8e552330911f9f779f85b6f2c00a15e790dcc3fbb3b28f5da1d660a30c5b8 --- lib/pure/os.nim | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 2601f9d47d..234d82bc2e 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -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)