diff mbox series

[ovs-dev,5/7] raft: Fix resource leak from ignored ovsdb_log_write_and_free() error.

Message ID 5a12f37d427abd020bf839ad68d560811453dada.1749133911.git.echaudro@redhat.com
State Accepted
Commit 2c634482f2c3ba3c9edd6f5c95dc7e7a67a50abf
Delegated to: aaron conole
Headers show
Series Various Coverity fixes. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

Eelco Chaudron June 5, 2025, 2:51 p.m. UTC
The Raft codebase includes calls to ovsdb_log_write_and_free() that
are incorrectly wrapped in ignore(). This causes potential error
resources to be leaked.

These calls should be wrapped in ovsdb_error_destroy() instead, to
ensure that any returned error objects are properly freed and do not
result in memory leaks.

Fixes: 1b1d2e6daa56 ("ovsdb: Introduce experimental support for clustered databases.")
Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
---
 ovsdb/raft.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

Comments

Mike Pattrick June 5, 2025, 5:58 p.m. UTC | #1
On Thu, Jun 5, 2025 at 10:52 AM Eelco Chaudron via dev
<ovs-dev@openvswitch.org> wrote:
>
> The Raft codebase includes calls to ovsdb_log_write_and_free() that
> are incorrectly wrapped in ignore(). This causes potential error
> resources to be leaked.
>
> These calls should be wrapped in ovsdb_error_destroy() instead, to
> ensure that any returned error objects are properly freed and do not
> result in memory leaks.
>
> Fixes: 1b1d2e6daa56 ("ovsdb: Introduce experimental support for clustered databases.")
> Signed-off-by: Eelco Chaudron <echaudro@redhat.com>

Acked-by: Mike Pattrick <mkp@redhat.com>
Aaron Conole June 6, 2025, 1:46 p.m. UTC | #2
Eelco Chaudron via dev <ovs-dev@openvswitch.org> writes:

> The Raft codebase includes calls to ovsdb_log_write_and_free() that
> are incorrectly wrapped in ignore(). This causes potential error
> resources to be leaked.
>
> These calls should be wrapped in ovsdb_error_destroy() instead, to
> ensure that any returned error objects are properly freed and do not
> result in memory leaks.
>
> Fixes: 1b1d2e6daa56 ("ovsdb: Introduce experimental support for
> clustered databases.")
> Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
> ---

Amusingly, the ovsdb_log_write_and_free is marked as
OVS_WARN_UNUSED_RESULT to prevent ignoring the result.

Acked-by: Aaron Conole <aconole@redhat.com>

>  ovsdb/raft.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/ovsdb/raft.c b/ovsdb/raft.c
> index 78ae39e84..9694c94e6 100644
> --- a/ovsdb/raft.c
> +++ b/ovsdb/raft.c
> @@ -1261,7 +1261,8 @@ raft_record_note(struct raft *raft, const char *note,
>          .comment = comment,
>          .note = CONST_CAST(char *, note),
>      };
> -    ignore(ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
> +    ovsdb_error_destroy(
> +        ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
>  
>      free(comment);
>  }
> @@ -2996,7 +2997,8 @@ raft_become_leader(struct raft *raft)
>          .term = raft->term,
>          .sid = raft->sid,
>      };
> -    ignore(ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
> +    ovsdb_error_destroy(
> +        ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
>  
>      /* Initiate a no-op commit.  Otherwise we might never find out what's in
>       * the log.  See section 6.4 item 1:
> @@ -3224,7 +3226,8 @@ raft_update_commit_index(struct raft *raft, uint64_t new_commit_index)
>          .type = RAFT_REC_COMMIT_INDEX,
>          .commit_index = raft->commit_index,
>      };
> -    ignore(ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
> +    ovsdb_error_destroy(
> +        ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
>      return true;
>  }
>  
> @@ -3412,7 +3415,8 @@ raft_update_leader(struct raft *raft, const struct uuid *sid)
>              .term = raft->term,
>              .sid = *sid,
>          };
> -        ignore(ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
> +        ovsdb_error_destroy
> +            (ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
>      }
>      if (raft->role == RAFT_CANDIDATE) {
>          /* Section 3.4: While waiting for votes, a candidate may
Eelco Chaudron June 10, 2025, 8:25 p.m. UTC | #3
On 5 Jun 2025, at 19:58, Mike Pattrick wrote:

> On Thu, Jun 5, 2025 at 10:52 AM Eelco Chaudron via dev
> <ovs-dev@openvswitch.org> wrote:
>>
>> The Raft codebase includes calls to ovsdb_log_write_and_free() that
>> are incorrectly wrapped in ignore(). This causes potential error
>> resources to be leaked.
>>
>> These calls should be wrapped in ovsdb_error_destroy() instead, to
>> ensure that any returned error objects are properly freed and do not
>> result in memory leaks.
>>
>> Fixes: 1b1d2e6daa56 ("ovsdb: Introduce experimental support for clustered databases.")
>> Signed-off-by: Eelco Chaudron <echaudro@redhat.com>
>
> Acked-by: Mike Pattrick <mkp@redhat.com>

Thanks for the review Aaron and Mike! Applied to main.

//Eelco
diff mbox series

Patch

diff --git a/ovsdb/raft.c b/ovsdb/raft.c
index 78ae39e84..9694c94e6 100644
--- a/ovsdb/raft.c
+++ b/ovsdb/raft.c
@@ -1261,7 +1261,8 @@  raft_record_note(struct raft *raft, const char *note,
         .comment = comment,
         .note = CONST_CAST(char *, note),
     };
-    ignore(ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
+    ovsdb_error_destroy(
+        ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
 
     free(comment);
 }
@@ -2996,7 +2997,8 @@  raft_become_leader(struct raft *raft)
         .term = raft->term,
         .sid = raft->sid,
     };
-    ignore(ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
+    ovsdb_error_destroy(
+        ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
 
     /* Initiate a no-op commit.  Otherwise we might never find out what's in
      * the log.  See section 6.4 item 1:
@@ -3224,7 +3226,8 @@  raft_update_commit_index(struct raft *raft, uint64_t new_commit_index)
         .type = RAFT_REC_COMMIT_INDEX,
         .commit_index = raft->commit_index,
     };
-    ignore(ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
+    ovsdb_error_destroy(
+        ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
     return true;
 }
 
@@ -3412,7 +3415,8 @@  raft_update_leader(struct raft *raft, const struct uuid *sid)
             .term = raft->term,
             .sid = *sid,
         };
-        ignore(ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
+        ovsdb_error_destroy
+            (ovsdb_log_write_and_free(raft->log, raft_record_to_json(&r)));
     }
     if (raft->role == RAFT_CANDIDATE) {
         /* Section 3.4: While waiting for votes, a candidate may