]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/mount: escape invalid UTF8 char in dbus reply 27611/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 11 May 2023 10:21:57 +0000 (19:21 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 11 May 2023 10:25:38 +0000 (19:25 +0900)
When What= or Options= may contain invalid UTF8 chars.

Replaces aaf7b0e41105d7b7cf30912cdac32820f011a219 (#27541).

src/core/dbus-mount.c

index 73702b1a16a382e30f648f58c22c7e0ad8585f65..55ad4f2c982aa496563465b34d27a77c5314cdf5 100644 (file)
@@ -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);