Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .reuse/dep5
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Source: https://github.com/linuxdeepin/dde-services
# License: ...

# Config files
Files: .clang-format *.in *.json *.conf *.xml *.service
Files: .clang-format *.in *.json *.conf *.xml *.service *.desktop
Copyright: None
License: CC0-1.0

Expand Down
41 changes: 41 additions & 0 deletions src/plugin-sdbus/plugin-ipwatchd/service.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,47 @@ int sd_bus_message_get_data(sd_bus_message *msg, ...) {
return r;
}

int sd_bus_read_dict(sd_bus_message *msg, GHashTable **map) {
int r = 0;

*map = g_hash_table_new(g_str_hash, g_str_equal);
r = sd_bus_message_enter_container(msg, SD_BUS_TYPE_ARRAY, "{sv}");
if (r < 0)
return r;

while ((r = sd_bus_message_enter_container(msg, SD_BUS_TYPE_DICT_ENTRY,
"sv")) > 0) {
const char *key;
const char *value;
const char *contents;

r = sd_bus_message_read_basic(msg, SD_BUS_TYPE_STRING, &key);
if (r < 0)
return r;

r = sd_bus_message_peek_type(msg, NULL, &contents);
if (r < 0)
return r;

r = sd_bus_message_enter_container(msg, SD_BUS_TYPE_VARIANT, contents);
if (r < 0)
return r;

r = sd_bus_message_read_basic(msg, SD_BUS_TYPE_STRING, &value);
if (r < 0)
return r;
g_hash_table_insert(*map, (gpointer)key, (gpointer)value);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Possible lifetime issue with key and value pointers.

Since the hash table stores pointers managed by sd_bus_message, freeing or reusing the message may invalidate them. Duplicate the strings before insertion to avoid dangling pointers.

r = sd_bus_message_exit_container(msg);
if (r < 0)
return r;

r = sd_bus_message_exit_container(msg);
if (r < 0)
return r;
}
return sd_bus_message_exit_container(msg);
}

int sd_bus_message_get_datav(sd_bus_message *msg, va_list ap) {
char type = 0;
const char *contents = NULL;
Expand Down