From: Stefan Sperling Subject: Re: Plug Memory Leak in got-read-commit libexec To: Kyle Ackerman Cc: gameoftrees@openbsd.org Date: Wed, 8 Apr 2026 11:08:57 +0200 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; > } > > >