]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
locale: update Context only on success
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 28 Jul 2026 04:06:01 +0000 (13:06 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 28 Jul 2026 11:19:30 +0000 (20:19 +0900)
Do not clear Context.vc, Context.x11_from_vc, and Context.x11_from_xorg
on errors like ENOMEM or so.

This does not change behavior on success.

src/locale/localed-util.c

index f66db07b145329408e3ed958783bfe5fa136c42a..f24d39a118feeca8d8aa05769f699dc236c9bfec 100644 (file)
@@ -142,8 +142,6 @@ int locale_read_data(Context *c, sd_bus_message *m) {
 }
 
 int vconsole_read_data(Context *c, sd_bus_message *m) {
-        _cleanup_close_ int fd = -EBADF;
-        struct stat st;
         int r;
 
         assert(c);
@@ -157,7 +155,7 @@ int vconsole_read_data(Context *c, sd_bus_message *m) {
                 c->vc_cache = sd_bus_message_ref(m);
         }
 
-        fd = RET_NERRNO(open(etc_vconsole_conf(), O_CLOEXEC | O_PATH));
+        _cleanup_close_ int fd = RET_NERRNO(open(etc_vconsole_conf(), O_CLOEXEC | O_PATH));
         if (fd == -ENOENT) {
                 c->vc_stat = (struct stat) {};
                 vc_context_clear(&c->vc);
@@ -167,6 +165,7 @@ int vconsole_read_data(Context *c, sd_bus_message *m) {
         if (fd < 0)
                 return fd;
 
+        struct stat st;
         if (fstat(fd, &st) < 0)
                 return -errno;
 
@@ -174,35 +173,34 @@ int vconsole_read_data(Context *c, sd_bus_message *m) {
         if (stat_inode_unmodified(&c->vc_stat, &st))
                 return 0;
 
-        c->vc_stat = st;
-        vc_context_clear(&c->vc);
-        x11_context_clear(&c->x11_from_vc);
-
+        _cleanup_(vc_context_clear) VCContext vc = {};
+        _cleanup_(x11_context_clear) X11Context xc = {};
         r = parse_env_file_fd(
                         fd, etc_vconsole_conf(),
-                        "KEYMAP",        &c->vc.keymap,
-                        "KEYMAP_TOGGLE", &c->vc.toggle,
-                        "XKBLAYOUT",     &c->x11_from_vc.layout,
-                        "XKBMODEL",      &c->x11_from_vc.model,
-                        "XKBVARIANT",    &c->x11_from_vc.variant,
-                        "XKBOPTIONS",    &c->x11_from_vc.options);
+                        "KEYMAP",        &vc.keymap,
+                        "KEYMAP_TOGGLE", &vc.toggle,
+                        "XKBLAYOUT",     &xc.layout,
+                        "XKBMODEL",      &xc.model,
+                        "XKBVARIANT",    &xc.variant,
+                        "XKBOPTIONS",    &xc.options);
         if (r < 0)
                 return r;
 
-        if (vc_context_verify(&c->vc) < 0)
-                vc_context_clear(&c->vc);
+        /* Do not fail when the .conf file contains an invalid setting, but discard the stored settings and
+         * save the stat to avoid re-reading it in the future. */
+        if (vc_context_verify(&vc) < 0)
+                vc_context_clear(&vc);
 
-        if (x11_context_verify(&c->x11_from_vc) < 0)
-                x11_context_clear(&c->x11_from_vc);
+        if (x11_context_verify(&xc) < 0)
+                x11_context_clear(&xc);
 
+        c->vc_stat = st;
+        vc_context_replace(&c->vc, &vc);
+        x11_context_replace(&c->x11_from_vc, &xc);
         return 0;
 }
 
 int x11_read_data(Context *c, sd_bus_message *m) {
-        _cleanup_close_ int fd = -EBADF;
-        _cleanup_fclose_ FILE *f = NULL;
-        bool in_section = false;
-        struct stat st;
         int r;
 
         assert(c);
@@ -216,7 +214,7 @@ int x11_read_data(Context *c, sd_bus_message *m) {
                 c->x11_cache = sd_bus_message_ref(m);
         }
 
-        fd = RET_NERRNO(open("/etc/X11/xorg.conf.d/00-keyboard.conf", O_CLOEXEC | O_PATH));
+        _cleanup_close_ int fd = RET_NERRNO(open("/etc/X11/xorg.conf.d/00-keyboard.conf", O_CLOEXEC | O_PATH));
         if (fd == -ENOENT) {
                 c->x11_stat = (struct stat) {};
                 x11_context_clear(&c->x11_from_xorg);
@@ -225,6 +223,7 @@ int x11_read_data(Context *c, sd_bus_message *m) {
         if (fd < 0)
                 return fd;
 
+        struct stat st;
         if (fstat(fd, &st) < 0)
                 return -errno;
 
@@ -232,13 +231,13 @@ int x11_read_data(Context *c, sd_bus_message *m) {
         if (stat_inode_unmodified(&c->x11_stat, &st))
                 return 0;
 
-        c->x11_stat = st;
-        x11_context_clear(&c->x11_from_xorg);
-
+        _cleanup_fclose_ FILE *f = NULL;
         r = fdopen_independent(fd, "re", &f);
         if (r < 0)
                 return r;
 
+        _cleanup_(x11_context_clear) X11Context xc = {};
+        bool in_section = false;
         for (;;) {
                 _cleanup_free_ char *line = NULL;
 
@@ -262,13 +261,13 @@ int x11_read_data(Context *c, sd_bus_message *m) {
                                 char **p = NULL;
 
                                 if (streq(a[1], "XkbLayout"))
-                                        p = &c->x11_from_xorg.layout;
+                                        p = &xc.layout;
                                 else if (streq(a[1], "XkbModel"))
-                                        p = &c->x11_from_xorg.model;
+                                        p = &xc.model;
                                 else if (streq(a[1], "XkbVariant"))
-                                        p = &c->x11_from_xorg.variant;
+                                        p = &xc.variant;
                                 else if (streq(a[1], "XkbOptions"))
-                                        p = &c->x11_from_xorg.options;
+                                        p = &xc.options;
 
                                 if (p)
                                         free_and_replace(*p, a[2]);
@@ -288,11 +287,15 @@ int x11_read_data(Context *c, sd_bus_message *m) {
                         in_section = false;
         }
 
-        x11_context_normalize(&c->x11_from_xorg);
+        x11_context_normalize(&xc);
 
-        if (x11_context_verify(&c->x11_from_xorg) < 0)
-                x11_context_clear(&c->x11_from_xorg);
+        /* Do not fail when the .conf file contains an invalid setting, but discard the stored settings and
+         * save the stat to avoid re-reading it in the future. */
+        if (x11_context_verify(&xc) < 0)
+                x11_context_clear(&xc);
 
+        c->x11_stat = st;
+        x11_context_replace(&c->x11_from_xorg, &xc);
         return 0;
 }