Re: [PATCH v2] reftable/writer: fix memory leak if write fails
- From
Patrick Steinhardt <ps@pks.im>
- Date
- May 12, 2025, 08:25 UTC
- Message-ID
- <aCGwgbJ_dbO4vKq3@pks.im>
- In-Reply-To
- <pull.1958.v2.git.git.1746980165245.gitgitgadget@gmail.com>
On Sun, May 11, 2025 at 04:16:04PM +0000, Lidong Yan via GitGitGadget wrote:
Show 11 quoted lines
> From: Lidong Yan <502024330056@smail.nju.edu.cn> > > In reftable/writer.c:padded_write(), if w->writer failed, zeroed > allocated in `reftable_calloc` will leak. w->writer could be > `reftable_write_data` in reftable/stack.c, and could fail due to > some write error. Simply add reftable_free(zeroed) will solve this > problem. > > In reftable/writer.c:writer_index_hash(), if `reftable_buf_add` failed, > key allocated by `reftable_malloc` will not be insert into `obj_index_tree` > thus leaks. Simple add reftable_free(key) will solve this problem.
Nit: I think it would be sensible to split these up into two commits, as they touch different areas of the code.
Show 16 quoted lines
> diff --git a/reftable/writer.c b/reftable/writer.c
> index cb16f71be49..3b4ebdd6dce 100644
> --- a/reftable/writer.c
> +++ b/reftable/writer.c
> @@ -57,8 +57,10 @@ static int padded_write(struct reftable_writer *w, uint8_t *data, size_t len,
> return -1;
>
> n = w->write(w->write_arg, zeroed, w->pending_padding);
> - if (n < 0)
> + if (n < 0) {
> + reftable_free(zeroed);
> return n;
> + }
>
> w->pending_padding = 0;
> reftable_free(zeroed);Makes sense.
Show 12 quoted lines
> @@ -256,8 +258,10 @@ static int writer_index_hash(struct reftable_writer *w, struct reftable_buf *has
>
> reftable_buf_reset(&key->hash);
> err = reftable_buf_add(&key->hash, hash->buf, hash->len);
> - if (err < 0)
> + if (err < 0) {
> + reftable_free(key);
> return err;
> + }
> tree_insert(&w->obj_index_tree, key,
> &obj_index_tree_node_compare);
> } else {Makes sense, as well. We want to add the node to the object index tree, but if a step before fails then we naturally want to free the node.
Patrick