mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-17 00:07:04 -04:00
solaris may return short reads on resolve.conf; fix from tor cvs via Nick Mathewson
svn:r358
This commit is contained in:
parent
d0111a29e9
commit
5be24333ae
15
evdns.c
15
evdns.c
@ -2649,7 +2649,7 @@ resolv_conf_parse_line(char *const start, int flags) {
|
|||||||
int
|
int
|
||||||
evdns_resolv_conf_parse(int flags, const char *const filename) {
|
evdns_resolv_conf_parse(int flags, const char *const filename) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int fd;
|
int fd, n, r;
|
||||||
u8 *resolv;
|
u8 *resolv;
|
||||||
char *start;
|
char *start;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
@ -2673,10 +2673,15 @@ evdns_resolv_conf_parse(int flags, const char *const filename) {
|
|||||||
resolv = (u8 *) malloc((size_t)st.st_size + 1);
|
resolv = (u8 *) malloc((size_t)st.st_size + 1);
|
||||||
if (!resolv) { err = 4; goto out1; }
|
if (!resolv) { err = 4; goto out1; }
|
||||||
|
|
||||||
if (read(fd, resolv, (size_t)st.st_size) != st.st_size) {
|
n = 0;
|
||||||
err = 5; goto out2;
|
while ((r = read(fd, resolv+n, (size_t)st.st_size-n)) > 0) {
|
||||||
}
|
n += r;
|
||||||
resolv[st.st_size] = 0; // we malloced an extra byte
|
if (n == st.st_size)
|
||||||
|
break;
|
||||||
|
assert(n < st.st_size);
|
||||||
|
}
|
||||||
|
if (r < 0) { err = 5; goto out2; }
|
||||||
|
resolv[n] = 0; // we malloced an extra byte; this should be fine.
|
||||||
|
|
||||||
start = (char *) resolv;
|
start = (char *) resolv;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user