module_mpris: Fixed inconsistent string validation checks

This addresses changes requested by @mathstuf
This commit is contained in:
haruInDisguise 2025-03-10 11:13:17 +01:00
parent 0bcde5c453
commit 6a97b364a0

View file

@ -24,8 +24,9 @@
#include "../log.h" #include "../log.h"
#include "../plugin.h" #include "../plugin.h"
#define DEFAULT_QUERY_TIMEOUT 500 #define is_empty_string(str) ((str) == NULL || (str)[0] == '\0')
#define DEFAULT_QUERY_TIMEOUT 500
#define PATH "/org/mpris/MediaPlayer2" #define PATH "/org/mpris/MediaPlayer2"
#define BUS_NAME "org.mpris.MediaPlayer2" #define BUS_NAME "org.mpris.MediaPlayer2"
#define SERVICE "org.mpris.MediaPlayer2" #define SERVICE "org.mpris.MediaPlayer2"
@ -259,7 +260,7 @@ read_string_array(sd_bus_message *message, string_array *list)
const char *string; const char *string;
while ((status = sd_bus_message_read_basic(message, SD_BUS_TYPE_STRING, &string)) > 0) { while ((status = sd_bus_message_read_basic(message, SD_BUS_TYPE_STRING, &string)) > 0) {
if (strlen(string) > 0) { if (!is_empty_string(string)) {
tll_push_back(*list, strdup(string)); tll_push_back(*list, strdup(string));
} }
} }
@ -287,20 +288,20 @@ metadata_parse_property(const char *property_name, sd_bus_message *message, stru
const char *argument_layout = NULL; const char *argument_layout = NULL;
sd_bus_message_peek_type(message, &argument_type, &argument_layout); sd_bus_message_peek_type(message, &argument_type, &argument_layout);
assert(argument_type == SD_BUS_TYPE_VARIANT); assert(argument_type == SD_BUS_TYPE_VARIANT);
assert(argument_layout != NULL && strlen(argument_layout) > 0); assert(!is_empty_string(argument_layout));
if (strcmp(property_name, "mpris:trackid") == 0) { if (strcmp(property_name, "mpris:trackid") == 0) {
if (argument_layout[0] != SD_BUS_TYPE_STRING && argument_layout[0] != SD_BUS_TYPE_OBJECT_PATH) if (argument_layout[0] != SD_BUS_TYPE_STRING && argument_layout[0] != SD_BUS_TYPE_OBJECT_PATH)
goto unexpected_type; goto unexpected_type;
status = sd_bus_message_read(message, "v", argument_layout, &string); status = sd_bus_message_read(message, "v", argument_layout, &string);
if (status > 0 && strlen(string) > 0) if (status > 0 && !is_empty_string(string))
buffer->trackid = strdup(string); buffer->trackid = strdup(string);
/* FIXME: "strcmp matches both 'album' as well as 'albumArtist'" */ /* FIXME: "strcmp matches both 'album' as well as 'albumArtist'" */
} else if (strcmp(property_name, "xesam:album") == 0) { } else if (strcmp(property_name, "xesam:album") == 0) {
status = sd_bus_message_read(message, "v", argument_layout, &string); status = sd_bus_message_read(message, "v", argument_layout, &string);
if (status > 0 && strlen(string) > 0) if (status > 0 && !is_empty_string(string))
buffer->album = strdup(string); buffer->album = strdup(string);
} else if (strcmp(property_name, "xesam:artist") == 0) { } else if (strcmp(property_name, "xesam:artist") == 0) {
@ -308,7 +309,7 @@ metadata_parse_property(const char *property_name, sd_bus_message *message, stru
} else if (strcmp(property_name, "xesam:title") == 0) { } else if (strcmp(property_name, "xesam:title") == 0) {
status = sd_bus_message_read(message, "v", "s", &string); status = sd_bus_message_read(message, "v", "s", &string);
if(status > 0 && strlen(string) > 0) if(status > 0 && !is_empty_string(string))
buffer->title = strdup(string); buffer->title = strdup(string);
} else if (strcmp(property_name, "mpris:length") == 0) { } else if (strcmp(property_name, "mpris:length") == 0) {
@ -386,17 +387,17 @@ property_parse(struct property *prop, const char *property_name, sd_bus_message
assert(status > 0); assert(status > 0);
assert(argument_type == SD_BUS_TYPE_VARIANT); assert(argument_type == SD_BUS_TYPE_VARIANT);
assert(argument_layout != NULL && strlen(argument_layout) > 0); assert(!is_empty_string(argument_layout));
const char *string; const char *string;
if (strcmp(property_name, "PlaybackStatus") == 0) { if (strcmp(property_name, "PlaybackStatus") == 0) {
status = sd_bus_message_read(message, "v", "s", &string); status = sd_bus_message_read(message, "v", "s", &string);
if (status && strlen(string) > 0) if (status && !is_empty_string(string))
prop->playback_status = strdup(string); prop->playback_status = strdup(string);
} else if (strcmp(property_name, "LoopStatus") == 0) { } else if (strcmp(property_name, "LoopStatus") == 0) {
status = sd_bus_message_read(message, "v", "s", &string); status = sd_bus_message_read(message, "v", "s", &string);
if (status && strlen(string) > 0) if (status && !is_empty_string(string))
prop->loop_status = strdup(string); prop->loop_status = strdup(string);
} else if (strcmp(property_name, "Position") == 0) { } else if (strcmp(property_name, "Position") == 0) {
@ -476,7 +477,7 @@ context_event_handle_name_owner_changed(sd_bus_message *message, struct context
new_owner); new_owner);
#endif #endif
if (strlen(new_owner) == 0 && strlen(old_owner) > 0) { if (is_empty_string(new_owner) && !is_empty_string(old_owner)) {
/* Target bus has been lost */ /* Target bus has been lost */
struct client *client = client_lookup_by_unique_name(context, old_owner); struct client *client = client_lookup_by_unique_name(context, old_owner);
@ -490,14 +491,14 @@ context_event_handle_name_owner_changed(sd_bus_message *message, struct context
context->current_client = NULL; context->current_client = NULL;
return; return;
} else if (strlen(old_owner) == 0 && strlen(new_owner) > 0) { } else if (is_empty_string(old_owner) && !is_empty_string(new_owner)) {
/* New unique name registered. Not used */ /* New unique name registered. Not used */
return; return;
} }
/* Name changed */ /* Name changed */
assert(new_owner != NULL && strlen(new_owner) > 0); assert(!is_empty_string(new_owner));
assert(old_owner != NULL && strlen(old_owner) > 0); assert(!is_empty_string(old_owner));
struct client *client = client_lookup_by_unique_name(context, old_owner); struct client *client = client_lookup_by_unique_name(context, old_owner);
LOG_DBG("'NameOwnerChanged': Name changed from '%s' to '%s' for client '%s'", old_owner, new_owner, LOG_DBG("'NameOwnerChanged': Name changed from '%s' to '%s' for client '%s'", old_owner, new_owner,