Fix breakage in DBus FilterA and FilterAAAA methods.

In generalising the RR filter code, the Dbus methods
controlling filtering A and AAAA records
got severely broken. This, and the previous commit,
fixes things.
This commit is contained in:
Simon Kelley
2024-02-20 23:38:26 +00:00
parent 89aad01468
commit 4c590320ec
2 changed files with 45 additions and 24 deletions

View File

@@ -485,28 +485,37 @@ static DBusMessage* dbus_read_servers_ex(DBusMessage *message, int strings)
return error; return error;
} }
static DBusMessage *dbus_set_bool(DBusMessage *message, int flag, char *name) static DBusMessage *dbus_get_bool(DBusMessage *message, dbus_bool_t *enabled, char *name)
{ {
DBusMessageIter iter; DBusMessageIter iter;
dbus_bool_t enabled;
if (!dbus_message_iter_init(message, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_BOOLEAN) if (!dbus_message_iter_init(message, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_BOOLEAN)
return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, "Expected boolean argument"); return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, "Expected boolean argument");
dbus_message_iter_get_basic(&iter, &enabled); dbus_message_iter_get_basic(&iter, enabled);
if (enabled) if (*enabled)
{
my_syslog(LOG_INFO, _("Enabling --%s option from D-Bus"), name); my_syslog(LOG_INFO, _("Enabling --%s option from D-Bus"), name);
set_option_bool(flag);
}
else else
{
my_syslog(LOG_INFO, _("Disabling --%s option from D-Bus"), name); my_syslog(LOG_INFO, _("Disabling --%s option from D-Bus"), name);
return NULL;
}
static DBusMessage *dbus_set_bool(DBusMessage *message, int flag, char *name)
{
dbus_bool_t val;
DBusMessage *reply = dbus_get_bool(message, &val, name);
if (!reply)
{
if (val)
set_option_bool(flag);
else
reset_option_bool(flag); reset_option_bool(flag);
} }
return NULL; return reply;
} }
#ifdef HAVE_DHCP #ifdef HAVE_DHCP
@@ -829,26 +838,38 @@ DBusHandlerResult message_handler(DBusConnection *connection,
else if (strcmp(method, "SetFilterA") == 0) else if (strcmp(method, "SetFilterA") == 0)
{ {
static int done = 0; static int done = 0;
static struct rrlist list = { T_A, NULL }; static struct rrlist list = { 0, NULL };
dbus_bool_t enabled;
if (!(reply = dbus_get_bool(message, &enabled, "filter-A")))
{
if (!done) if (!done)
{ {
done = 1; done = 1;
list.next = daemon->filter_rr; list.next = daemon->filter_rr;
daemon->filter_rr = &list; daemon->filter_rr = &list;
} }
list.rr = enabled ? T_A : 0;
}
} }
else if (strcmp(method, "SetFilterAAAA") == 0) else if (strcmp(method, "SetFilterAAAA") == 0)
{ {
static int done = 0; static int done = 0;
static struct rrlist list = { T_AAAA, NULL }; static struct rrlist list = { 0, NULL };
dbus_bool_t enabled;
if (!(reply = dbus_get_bool(message, &enabled, "filter-AAAA")))
{
if (!done) if (!done)
{ {
done = 1; done = 1;
list.next = daemon->filter_rr; list.next = daemon->filter_rr;
daemon->filter_rr = &list; daemon->filter_rr = &list;
} }
list.rr = enabled ? T_AAAA : 0;
}
} }
else if (strcmp(method, "SetLocaliseQueriesOption") == 0) else if (strcmp(method, "SetLocaliseQueriesOption") == 0)
{ {

View File

@@ -119,7 +119,7 @@ int rr_on_list(struct rrlist *list, unsigned short rr)
{ {
while (list) while (list)
{ {
if (list->rr == rr) if (list->rr != 0 && list->rr == rr)
return 1; return 1;
list = list->next; list = list->next;