1
0
mirror of https://github.com/systemd/systemd synced 2024-07-09 04:26:06 +00:00

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
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2023-04-25 17:58:34 +02:00
parent 4a75704b16
commit 55ace8e5c5
4 changed files with 20 additions and 20 deletions

View 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) {

View 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);

View 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"));

View 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;