summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-05-14 10:34:33 +0200
committerThomas Haller <thaller@redhat.com>2021-05-14 10:34:33 +0200
commit5f939cc1cb51aea9387a21df2b191f7b708234a9 (patch)
treed7685762273c53dd64c498c7ca8eec1708ed106d
parente320beb33060e8684cf8b484b270d917de739dcc (diff)
parent80ced3f1fb4754558aa19f257a1ad921e0f92616 (diff)
downloadNetworkManager-5f939cc1cb51aea9387a21df2b191f7b708234a9.tar.gz
dhcpcd: merge branch 'th/dhcpcd-kill-em-all'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/726 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/856
-rw-r--r--src/core/dhcp/nm-dhcp-client.c5
-rw-r--r--src/core/dhcp/nm-dhcp-dhcpcd.c42
2 files changed, 27 insertions, 20 deletions
diff --git a/src/core/dhcp/nm-dhcp-client.c b/src/core/dhcp/nm-dhcp-client.c
index 0dc21be630..da99cbb644 100644
--- a/src/core/dhcp/nm-dhcp-client.c
+++ b/src/core/dhcp/nm-dhcp-client.c
@@ -83,6 +83,11 @@ G_DEFINE_ABSTRACT_TYPE(NMDhcpClient, nm_dhcp_client, G_TYPE_OBJECT)
/*****************************************************************************/
+/* we use pid=-1 for invalid PIDs. Ensure that pid_t can hold negative values. */
+G_STATIC_ASSERT(!(((pid_t) -1) > 0));
+
+/*****************************************************************************/
+
pid_t
nm_dhcp_client_get_pid(NMDhcpClient *self)
{
diff --git a/src/core/dhcp/nm-dhcp-dhcpcd.c b/src/core/dhcp/nm-dhcp-dhcpcd.c
index 8c31aed0cf..64187b8eb3 100644
--- a/src/core/dhcp/nm-dhcp-dhcpcd.c
+++ b/src/core/dhcp/nm-dhcp-dhcpcd.c
@@ -169,27 +169,29 @@ stop(NMDhcpClient *client, gboolean release)
int sig, errsv;
pid = nm_dhcp_client_get_pid(client);
- sig = release ? SIGALRM : SIGTERM;
- _LOGD("sending %s to dhcpcd pid %d", sig == SIGALRM ? "SIGALRM" : "SIGTERM", pid);
-
- /* dhcpcd-9.x features privilege separation.
- * It's not our job to track all these processes so we rely on dhcpcd
- * to always cleanup after itself.
- * Because it also re-parents itself to PID 1, the process cannot be
- * reaped or waited for.
- * As such, just send the correct signal.
- */
- if (kill(pid, sig) == -1) {
- errsv = errno;
- _LOGE("failed to kill dhcpcd %d:%s", errsv, strerror(errsv));
- }
+ if (pid > 1) {
+ sig = release ? SIGALRM : SIGTERM;
+ _LOGD("sending %s to dhcpcd pid %d", sig == SIGALRM ? "SIGALRM" : "SIGTERM", pid);
+
+ /* dhcpcd-9.x features privilege separation.
+ * It's not our job to track all these processes so we rely on dhcpcd
+ * to always cleanup after itself.
+ * Because it also re-parents itself to PID 1, the process cannot be
+ * reaped or waited for.
+ * As such, just send the correct signal.
+ */
+ if (kill(pid, sig) == -1) {
+ errsv = errno;
+ _LOGE("failed to kill dhcpcd %d:%s", errsv, strerror(errsv));
+ }
- /* When this function exits NM expects the PID to be -1.
- * This means we also need to stop watching the pid.
- * If we need to know the exit status then we need to refactor NM
- * to allow a non -1 to mean we're waiting to exit still.
- */
- nm_dhcp_client_stop_watch_child(client, pid);
+ /* When this function exits NM expects the PID to be -1.
+ * This means we also need to stop watching the pid.
+ * If we need to know the exit status then we need to refactor NM
+ * to allow a non -1 to mean we're waiting to exit still.
+ */
+ nm_dhcp_client_stop_watch_child(client, pid);
+ }
}
/*****************************************************************************/