]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
creds-util: make read_credential_strings_many behave the same as comment
authorMike Yuan <me@yhndnzj.com>
Tue, 9 Jan 2024 07:00:53 +0000 (15:00 +0800)
committerLennart Poettering <lennart@poettering.net>
Wed, 10 Jan 2024 08:54:39 +0000 (09:54 +0100)
The comment states "If the specified buffers are already non-NULL
frees them if a credential is found".

Also return 1 if all credentials are found.

src/shared/creds-util.c
src/test/test-creds.c

index 08d915cb8da82e993f0feefe9e8abcf226fa67dd..434907c9986b9eb18ec8a48d966a73644f808e5b 100644 (file)
@@ -219,6 +219,7 @@ int read_credential_strings_many_internal(
                 ...) {
 
         _cleanup_free_ void *b = NULL;
+        bool all = true;
         int r, ret = 0;
 
         /* Reads a bunch of credentials into the specified buffers. If the specified buffers are already
@@ -234,10 +235,11 @@ int read_credential_strings_many_internal(
         r = read_credential(first_name, &b, NULL);
         if (r == -ENXIO) /* No creds passed at all? Bail immediately. */
                 return 0;
-        if (r < 0) {
-                if (r != -ENOENT)
-                        ret = r;
-        } else
+        if (r == -ENOENT)
+                all = false;
+        else if (r < 0)
+                RET_GATHER(ret, r);
+        else
                 free_and_replace(*first_value, b);
 
         va_list ap;
@@ -252,20 +254,19 @@ int read_credential_strings_many_internal(
                 if (!name)
                         break;
 
-                value = va_arg(ap, char **);
-                if (*value)
-                        continue;
+                value = ASSERT_PTR(va_arg(ap, char **));
 
                 r = read_credential(name, &bb, NULL);
-                if (r < 0) {
-                        if (ret >= 0 && r != -ENOENT)
-                                ret = r;
-                } else
+                if (r == -ENOENT)
+                        all = false;
+                else if (r < 0)
+                        RET_GATHER(ret, r);
+                else
                         free_and_replace(*value, bb);
         }
 
         va_end(ap);
-        return ret;
+        return ret < 0 ? ret : all;
 }
 
 int read_credential_bool(const char *name) {
index 778bb6ab8fafa8066e658a38ae2be72674f43dfd..e56a2f38e382fec6d5760b4da2819083aebf2dbf 100644 (file)
@@ -42,18 +42,12 @@ TEST(read_credential_strings) {
 
         assert_se(read_credential_strings_many("foo", &x, "bar", &y) == 0);
         assert_se(x == NULL);
-        assert_se(streq(y, "piff"));
+        assert_se(streq(y, "paff"));
 
         p = mfree(p);
         assert_se(p = path_join(tmp, "foo"));
         assert_se(write_string_file(p, "knurz", WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_AVOID_NEWLINE) >= 0);
 
-        assert_se(read_credential_strings_many("foo", &x, "bar", &y) >= 0);
-        assert_se(streq(x, "knurz"));
-        assert_se(streq(y, "piff"));
-
-        y = mfree(y);
-
         assert_se(read_credential_strings_many("foo", &x, "bar", &y) >= 0);
         assert_se(streq(x, "knurz"));
         assert_se(streq(y, "paff"));
@@ -64,7 +58,9 @@ TEST(read_credential_strings) {
         assert_se(fwrite("x\0y", 1, 3, f) == 3); /* embedded NUL byte should result in EBADMSG when reading back with read_credential_strings_many() */
         f = safe_fclose(f);
 
-        assert_se(read_credential_strings_many("bazz", &x, "foo", &y) == -EBADMSG);
+        y = mfree(y);
+
+        assert_se(read_credential_strings_many("bazz", &x, "bar", &y) == -EBADMSG);
         assert_se(streq(x, "knurz"));
         assert_se(streq(y, "paff"));