pipewire: module-rt: make dbus reply checking stricter

org.freedesktop.DBus.Properties.Get is supposed to return
a single variant, so check if it does.
This commit is contained in:
Barnabás Pőcze 2024-02-04 16:38:54 +01:00 committed by Wim Taymans
parent 4da82d5475
commit db3d7b88dd

View file

@ -342,7 +342,6 @@ static long long rtkit_get_int_property(struct impl *impl, const char *propname,
DBusMessageIter iter, subiter; DBusMessageIter iter, subiter;
dbus_int64_t i64; dbus_int64_t i64;
dbus_int32_t i32; dbus_int32_t i32;
int current_type;
struct pw_rtkit_bus *connection = impl->rtkit_bus; struct pw_rtkit_bus *connection = impl->rtkit_bus;
if (!(m = dbus_message_new_method_call(impl->service_name, if (!(m = dbus_message_new_method_call(impl->service_name,
@ -365,36 +364,32 @@ static long long rtkit_get_int_property(struct impl *impl, const char *propname,
if (dbus_set_error_from_message(&error, r)) if (dbus_set_error_from_message(&error, r))
return translate_error(error.name); return translate_error(error.name);
dbus_message_iter_init(r, &iter); if (!dbus_message_has_signature(r, "v"))
while ((current_type = dbus_message_iter_get_arg_type(&iter)) != DBUS_TYPE_INVALID) { return -EBADMSG;
dbus_message_iter_init(r, &iter);
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
return -EBADMSG;
if (current_type == DBUS_TYPE_VARIANT) {
dbus_message_iter_recurse(&iter, &subiter); dbus_message_iter_recurse(&iter, &subiter);
while ((current_type = switch (dbus_message_iter_get_arg_type(&subiter)) {
dbus_message_iter_get_arg_type(&subiter)) != DBUS_TYPE_INVALID) { case DBUS_TYPE_INT32:
if (current_type == DBUS_TYPE_INT32) {
dbus_message_iter_get_basic(&subiter, &i32); dbus_message_iter_get_basic(&subiter, &i32);
*propval = i32; *propval = i32;
return 0; break;
} case DBUS_TYPE_INT64:
if (current_type == DBUS_TYPE_INT64) {
dbus_message_iter_get_basic(&subiter, &i64); dbus_message_iter_get_basic(&subiter, &i64);
*propval = i64; *propval = i64;
return 0; break;
} default:
dbus_message_iter_next(&subiter);
}
}
dbus_message_iter_next(&iter);
}
return -EBADMSG; return -EBADMSG;
} }
return 0;
}
static int pw_rtkit_make_realtime(struct impl *impl, pid_t thread, int priority) static int pw_rtkit_make_realtime(struct impl *impl, pid_t thread, int priority)
{ {
spa_autoptr(DBusMessage) m = NULL; spa_autoptr(DBusMessage) m = NULL;