]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
machine-credential: fix GREEDY_REALLOC error handling
authorLennart Poettering <lennart@poettering.net>
Wed, 22 Nov 2023 10:53:45 +0000 (11:53 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 22 Nov 2023 14:17:18 +0000 (15:17 +0100)
We must check the return value of GREEDY_REALLOC for OOM, and the
pointer are updated already on success, hence it's a bad idea to make a
copy of the pointer beforehand.

src/shared/machine-credential.c

index 9c3a352e94c877ceee77de0ea605ecdc7b8ec8df..0e6db381b6fb956092f140dc85a152edc9e740dc 100644 (file)
@@ -30,13 +30,12 @@ void machine_credential_free_all(MachineCredential *creds, size_t n) {
 
 int machine_credential_set(MachineCredential **credentials, size_t *n_credentials, const char *cred_string) {
         _cleanup_free_ char *word = NULL, *data = NULL;
-        MachineCredential *creds = *ASSERT_PTR(credentials);
         ssize_t l;
-        size_t n_creds = *ASSERT_PTR(n_credentials);
         int r;
         const char *p = ASSERT_PTR(cred_string);
 
-        assert(creds || n_creds == 0);
+        assert(credentials && n_credentials);
+        assert(*credentials || *n_credentials == 0);
 
         r = extract_first_word(&p, &word, ":", EXTRACT_DONT_COALESCE_SEPARATORS);
         if (r < 0)
@@ -47,7 +46,7 @@ int machine_credential_set(MachineCredential **credentials, size_t *n_credential
         if (!credential_name_valid(word))
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "MachineCredential name is not valid: %s", word);
 
-        FOREACH_ARRAY(cred, creds, n_creds)
+        FOREACH_ARRAY(cred, *credentials, *n_credentials)
                 if (streq(cred->id, word))
                         return log_error_errno(SYNTHETIC_ERRNO(EEXIST), "Duplicate credential '%s', refusing.", word);
 
@@ -55,19 +54,15 @@ int machine_credential_set(MachineCredential **credentials, size_t *n_credential
         if (l < 0)
                 return log_error_errno(l, "Failed to unescape credential data: %s", p);
 
-        GREEDY_REALLOC(creds, n_creds + 1);
-        if (!creds)
+        if (!GREEDY_REALLOC(*credentials, *n_credentials + 1))
                 return log_oom();
 
-        creds[n_creds++] = (MachineCredential) {
+        (*credentials)[(*n_credentials)++] = (MachineCredential) {
                 .id = TAKE_PTR(word),
                 .data = TAKE_PTR(data),
                 .size = l,
         };
 
-        *credentials = creds;
-        *n_credentials = n_creds;
-
         return 0;
 }
 
@@ -75,12 +70,12 @@ int machine_credential_load(MachineCredential **credentials, size_t *n_credentia
         ReadFullFileFlags flags = READ_FULL_FILE_SECURE;
         _cleanup_(erase_and_freep) char *data = NULL;
         _cleanup_free_ char *word = NULL, *j = NULL;
-        MachineCredential *creds = *ASSERT_PTR(credentials);
-        size_t size, n_creds = *ASSERT_PTR(n_credentials);
-        int r;
         const char *p = ASSERT_PTR(cred_path);
+        size_t size;
+        int r;
 
-        assert(creds || n_creds == 0);
+        assert(credentials && n_credentials);
+        assert(*credentials || *n_credentials == 0);
 
         r = extract_first_word(&p, &word, ":", EXTRACT_DONT_COALESCE_SEPARATORS);
         if (r < 0)
@@ -91,7 +86,7 @@ int machine_credential_load(MachineCredential **credentials, size_t *n_credentia
         if (!credential_name_valid(word))
                 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "MachineCredential name is not valid: %s", word);
 
-        FOREACH_ARRAY(cred, creds, n_creds)
+        FOREACH_ARRAY(cred, *credentials, *n_credentials)
                 if (streq(cred->id, word))
                         return log_error_errno(SYNTHETIC_ERRNO(EEXIST), "Duplicate credential '%s', refusing.", word);
 
@@ -116,18 +111,14 @@ int machine_credential_load(MachineCredential **credentials, size_t *n_credentia
         if (r < 0)
                 return log_error_errno(r, "Failed to read credential '%s': %m", j ?: p);
 
-        GREEDY_REALLOC(creds, n_creds + 1);
-        if (!creds)
+        if (!GREEDY_REALLOC(*credentials, *n_credentials + 1))
                 return log_oom();
 
-        creds[n_creds++] = (MachineCredential) {
+        (*credentials)[(*n_credentials)++] = (MachineCredential) {
                 .id = TAKE_PTR(word),
                 .data = TAKE_PTR(data),
                 .size = size,
         };
 
-        *credentials = creds;
-        *n_credentials = n_creds;
-
         return 0;
 }