wg: don't fail if a netlink interface dump is inconsistent

Netlink returns NLM_F_DUMP_INTR if the set of all tunnels changed
during the dump. That's unfortunate, but is pretty common on busy
systems that are adding and removing tunnels all the time. Rather
than retrying, potentially indefinitely, we just work with the
partial results.

Reported-by: Robert Gerus <ar@is-a.cat>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2018-10-12 16:40:29 +02:00
parent 9b1394b2dc
commit 599b84fbd1
2 changed files with 18 additions and 4 deletions

View File

@ -998,9 +998,16 @@ another:
goto cleanup; goto cleanup;
} }
if ((len = mnl_cb_run(rtnl_buffer, len, seq, portid, read_devices_cb, buffer)) < 0) { if ((len = mnl_cb_run(rtnl_buffer, len, seq, portid, read_devices_cb, buffer)) < 0) {
/* Netlink returns NLM_F_DUMP_INTR if the set of all tunnels changed
* during the dump. That's unfortunate, but is pretty common on busy
* systems that are adding and removing tunnels all the time. Rather
* than retrying, potentially indefinitely, we just work with the
* partial results. */
if (errno != EINTR) {
ret = -errno; ret = -errno;
goto cleanup; goto cleanup;
} }
}
if (len == MNL_CB_OK + 1) if (len == MNL_CB_OK + 1)
goto another; goto another;
ret = 0; ret = 0;

View File

@ -530,9 +530,16 @@ another:
goto cleanup; goto cleanup;
} }
if ((len = mnl_cb_run(rtnl_buffer, len, seq, portid, read_devices_cb, buffer)) < 0) { if ((len = mnl_cb_run(rtnl_buffer, len, seq, portid, read_devices_cb, buffer)) < 0) {
/* Netlink returns NLM_F_DUMP_INTR if the set of all tunnels changed
* during the dump. That's unfortunate, but is pretty common on busy
* systems that are adding and removing tunnels all the time. Rather
* than retrying, potentially indefinitely, we just work with the
* partial results. */
if (errno != EINTR) {
ret = -errno; ret = -errno;
goto cleanup; goto cleanup;
} }
}
if (len == MNL_CB_OK + 1) if (len == MNL_CB_OK + 1)
goto another; goto another;
ret = 0; ret = 0;