]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared/creds-util: return 0 for missing creds in read_credential_strings_many
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 25 Apr 2023 15:58:34 +0000 (17:58 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 25 Apr 2023 16:08:15 +0000 (18:08 +0200)
Realistically, the only thing that the caller can do is ignore failures related
to missing credentials. If the caller requires some credentials to be present,
they should just check which output variables are not NULL. One of the callers
was already doing that, and the other wanted to, but missed -ENOENT. By
suppressing -ENOENT and -ENXIO, both callers are simplified.

Fixes a warning at boot:
systemd-vconsole-setup[221]: Failed to import credentials, ignoring: No such file or directory

src/resolve/resolved-conf.c
src/shared/creds-util.c
src/test/test-creds.c
src/vconsole/vconsole-setup.c

index 70a6f994503107debfb28e3408615a3fb9760ac4..d8ee9455027286e4251d69bf62af09bcfac8ef4d 100644 (file)
@@ -476,10 +476,9 @@ static void read_credentials(Manager *m) {
         if (!m->read_resolv_conf)
                 return;
 
-        r = read_credential_strings_many(
-                        "network.dns", &dns,
-                        "network.search_domains", &domains);
-        if (r < 0 && !IN_SET(r, -ENXIO, -ENOENT))
+        r = read_credential_strings_many("network.dns", &dns,
+                                         "network.search_domains", &domains);
+        if (r < 0)
                 log_warning_errno(r, "Failed to read credentials, ignoring: %m");
 
         if (dns) {
index d570f49e7b51619b8dc5f39751b99c489c52d61c..59f580775dcd4e2818205667b8fc9c812623f56b 100644 (file)
@@ -96,17 +96,21 @@ int read_credential_strings_many_internal(
 
         /* Reads a bunch of credentials into the specified buffers. If the specified buffers are already
          * non-NULL frees them if a credential is found. Only supports string-based credentials
-         * (i.e. refuses embedded NUL bytes) */
+         * (i.e. refuses embedded NUL bytes).
+         *
+         * 0 is returned when some or all credentials are missing.
+         */
 
         if (!first_name)
                 return 0;
 
         r = read_credential(first_name, &b, NULL);
-        if (r == -ENXIO) /* no creds passed at all? propagate this */
-                return r;
-        if (r < 0)
-                ret = r;
-        else
+        if (r == -ENXIO) /* No creds passed at all? Bail immediately. */
+                return 0;
+        if (r < 0) {
+                if (r != -ENOENT)
+                        ret = r;
+        } else
                 free_and_replace(*first_value, b);
 
         va_list ap;
@@ -127,7 +131,7 @@ int read_credential_strings_many_internal(
 
                 r = read_credential(name, &bb, NULL);
                 if (r < 0) {
-                        if (ret >= 0)
+                        if (ret >= 0 && r != -ENOENT)
                                 ret = r;
                 } else
                         free_and_replace(*value, bb);
index 44022e73248532864690021a96d60658c61f4b44..25b0c34a5976526a5faf70f5f7d72bfa80743a19 100644 (file)
@@ -16,7 +16,7 @@ TEST(read_credential_strings) {
         if (e)
                 assert_se(saved = strdup(e));
 
-        assert_se(read_credential_strings_many("foo", &x, "bar", &y) == -ENXIO);
+        assert_se(read_credential_strings_many("foo", &x, "bar", &y) == 0);
         assert_se(x == NULL);
         assert_se(y == NULL);
 
@@ -24,20 +24,20 @@ TEST(read_credential_strings) {
 
         assert_se(setenv("CREDENTIALS_DIRECTORY", tmp, /* override= */ true) >= 0);
 
-        assert_se(read_credential_strings_many("foo", &x, "bar", &y) == -ENOENT);
+        assert_se(read_credential_strings_many("foo", &x, "bar", &y) == 0);
         assert_se(x == NULL);
         assert_se(y == NULL);
 
         assert_se(p = path_join(tmp, "bar"));
         assert_se(write_string_file(p, "piff", WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_AVOID_NEWLINE) >= 0);
 
-        assert_se(read_credential_strings_many("foo", &x, "bar", &y) == -ENOENT);
+        assert_se(read_credential_strings_many("foo", &x, "bar", &y) == 0);
         assert_se(x == NULL);
         assert_se(streq(y, "piff"));
 
         assert_se(write_string_file(p, "paff", WRITE_STRING_FILE_TRUNCATE|WRITE_STRING_FILE_AVOID_NEWLINE) >= 0);
 
-        assert_se(read_credential_strings_many("foo", &x, "bar", &y) == -ENOENT);
+        assert_se(read_credential_strings_many("foo", &x, "bar", &y) == 0);
         assert_se(x == NULL);
         assert_se(streq(y, "piff"));
 
index a359f848cc4123a52505c5d973a371decc693cdb..58fb5348f9adf0eb1f6cf248ef35bea9b8aa6770 100644 (file)
@@ -117,11 +117,8 @@ static int context_read_creds(Context *c) {
                         vc_meta_names[VC_FONT],          &v.config[VC_FONT],
                         vc_meta_names[VC_FONT_MAP],      &v.config[VC_FONT_MAP],
                         vc_meta_names[VC_FONT_UNIMAP],   &v.config[VC_FONT_UNIMAP]);
-        if (r < 0) {
-                if (r != -ENXIO)
-                        log_warning_errno(r, "Failed to import credentials, ignoring: %m");
-                return r;
-        }
+        if (r < 0)
+                log_warning_errno(r, "Failed to import credentials, ignoring: %m");
 
         context_merge_config(c, &v, NULL);
         return 0;