rtld: call close(2) after errno is saved

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
This commit is contained in:
Konstantin Belousov 2021-01-02 00:24:46 +02:00
parent 0cdfa49564
commit 741d78126b

View File

@ -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)
@ -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;
}
@ -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;