mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 00:14:32 +09:00
core/mount: escape invalid UTF8 char in dbus reply
When What= or Options= may contain invalid UTF8 chars.
Replaces aaf7b0e411 (#27541).
This commit is contained in:
@@ -9,21 +9,66 @@
|
||||
#include "mount.h"
|
||||
#include "string-util.h"
|
||||
#include "unit.h"
|
||||
#include "utf8.h"
|
||||
|
||||
static int property_get_what(
|
||||
sd_bus *bus,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
const char *property,
|
||||
sd_bus_message *reply,
|
||||
void *userdata,
|
||||
sd_bus_error *error) {
|
||||
|
||||
_cleanup_free_ char *escaped = NULL;
|
||||
Mount *m = ASSERT_PTR(userdata);
|
||||
const char *s = NULL;
|
||||
|
||||
assert(bus);
|
||||
assert(reply);
|
||||
|
||||
static const char *mount_get_what(const Mount *m) {
|
||||
if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.what)
|
||||
return m->parameters_proc_self_mountinfo.what;
|
||||
if (m->from_fragment && m->parameters_fragment.what)
|
||||
return m->parameters_fragment.what;
|
||||
return NULL;
|
||||
s = m->parameters_proc_self_mountinfo.what;
|
||||
else if (m->from_fragment && m->parameters_fragment.what)
|
||||
s = m->parameters_fragment.what;
|
||||
|
||||
if (s) {
|
||||
escaped = utf8_escape_invalid(s);
|
||||
if (!escaped)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return sd_bus_message_append_basic(reply, 's', escaped);
|
||||
}
|
||||
|
||||
static const char *mount_get_options(const Mount *m) {
|
||||
static int property_get_options(
|
||||
sd_bus *bus,
|
||||
const char *path,
|
||||
const char *interface,
|
||||
const char *property,
|
||||
sd_bus_message *reply,
|
||||
void *userdata,
|
||||
sd_bus_error *error) {
|
||||
|
||||
_cleanup_free_ char *escaped = NULL;
|
||||
Mount *m = ASSERT_PTR(userdata);
|
||||
const char *s = NULL;
|
||||
|
||||
assert(bus);
|
||||
assert(reply);
|
||||
|
||||
if (m->from_proc_self_mountinfo && m->parameters_proc_self_mountinfo.options)
|
||||
return m->parameters_proc_self_mountinfo.options;
|
||||
if (m->from_fragment && m->parameters_fragment.options)
|
||||
return m->parameters_fragment.options;
|
||||
return NULL;
|
||||
s = m->parameters_proc_self_mountinfo.options;
|
||||
else if (m->from_fragment && m->parameters_fragment.options)
|
||||
s = m->parameters_fragment.options;
|
||||
|
||||
if (s) {
|
||||
escaped = utf8_escape_invalid(s);
|
||||
if (!escaped)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return sd_bus_message_append_basic(reply, 's', escaped);
|
||||
}
|
||||
|
||||
static const char *mount_get_fstype(const Mount *m) {
|
||||
@@ -34,8 +79,6 @@ static const char *mount_get_fstype(const Mount *m) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static BUS_DEFINE_PROPERTY_GET(property_get_what, "s", Mount, mount_get_what);
|
||||
static BUS_DEFINE_PROPERTY_GET(property_get_options, "s", Mount, mount_get_options);
|
||||
static BUS_DEFINE_PROPERTY_GET(property_get_type, "s", Mount, mount_get_fstype);
|
||||
static BUS_DEFINE_PROPERTY_GET_ENUM(property_get_result, mount_result, MountResult);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user