Changeset View
Changeset View
Standalone View
Standalone View
libexec/rtld-elf/libmap.c
Show First 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
lmc_parse_file(const char *path) | lmc_parse_file(const char *path) | ||||
{ | { | ||||
struct lmc *p; | struct lmc *p; | ||||
char *lm_map; | char *lm_map; | ||||
struct stat st; | struct stat st; | ||||
ssize_t retval; | ssize_t retval; | ||||
int fd; | int fd, saved_errno; | ||||
kib: We call such variable saved_errno in other places. | |||||
TAILQ_FOREACH(p, &lmc_head, next) { | TAILQ_FOREACH(p, &lmc_head, next) { | ||||
if (strcmp(p->path, path) == 0) | if (strcmp(p->path, path) == 0) | ||||
return; | return; | ||||
} | } | ||||
fd = open(path, O_RDONLY | O_CLOEXEC); | fd = open(path, O_RDONLY | O_CLOEXEC); | ||||
if (fd == -1) { | if (fd == -1) { | ||||
dbg("lm_parse_file: open(\"%s\") failed, %s", path, | dbg("lm_parse_file: open(\"%s\") failed, %s", path, | ||||
rtld_strerror(errno)); | rtld_strerror(errno)); | ||||
return; | return; | ||||
} | } | ||||
if (fstat(fd, &st) == -1) { | if (fstat(fd, &st) == -1) { | ||||
close(fd); | |||||
dbg("lm_parse_file: fstat(\"%s\") failed, %s", path, | dbg("lm_parse_file: fstat(\"%s\") failed, %s", path, | ||||
rtld_strerror(errno)); | rtld_strerror(errno)); | ||||
close(fd); | |||||
return; | return; | ||||
} | } | ||||
TAILQ_FOREACH(p, &lmc_head, next) { | TAILQ_FOREACH(p, &lmc_head, next) { | ||||
if (p->dev == st.st_dev && p->ino == st.st_ino) { | if (p->dev == st.st_dev && p->ino == st.st_ino) { | ||||
close(fd); | close(fd); | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
lm_map = xmalloc(st.st_size); | lm_map = xmalloc(st.st_size); | ||||
retval = read(fd, lm_map, st.st_size); | retval = read(fd, lm_map, st.st_size); | ||||
if (retval != st.st_size) { | saved_errno = errno; | ||||
close(fd); | close(fd); | ||||
free(lm_map); | if (retval != st.st_size) { | ||||
if (retval == -1) { | |||||
dbg("lm_parse_file: read(\"%s\") failed, %s", path, | dbg("lm_parse_file: read(\"%s\") failed, %s", path, | ||||
rtld_strerror(errno)); | rtld_strerror(saved_errno)); | ||||
} else { | |||||
dbg("lm_parse_file: short read(\"%s\"), %zd vs %jd", | |||||
Done Inline ActionsI suggest to issue different dbg() statements for case retval == -1 and retval >= 0. In the first case, use saved_errno, in second report something like 'short read' and print expected and returned lengths. kib: I suggest to issue different dbg() statements for case retval == -1 and retval >= 0. In the… | |||||
path, retval, (uintmax_t)st.st_size); | |||||
} | |||||
free(lm_map); | |||||
return; | return; | ||||
} | } | ||||
close(fd); | |||||
p = xmalloc(sizeof(struct lmc)); | p = xmalloc(sizeof(struct lmc)); | ||||
p->path = xstrdup(path); | p->path = xstrdup(path); | ||||
p->dev = st.st_dev; | p->dev = st.st_dev; | ||||
p->ino = st.st_ino; | p->ino = st.st_ino; | ||||
TAILQ_INSERT_HEAD(&lmc_head, p, next); | TAILQ_INSERT_HEAD(&lmc_head, p, next); | ||||
lmc_parse(lm_map, st.st_size); | lmc_parse(lm_map, st.st_size); | ||||
free(lm_map); | free(lm_map); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 343 Lines • Show Last 20 Lines |
We call such variable saved_errno in other places.