Download raw body.
plug a few small leaks in tog and repository.c:match_packed_object()
plug a few small leaks in tog and repository.c:match_packed_object()
plug a few small leaks in tog and repository.c:match_packed_object()
On 2023/12/20 23:24:31 +1100, Mark Jamsek <mark@jamsek.com> wrote: > Omar Polo <op@omarpolo.com> wrote: > > > > by the way, create_diff() has a similar problem with f not being closed > > if the second got_opentemp() or fclose() fail. A similar treatment > > could be applied to it too. > > > > Thanks for letting me know about this one! > > We could fix it a few ways, and I'm partial to either of the below so > whichever you prefer is ok with me :) > > As alluded to in your previous email, we can just cleanup f on error in > create_diff() if we haven't already assigned f to s->f as in the topmost > diff. > > Alternatively, because s->f is always cleaned up in close_diff_view() on > error or otherwise, we can just reorder things to close s->f before > opening f and then assign f to s->f before calling got_opentemp() the > second time, thereby leaving cleanup to close_diff_view() as in the > second below diff (which also changes a few goto done to return err as > there's no cleanup needed in such cases). I prefer the second diff, the first one depends too much on the order of the operations at the top of the function. > [...] > --- tog/tog.c > +++ tog/tog.c > @@ -5318,21 +5318,17 @@ create_diff(struct tog_diff_view_state *s) > return got_error_from_errno("malloc"); > s->nlines = 0; > > + if (s->f && fclose(s->f) == EOF) > + return got_error_from_errno("fclose"); I'm not sure, but should we also set s->f = NULL before returning here? Realistically speaking this can fail only if we have a bug elsewhere and end up closing the fd backing this FILE. It's great that we catch the error, but then we leave s->f != NULL and attempt to fclose() it again, which I'm not sure it's allowed. > + > f = got_opentemp(); > - if (f == NULL) { > - err = got_error_from_errno("got_opentemp"); > - goto done; > - } > + if (f == NULL) > + return got_error_from_errno("got_opentemp"); > + s->f = f; > + just a nit, you can replace f with s->f and remove the f variable entirely. ok op@ either way. Thanks!
plug a few small leaks in tog and repository.c:match_packed_object()
plug a few small leaks in tog and repository.c:match_packed_object()
plug a few small leaks in tog and repository.c:match_packed_object()