M1 loader uses realpath

This commit is contained in:
Jōshin 2023-12-14 20:11:10 -05:00
parent 2b2a38b5ae
commit 91a70f6749
No known key found for this signature in database

View file

@ -316,17 +316,21 @@ __attribute__((__noreturn__)) static void Pexit(const char *c, int failed,
} }
static char AccessCommand(struct PathSearcher *ps, unsigned long pathlen) { static char AccessCommand(struct PathSearcher *ps, unsigned long pathlen) {
if (!pathlen && *ps->name != '/') { char buf[PATH_MAX];
if (!getcwd(ps->path, sizeof(ps->path) - 1 - ps->namelen)) { size_t n;
Pexit("getcwd", -errno, "failed"); if (pathlen + 1 + ps->namelen + 1 > sizeof(ps->path)) {
}
pathlen = strlen(ps->path);
} else if (pathlen + 1 + ps->namelen + 1 > sizeof(ps->path)) {
return 0; return 0;
} }
if (pathlen && ps->path[pathlen - 1] != '/') ps->path[pathlen++] = '/'; if (pathlen && ps->path[pathlen - 1] != '/') ps->path[pathlen++] = '/';
memmove(ps->path + pathlen, ps->name, ps->namelen); memmove(ps->path + pathlen, ps->name, ps->namelen);
ps->path[pathlen + ps->namelen] = 0; ps->path[pathlen + ps->namelen] = 0;
if (!realpath(ps->path, buf)) {
Pexit(ps->path, -errno, "realpath");
}
if ((n = strlen(buf)) >= sizeof(ps->path)) {
Pexit(buf, 0, "too long");
}
memcpy(ps->path, buf, n + 1);
if (!access(ps->path, X_OK)) { if (!access(ps->path, X_OK)) {
if (ps->indirect) { if (ps->indirect) {
ps->namelen -= 4; ps->namelen -= 4;