diff options
| author | grunfink <grunfink@noreply.codeberg.org> | 2026-03-27 17:03:47 +0100 |
|---|---|---|
| committer | grunfink <grunfink@noreply.codeberg.org> | 2026-03-27 17:03:47 +0100 |
| commit | 8afb69c5b63fbd148f70e93b2f125bea52e6502d (patch) | |
| tree | 32c124ddd3f538947682baf12c9b3dbff24e0d67 | |
| parent | 9a1b78113e7fd728acd5cb6b58c24fb53f24f99a (diff) | |
| parent | 2c9f5956b5ad435bff157182210c5fd9560f1e95 (diff) | |
Merge pull request 'Drop `PATH_MAX` usage' (#593) from sergiodj/snac2:drop-PATH_MAX-usage into master
Reviewed-on: https://codeberg.org/grunfink/snac2/pulls/593
| -rw-r--r-- | snac.c | 13 |
1 files changed, 9 insertions, 4 deletions
@@ -182,8 +182,9 @@ int check_password(const char *uid, const char *passwd, const char *hash) char* findprog(const char *prog) /* find a prog in PATH and return the first match */ { - char *path_env, *path, *dir, filename[PATH_MAX]; + char *path_env, *path, *dir, *filename; int len; + size_t filename_sz; struct stat sbuf; path_env = getenv("PATH"); @@ -195,6 +196,9 @@ char* findprog(const char *prog) return NULL; path = path_env; + filename_sz = strlen(path) + strlen(prog) + 2; + filename = xs_realloc(NULL, filename_sz); + while ((dir = strsep(&path, ":")) != NULL) { /* empty entries as ./ instead of / */ if (*dir == '\0') @@ -205,16 +209,17 @@ char* findprog(const char *prog) while (len > 0 && dir[len-1] == '/') dir[--len] = '\0'; - len = snprintf(filename, sizeof(filename), "%s/%s", dir, prog); - if (len > 0 && len < (int) sizeof(filename) && + len = snprintf(filename, filename_sz, "%s/%s", dir, prog); + if (len > 0 && len < (int) filename_sz && (stat(filename, &sbuf) == 0) && S_ISREG(sbuf.st_mode) && access(filename, X_OK) == 0) { free(path_env); - return strdup(filename); + return filename; } } free(path_env); + xs_free(filename); return NULL; } |