Bump.
-----------------------------------------------
commit 92f58b2a1cd576c3e72303004388ab1e9709e327 (ldd-read-rv)
from: Lucas <[email protected]>
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++)