Loading src/linux/stdlib.cpp +7 −5 Changes for src/linux/stdlib.cpp: 7 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -242,14 +242,16 @@ extern "C" { ssize_t n = readlink(out, target, sizeof target - 1); if (n < 0) return nullptr; target[n] = 0; // new rest = target + remaining // new rest = target + remaining; the remaining part is // empty or starts with '/' (no '/' of its own: a link as // the last component must not look like "target/", which // the directory check below would refuse for a file) size_t remain = strlen(rest + pos); if ((size_t)n + 1 + remain >= sizeof rest) { errno = ENAMETOOLONG; return nullptr; } if ((size_t)n + remain >= sizeof rest) { errno = ENAMETOOLONG; return nullptr; } char tmp[PATH_MAX]; memcpy(tmp, target, (size_t)n); tmp[n] = '/'; memcpy(tmp + n + 1, rest + pos, remain + 1); memcpy(rest, tmp, (size_t)n + 1 + remain + 1); memcpy(tmp + n, rest + pos, remain + 1); memcpy(rest, tmp, (size_t)n + remain + 1); pos = 0; if (target[0] == '/') { out[0] = '/'; out[1] = 0; olen = 1; } else { olen = prev; out[olen] = 0; } Loading Loading
src/linux/stdlib.cpp +7 −5 Changes for src/linux/stdlib.cpp: 7 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -242,14 +242,16 @@ extern "C" { ssize_t n = readlink(out, target, sizeof target - 1); if (n < 0) return nullptr; target[n] = 0; // new rest = target + remaining // new rest = target + remaining; the remaining part is // empty or starts with '/' (no '/' of its own: a link as // the last component must not look like "target/", which // the directory check below would refuse for a file) size_t remain = strlen(rest + pos); if ((size_t)n + 1 + remain >= sizeof rest) { errno = ENAMETOOLONG; return nullptr; } if ((size_t)n + remain >= sizeof rest) { errno = ENAMETOOLONG; return nullptr; } char tmp[PATH_MAX]; memcpy(tmp, target, (size_t)n); tmp[n] = '/'; memcpy(tmp + n + 1, rest + pos, remain + 1); memcpy(rest, tmp, (size_t)n + 1 + remain + 1); memcpy(tmp + n, rest + pos, remain + 1); memcpy(rest, tmp, (size_t)n + remain + 1); pos = 0; if (target[0] == '/') { out[0] = '/'; out[1] = 0; olen = 1; } else { olen = prev; out[olen] = 0; } Loading