From: Anita Zhang Date: Wed, 9 Sep 2020 01:35:27 +0000 (-0700) Subject: varlink: add server write states to disconnect check X-Git-Tag: v247-rc1~66^2~12 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e8e9227f5c3f8d47bec1d57a2801b22d53d0b341;p=thirdparty%2Fsystemd.git varlink: add server write states to disconnect check While a server is in the VARLINK_PENDING_METHOD or VARLINK_PENDING_METHOD_MORE states and its write end is disconnected and it gets a POLLHUP, we should disconnect since it can't write anymore. In the case of systemd-oomd disconnecting while pid1 was pending-more, this condition left pid1 in a state where it started throttling from continually getting POLLHUP. --- diff --git a/src/shared/varlink.c b/src/shared/varlink.c index 86b5f08ae76..fabfe78280b 100644 --- a/src/shared/varlink.c +++ b/src/shared/varlink.c @@ -418,6 +418,11 @@ static int varlink_test_disconnect(Varlink *v) { if (IN_SET(v->state, VARLINK_IDLE_CLIENT) && (v->write_disconnected || v->got_pollhup)) goto disconnect; + /* The server is still expecting to write more, but its write end is disconnected and it got a POLLHUP + * (i.e. from a disconnected client), so disconnect. */ + if (IN_SET(v->state, VARLINK_PENDING_METHOD, VARLINK_PENDING_METHOD_MORE) && v->write_disconnected && v->got_pollhup) + goto disconnect; + return 0; disconnect: