]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemctl: strings returned by sd_bus_message_read_basic() are immutable
authorLennart Poettering <lennart@poettering.net>
Tue, 1 Feb 2022 16:38:23 +0000 (17:38 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 2 Feb 2022 04:46:46 +0000 (13:46 +0900)
It's totally not OK to write to the strings returned by it, the data is
shared by all code that references the message.

While we are at it, simplify the code via
json_variant_set_field_string().

Follow-up for: 5ef599b324efbcb7af317c102b59c662df068500

src/systemctl/systemctl-set-environment.c

index aab0fe5fd027e98bf684e33a93c6f050726acf28..9d6a37b206e35bd77663b5aca26881f7a0048b6a 100644 (file)
 
 static int json_transform_message(sd_bus_message *m, JsonVariant **ret) {
         _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
-        char *text;
+        const char *text;
         int r;
 
         assert(m);
         assert(ret);
 
         while ((r = sd_bus_message_read_basic(m, SD_BUS_TYPE_STRING, &text)) > 0) {
-                _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
+                _cleanup_free_ char *n = NULL;
+                const char *sep;
 
-                char *sep = strchr(text, '=');
+                sep = strchr(text, '=');
                 if (!sep)
                         return log_error_errno(SYNTHETIC_ERRNO(EUCLEAN),
                                                "Invalid environment block");
 
-                *sep++ = '\0';
+                n = strndup(text, sep - text);
+                if (!n)
+                        return log_oom();
 
-                r = json_build(&w, JSON_BUILD_OBJECT(JSON_BUILD_PAIR(text, JSON_BUILD_STRING(sep))));
-                if (r < 0)
-                        return r;
+                sep++;
 
-                r = json_variant_merge(&v, w);
+                r = json_variant_set_field_string(&v, n, sep);
                 if (r < 0)
-                        return r;
+                        return log_error_errno(r, "Failed to set JSON field '%s' to '%s': %m", n, sep);
         }
         if (r < 0)
                 return bus_log_parse_error(r);
 
         *ret = TAKE_PTR(v);
-
-        return r;
+        return 0;
 }
 
 static int print_variable(const char *s) {
@@ -82,13 +82,12 @@ int show_environment(int argc, char *argv[], void *userdata) {
 
         if (OUTPUT_MODE_IS_JSON(arg_output)) {
                 _cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
-                JsonFormatFlags flags = output_mode_to_json_format_flags(arg_output);
 
                 r = json_transform_message(reply, &v);
                 if (r < 0)
                         return r;
 
-                json_variant_dump(v, flags, stdout, NULL);
+                json_variant_dump(v, output_mode_to_json_format_flags(arg_output), stdout, NULL);
         } else {
                 while ((r = sd_bus_message_read_basic(reply, SD_BUS_TYPE_STRING, &text)) > 0) {
                         r = print_variable(text);