Prevent crash on dbus reconnection (#2186468)
This commit is contained in:
parent
c4797a90af
commit
9234006b7d
93
dnsmasq-2.90-dbus-watchers-bz2186468.patch
Normal file
93
dnsmasq-2.90-dbus-watchers-bz2186468.patch
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
From 33635d8564f96cedcef9bf9826cbbca76f28aa81 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemensik@redhat.com>
|
||||||
|
Date: Mon, 17 Apr 2023 20:55:31 +0100
|
||||||
|
Subject: [PATCH] Fix crash in dbus code.
|
||||||
|
|
||||||
|
If I configure dnsmasq to use dbus and then restart dbus.service with watchers present,
|
||||||
|
it crashes dnsmasq. The reason is simple, it uses loop to walk over watchers to call
|
||||||
|
dbus handling code. But from that code the same list can be modified and watchers removed.
|
||||||
|
But the list iteration continues anyway.
|
||||||
|
|
||||||
|
Restart the loop if list were modified.
|
||||||
|
---
|
||||||
|
src/dbus.c | 24 ++++++++++++++++++++----
|
||||||
|
1 file changed, 20 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/dbus.c b/src/dbus.c
|
||||||
|
index 24efcb8..34cf2f6 100644
|
||||||
|
--- a/src/dbus.c
|
||||||
|
+++ b/src/dbus.c
|
||||||
|
@@ -106,6 +106,7 @@ const char* introspection_xml_template =
|
||||||
|
"</node>\n";
|
||||||
|
|
||||||
|
static char *introspection_xml = NULL;
|
||||||
|
+static int watches_modified = 0;
|
||||||
|
|
||||||
|
struct watch {
|
||||||
|
DBusWatch *watch;
|
||||||
|
@@ -127,6 +128,7 @@ static dbus_bool_t add_watch(DBusWatch *watch, void *data)
|
||||||
|
w->watch = watch;
|
||||||
|
w->next = daemon->watches;
|
||||||
|
daemon->watches = w;
|
||||||
|
+ watches_modified++;
|
||||||
|
|
||||||
|
(void)data; /* no warning */
|
||||||
|
return TRUE;
|
||||||
|
@@ -134,7 +136,7 @@ static dbus_bool_t add_watch(DBusWatch *watch, void *data)
|
||||||
|
|
||||||
|
static void remove_watch(DBusWatch *watch, void *data)
|
||||||
|
{
|
||||||
|
- struct watch **up, *w, *tmp;
|
||||||
|
+ struct watch **up, *w, *tmp;
|
||||||
|
|
||||||
|
for (up = &(daemon->watches), w = daemon->watches; w; w = tmp)
|
||||||
|
{
|
||||||
|
@@ -143,6 +145,7 @@ static void remove_watch(DBusWatch *watch, void *data)
|
||||||
|
{
|
||||||
|
*up = tmp;
|
||||||
|
free(w);
|
||||||
|
+ watches_modified++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
up = &(w->next);
|
||||||
|
@@ -966,11 +969,11 @@ void set_dbus_listeners(void)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-void check_dbus_listeners()
|
||||||
|
+static int check_dbus_watches()
|
||||||
|
{
|
||||||
|
- DBusConnection *connection = (DBusConnection *)daemon->dbus;
|
||||||
|
struct watch *w;
|
||||||
|
|
||||||
|
+ watches_modified = 0;
|
||||||
|
for (w = daemon->watches; w; w = w->next)
|
||||||
|
if (dbus_watch_get_enabled(w->watch))
|
||||||
|
{
|
||||||
|
@@ -987,9 +990,22 @@ void check_dbus_listeners()
|
||||||
|
flags |= DBUS_WATCH_ERROR;
|
||||||
|
|
||||||
|
if (flags != 0)
|
||||||
|
- dbus_watch_handle(w->watch, flags);
|
||||||
|
+ {
|
||||||
|
+ dbus_watch_handle(w->watch, flags);
|
||||||
|
+ if (watches_modified)
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void check_dbus_listeners()
|
||||||
|
+{
|
||||||
|
+ DBusConnection *connection = (DBusConnection *)daemon->dbus;
|
||||||
|
+
|
||||||
|
+ while (!check_dbus_watches()) ;
|
||||||
|
+
|
||||||
|
if (connection)
|
||||||
|
{
|
||||||
|
dbus_connection_ref (connection);
|
||||||
|
--
|
||||||
|
2.40.0
|
||||||
|
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
Name: dnsmasq
|
Name: dnsmasq
|
||||||
Version: 2.89
|
Version: 2.89
|
||||||
Release: 4%{?extraversion:.%{extraversion}}%{?dist}
|
Release: 5%{?extraversion:.%{extraversion}}%{?dist}
|
||||||
Summary: A lightweight DHCP/caching DNS server
|
Summary: A lightweight DHCP/caching DNS server
|
||||||
|
|
||||||
# SPDX identifiers already
|
# SPDX identifiers already
|
||||||
@ -47,6 +47,8 @@ Patch2: dnsmasq-2.81-configuration.patch
|
|||||||
Patch3: dnsmasq-2.78-fips.patch
|
Patch3: dnsmasq-2.78-fips.patch
|
||||||
# https://thekelleys.org.uk/gitweb/?p=dnsmasq.git;h=eb92fb32b746f2104b0f370b5b295bb8dd4bd5e5
|
# https://thekelleys.org.uk/gitweb/?p=dnsmasq.git;h=eb92fb32b746f2104b0f370b5b295bb8dd4bd5e5
|
||||||
Patch4: dnsmasq-2.89-edns0-size.patch
|
Patch4: dnsmasq-2.89-edns0-size.patch
|
||||||
|
# http://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=commit;h=33635d8564f96cedcef9bf9826cbbca76f28aa81
|
||||||
|
Patch5: dnsmasq-2.90-dbus-watchers-bz2186468.patch
|
||||||
|
|
||||||
|
|
||||||
Requires: nettle
|
Requires: nettle
|
||||||
@ -217,6 +219,9 @@ install -Dpm 644 %{SOURCE2} %{buildroot}%{_sysusersdir}/%{name}.conf
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Apr 27 2023 Petr Menšík <pemensik@redhat.com> - 2.89-5
|
||||||
|
- Prevent crash on dbus reconnection (#2186468)
|
||||||
|
|
||||||
* Thu Apr 27 2023 Petr Menšík <pemensik@redhat.com> - 2.89-4
|
* Thu Apr 27 2023 Petr Menšík <pemensik@redhat.com> - 2.89-4
|
||||||
- Actually enable localization support in dnsmasq (#2131681)
|
- Actually enable localization support in dnsmasq (#2131681)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user