Don't retry close() syscalls after an EINTR errors.

http://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/2019q1/012953.html
This commit is contained in:
Simon Kelley
2019-03-29 21:29:43 +00:00
parent 7673013d23
commit 5fc639cf9a

View File

@@ -552,7 +552,7 @@ int main (int argc, char **argv)
char *msg; char *msg;
/* close our copy of write-end */ /* close our copy of write-end */
while (retry_send(close(err_pipe[1]))); close(err_pipe[1]);
/* check for errors after the fork */ /* check for errors after the fork */
if (read_event(err_pipe[0], &ev, &msg)) if (read_event(err_pipe[0], &ev, &msg))
@@ -561,7 +561,7 @@ int main (int argc, char **argv)
_exit(EC_GOOD); _exit(EC_GOOD);
} }
while (retry_send(close(err_pipe[0]))); close(err_pipe[0]);
/* NO calls to die() from here on. */ /* NO calls to die() from here on. */
@@ -623,8 +623,7 @@ int main (int argc, char **argv)
err = 1; err = 1;
else else
{ {
while (retry_send(close(fd))); if (close(fd) == -1)
if (errno != 0)
err = 1; err = 1;
} }
} }
@@ -957,7 +956,7 @@ int main (int argc, char **argv)
/* finished start-up - release original process */ /* finished start-up - release original process */
if (err_pipe[1] != -1) if (err_pipe[1] != -1)
while (retry_send(close(err_pipe[1]))); close(err_pipe[1]);
if (daemon->port != 0) if (daemon->port != 0)
check_servers(); check_servers();
@@ -1483,7 +1482,7 @@ static void async_event(int pipe, time_t now)
do { do {
helper_write(); helper_write();
} while (!helper_buf_empty() || do_script_run(now)); } while (!helper_buf_empty() || do_script_run(now));
while (retry_send(close(daemon->helperfd))); close(daemon->helperfd);
} }
#endif #endif
@@ -1728,7 +1727,7 @@ static void check_dns_listeners(time_t now)
if (getsockname(confd, (struct sockaddr *)&tcp_addr, &tcp_len) == -1) if (getsockname(confd, (struct sockaddr *)&tcp_addr, &tcp_len) == -1)
{ {
while (retry_send(close(confd))); close(confd);
continue; continue;
} }
@@ -1793,7 +1792,7 @@ static void check_dns_listeners(time_t now)
if (!client_ok) if (!client_ok)
{ {
shutdown(confd, SHUT_RDWR); shutdown(confd, SHUT_RDWR);
while (retry_send(close(confd))); close(confd);
} }
else if (!option_bool(OPT_DEBUG) && pipe(pipefd) == 0 && (p = fork()) != 0) else if (!option_bool(OPT_DEBUG) && pipe(pipefd) == 0 && (p = fork()) != 0)
{ {
@@ -1812,7 +1811,7 @@ static void check_dns_listeners(time_t now)
break; break;
} }
} }
while (retry_send(close(confd))); close(confd);
/* The child can use up to TCP_MAX_QUERIES ids, so skip that many. */ /* The child can use up to TCP_MAX_QUERIES ids, so skip that many. */
daemon->log_id += TCP_MAX_QUERIES; daemon->log_id += TCP_MAX_QUERIES;
@@ -1858,7 +1857,7 @@ static void check_dns_listeners(time_t now)
buff = tcp_request(confd, now, &tcp_addr, netmask, auth_dns); buff = tcp_request(confd, now, &tcp_addr, netmask, auth_dns);
shutdown(confd, SHUT_RDWR); shutdown(confd, SHUT_RDWR);
while (retry_send(close(confd))); close(confd);
if (buff) if (buff)
free(buff); free(buff);
@@ -1867,7 +1866,7 @@ static void check_dns_listeners(time_t now)
if (s->tcpfd != -1) if (s->tcpfd != -1)
{ {
shutdown(s->tcpfd, SHUT_RDWR); shutdown(s->tcpfd, SHUT_RDWR);
while (retry_send(close(s->tcpfd))); close(s->tcpfd);
} }
if (!option_bool(OPT_DEBUG)) if (!option_bool(OPT_DEBUG))
{ {
@@ -1943,7 +1942,7 @@ int icmp_ping(struct in_addr addr)
gotreply = delay_dhcp(dnsmasq_time(), PING_WAIT, fd, addr.s_addr, id); gotreply = delay_dhcp(dnsmasq_time(), PING_WAIT, fd, addr.s_addr, id);
#if defined(HAVE_LINUX_NETWORK) || defined(HAVE_SOLARIS_NETWORK) #if defined(HAVE_LINUX_NETWORK) || defined(HAVE_SOLARIS_NETWORK)
while (retry_send(close(fd))); close(fd);
#else #else
opt = 1; opt = 1;
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)); setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));