From 55ace8e5c58441d1a2c64b297a38b232ef0c0e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 25 Apr 2023 17:58:34 +0200 Subject: [PATCH] shared/creds-util: return 0 for missing creds in read_credential_strings_many 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 | 7 +++---- src/shared/creds-util.c | 18 +++++++++++------- src/test/test-creds.c | 8 ++++---- src/vconsole/vconsole-setup.c | 7 ++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/resolve/resolved-conf.c b/src/resolve/resolved-conf.c index 70a6f99450..d8ee945502 100644 --- a/src/resolve/resolved-conf.c +++ b/src/resolve/resolved-conf.c @@ -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) { diff --git a/src/shared/creds-util.c b/src/shared/creds-util.c index d570f49e7b..59f580775d 100644 --- a/src/shared/creds-util.c +++ b/src/shared/creds-util.c @@ -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); diff --git a/src/test/test-creds.c b/src/test/test-creds.c index 44022e7324..25b0c34a59 100644 --- a/src/test/test-creds.c +++ b/src/test/test-creds.c @@ -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")); diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index a359f848cc..58fb5348f9 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -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;