Bump. ----------------------------------------------- commit 92f58b2a1cd576c3e72303004388ab1e9709e327 (ldd-read-rv) from: Lucas <lucas@domain.invalid> date: Sat Aug 5 16:34:16 2023 UTC Check {,p}read return values consistently Check that read performs a full header read. Explicitly check against -1 for failure instead of < 0. Split pread error message between error handling and short reads. Promote size from int to size_t. M libexec/ld.so/ldd/ldd.c
diff 194ff02fb6be247e27fe964e901d891d99ec0b74 92f58b2a1cd576c3e72303004388ab1e9709e327 commit - 194ff02fb6be247e27fe964e901d891d99ec0b74 commit + 92f58b2a1cd576c3e72303004388ab1e9709e327 blob - 9e8c5065cd843ff36d91efcb868b94ffd4c98365 blob + 532feb9855a03480c289fa2188768657a4f82e7c --- libexec/ld.so/ldd/ldd.c +++ libexec/ld.so/ldd/ldd.c @@ -96,7 +96,9 @@ doit(char *name) { Elf_Ehdr ehdr; Elf_Phdr *phdr; - int fd, i, size, status, interp=0; + size_t size; + ssize_t nr; + int fd, i, status, interp=0; char buf[PATH_MAX]; struct stat st; void * dlhandle; @@ -118,11 +120,16 @@ doit(char *name) return 1; } - if (read(fd, &ehdr, sizeof(ehdr)) < 0) { + if ((nr = read(fd, &ehdr, sizeof(ehdr))) == -1) { warn("read(%s)", name); close(fd); return 1; } + if (nr != sizeof(ehdr)) { + warnx("%s: incomplete ELF header", name); + close(fd); + return 1; + } if (!IS_ELF(ehdr) || ehdr.e_machine != ELF_TARG_MACH) { warnx("%s: not an ELF executable", name); @@ -140,12 +147,18 @@ doit(char *name) err(1, "reallocarray"); size = ehdr.e_phnum * sizeof(Elf_Phdr); - if (pread(fd, phdr, size, ehdr.e_phoff) != size) { - warn("read(%s)", name); + if ((nr = pread(fd, phdr, size, ehdr.e_phoff)) == -1) { + warn("pread(%s)", name); close(fd); free(phdr); return 1; } + if (nr != size) { + warnx("%s: incomplete program header", name); + close(fd); + free(phdr); + return 1; + } close(fd); for (i = 0; i < ehdr.e_phnum; i++)