"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Stefan Sperling <stsp@stsp.name>
Subject:
Re: Plug Memory Leak in got-read-commit libexec
To:
Kyle Ackerman <kack@kyleackerman.net>
Cc:
gameoftrees@openbsd.org
Date:
Wed, 8 Apr 2026 11:08:57 +0200

Download raw body.

Thread
On Tue, Apr 07, 2026 at 09:38:52PM -0600, Kyle Ackerman wrote:
> This is continuing work of commit
> 866e94146b2586459ca83c90f49ece8c91e1fdff.  This plugs a memory leak in
> got-read-commit when gets an imsg of type GOT_IMSG_STOP, it attempts to
> exit the main loop and leaks the last imsg they received.

Nice catch, thanks!

The diff could be shortened a bit by calling imsg_free(&imsg) before
breaking out of the loop in the IMSG_STOP case.

But either way, ok by me.


> diff /home/kyle/src/got
> path + /home/kyle/src/got
> commit - 5c86702e70cdb94ddc97d82e332b8df785e7de3d
> blob - 1c9530650e49205611fe769567650b4ac85a912c
> file + libexec/got-read-commit/got-read-commit.c
> --- libexec/got-read-commit/got-read-commit.c
> +++ libexec/got-read-commit/got-read-commit.c
> @@ -80,6 +80,7 @@ main(int argc, char *argv[])
>  		struct imsg imsg;
>  		struct got_commit_object *commit = NULL;
>  		struct got_object_id expected_id;
> +		int finished = 0;
>  		int fd = -1;
>  
>  		if (sigint_received) {
> @@ -94,8 +95,10 @@ main(int argc, char *argv[])
>  			break;
>  		}
>  
> -		if (imsg.hdr.type == GOT_IMSG_STOP)
> -			break;
> +		if (imsg.hdr.type == GOT_IMSG_STOP) {
> +			finished = 1;
> +			goto done;
> +		}
>  
>  		if (imsg.hdr.type != GOT_IMSG_COMMIT_REQUEST) {
>  			err = got_error(GOT_ERR_PRIVSEP_MSG);
> @@ -125,7 +128,7 @@ done:
>  		if (fd != -1 && close(fd) == -1 && err == NULL)
>  			err = got_error_from_errno("close");
>  		imsg_free(&imsg);
> -		if (err)
> +		if (err || finished)
>  			break;
>  	}
> 
> 
>