Skip to content

Commit

Permalink
rtld: call close(2) after errno is saved
Browse files Browse the repository at this point in the history
to prevent obliteration of error value from the original syscall.
Also improve error message for short read.

Submitted by:	Konrad Sewiłło-Jopek
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D27864
  • Loading branch information
kostikbel committed Jan 2, 2021
1 parent 0cdfa49 commit 741d781
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions libexec/rtld-elf/libmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ lmc_parse_file(const char *path)
char *lm_map;
struct stat st;
ssize_t retval;
int fd;
int fd, saved_errno;

TAILQ_FOREACH(p, &lmc_head, next) {
if (strcmp(p->path, path) == 0)
Expand All @@ -117,9 +117,9 @@ lmc_parse_file(const char *path)
return;
}
if (fstat(fd, &st) == -1) {
close(fd);
dbg("lm_parse_file: fstat(\"%s\") failed, %s", path,
rtld_strerror(errno));
close(fd);
return;
}

Expand All @@ -132,14 +132,19 @@ lmc_parse_file(const char *path)

lm_map = xmalloc(st.st_size);
retval = read(fd, lm_map, st.st_size);
saved_errno = errno;
close(fd);
if (retval != st.st_size) {
close(fd);
if (retval == -1) {
dbg("lm_parse_file: read(\"%s\") failed, %s", path,
rtld_strerror(saved_errno));
} else {
dbg("lm_parse_file: short read(\"%s\"), %zd vs %jd",
path, retval, (uintmax_t)st.st_size);
}
free(lm_map);
dbg("lm_parse_file: read(\"%s\") failed, %s", path,
rtld_strerror(errno));
return;
}
close(fd);
p = xmalloc(sizeof(struct lmc));
p->path = xstrdup(path);
p->dev = st.st_dev;
Expand Down

0 comments on commit 741d781

Please sign in to comment.