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:
parent
0cdfa49564
commit
741d78126b
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user