diff options
| author | 2025-10-20 17:15:37 +0200 | |
|---|---|---|
| committer | 2025-10-20 17:15:37 +0200 | |
| commit | 7d5361374ad0cbe64c6dbb8cce3fc8842ed6b066 (patch) | |
| tree | 859f862c0c27d8424dbeef4c5a774d411e84f32b | |
| parent | bd3caaa6a0a18bf3cd7038d97c7367b0282146d5 (diff) | |
io: reject non file files
| -rw-r--r-- | io.c | 35 | ||||
| -rw-r--r-- | main.c | 2 |
2 files changed, 20 insertions, 17 deletions
@@ -689,7 +689,23 @@ mapopen(const char **err, const char *path) if (fstat(fd, &stat) != 0) goto Err; - if (!S_ISREG(stat.st_mode)) { + if (S_ISREG(stat.st_mode)) { + if (stat.st_size > UINT_MAX) { + Big: + errno = EFBIG; + goto Err; + } + mapsiz = alignup(stat.st_size, pagesiz); + if ((p = mmap(NULL, mapsiz + pagesiz, PROT_READ, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0)) == MAP_FAILED) + goto Err; + if (mapsiz > 0 && mmap(p, mapsiz, PROT_READ, MAP_FIXED|MAP_PRIVATE, fd, 0) == MAP_FAILED) + goto Err; + + close(fd); + f.p = p; + f.n = stat.st_size; + return f; + } else if (S_ISFIFO(stat.st_mode) || S_ISCHR(stat.st_mode)) { uint cap = 0; int ret; @@ -723,23 +739,10 @@ mapopen(const char **err, const char *path) free(p); mprotect((void *)f.p, mapsiz + pagesiz, PROT_READ); return f; + } else { + *err = "Not a file"; } - if (stat.st_size > UINT_MAX) { - Big: - errno = EFBIG; - goto Err; - } - mapsiz = alignup(stat.st_size, pagesiz); - if ((p = mmap(NULL, mapsiz + pagesiz, PROT_READ, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0)) == MAP_FAILED) - goto Err; - if (mapsiz > 0 && mmap(p, mapsiz, PROT_READ, MAP_FIXED|MAP_PRIVATE, fd, 0) == MAP_FAILED) - goto Err; - - close(fd); - f.p = p; - f.n = stat.st_size; - return f; Err: if (fd >= 0) close(fd); if (!*err) *err = strerror(errno); @@ -105,7 +105,7 @@ optparse(char **args) while ((arg = *++args)) { if (*arg++ != '-' || !*arg) { assert(task.ninf < arraylength(task.inf) && "too many infiles"); - task.inf[task.ninf] = *arg ? arg-1 : "/dev/stdin"; + task.inf[task.ninf] = arg[-1] != '-' ? arg-1 : "/dev/stdin"; task.inft[task.ninf] = ft ? ft : ftdetect(arg-1); ++task.ninf; ft = IFTauto; |