|
|
ac3a84 |
From 471b70bca8f1a77b1d5402e190b00a61aa0d58b0 Mon Sep 17 00:00:00 2001
|
|
|
ac3a84 |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
ac3a84 |
Date: Tue, 22 Nov 2022 12:28:19 +0100
|
|
|
ac3a84 |
Subject: [PATCH] resolved: handle -EINTR returned from fd_wait_for_event()
|
|
|
ac3a84 |
better
|
|
|
ac3a84 |
|
|
|
ac3a84 |
We might get signals for various reasons (for example, somebody asking
|
|
|
ac3a84 |
us to reload caches via a signal), hence let's handle this gracefully.
|
|
|
ac3a84 |
|
|
|
ac3a84 |
(cherry picked from commit 6d66a221685c15798e796d9738f73fdb1fdccdb2)
|
|
|
ac3a84 |
|
|
|
ac3a84 |
Related: #2137584
|
|
|
ac3a84 |
---
|
|
|
ac3a84 |
src/resolve/resolved-manager.c | 20 ++++++++++++++++----
|
|
|
ac3a84 |
1 file changed, 16 insertions(+), 4 deletions(-)
|
|
|
ac3a84 |
|
|
|
ac3a84 |
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
|
|
|
ac3a84 |
index f62efa87aa..1c9048670b 100644
|
|
|
ac3a84 |
--- a/src/resolve/resolved-manager.c
|
|
|
ac3a84 |
+++ b/src/resolve/resolved-manager.c
|
|
|
ac3a84 |
@@ -868,11 +868,14 @@ int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
|
|
|
ac3a84 |
}
|
|
|
ac3a84 |
|
|
|
ac3a84 |
static int sendmsg_loop(int fd, struct msghdr *mh, int flags) {
|
|
|
ac3a84 |
+ usec_t end;
|
|
|
ac3a84 |
int r;
|
|
|
ac3a84 |
|
|
|
ac3a84 |
assert(fd >= 0);
|
|
|
ac3a84 |
assert(mh);
|
|
|
ac3a84 |
|
|
|
ac3a84 |
+ end = usec_add(now(CLOCK_MONOTONIC), SEND_TIMEOUT_USEC);
|
|
|
ac3a84 |
+
|
|
|
ac3a84 |
for (;;) {
|
|
|
ac3a84 |
if (sendmsg(fd, mh, flags) >= 0)
|
|
|
ac3a84 |
return 0;
|
|
|
ac3a84 |
@@ -881,20 +884,26 @@ static int sendmsg_loop(int fd, struct msghdr *mh, int flags) {
|
|
|
ac3a84 |
if (errno != EAGAIN)
|
|
|
ac3a84 |
return -errno;
|
|
|
ac3a84 |
|
|
|
ac3a84 |
- r = fd_wait_for_event(fd, POLLOUT, SEND_TIMEOUT_USEC);
|
|
|
ac3a84 |
- if (r < 0)
|
|
|
ac3a84 |
+ r = fd_wait_for_event(fd, POLLOUT, LESS_BY(end, now(CLOCK_MONOTONIC)));
|
|
|
ac3a84 |
+ if (r < 0) {
|
|
|
ac3a84 |
+ if (ERRNO_IS_TRANSIENT(r))
|
|
|
ac3a84 |
+ continue;
|
|
|
ac3a84 |
return r;
|
|
|
ac3a84 |
+ }
|
|
|
ac3a84 |
if (r == 0)
|
|
|
ac3a84 |
return -ETIMEDOUT;
|
|
|
ac3a84 |
}
|
|
|
ac3a84 |
}
|
|
|
ac3a84 |
|
|
|
ac3a84 |
static int write_loop(int fd, void *message, size_t length) {
|
|
|
ac3a84 |
+ usec_t end;
|
|
|
ac3a84 |
int r;
|
|
|
ac3a84 |
|
|
|
ac3a84 |
assert(fd >= 0);
|
|
|
ac3a84 |
assert(message);
|
|
|
ac3a84 |
|
|
|
ac3a84 |
+ end = usec_add(now(CLOCK_MONOTONIC), SEND_TIMEOUT_USEC);
|
|
|
ac3a84 |
+
|
|
|
ac3a84 |
for (;;) {
|
|
|
ac3a84 |
if (write(fd, message, length) >= 0)
|
|
|
ac3a84 |
return 0;
|
|
|
ac3a84 |
@@ -903,9 +912,12 @@ static int write_loop(int fd, void *message, size_t length) {
|
|
|
ac3a84 |
if (errno != EAGAIN)
|
|
|
ac3a84 |
return -errno;
|
|
|
ac3a84 |
|
|
|
ac3a84 |
- r = fd_wait_for_event(fd, POLLOUT, SEND_TIMEOUT_USEC);
|
|
|
ac3a84 |
- if (r < 0)
|
|
|
ac3a84 |
+ r = fd_wait_for_event(fd, POLLOUT, LESS_BY(end, now(CLOCK_MONOTONIC)));
|
|
|
ac3a84 |
+ if (r < 0) {
|
|
|
ac3a84 |
+ if (ERRNO_IS_TRANSIENT(r))
|
|
|
ac3a84 |
+ continue;
|
|
|
ac3a84 |
return r;
|
|
|
ac3a84 |
+ }
|
|
|
ac3a84 |
if (r == 0)
|
|
|
ac3a84 |
return -ETIMEDOUT;
|
|
|
ac3a84 |
}
|