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()
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). diff 85467924748b0e27f0105bde280878a149df9fc8 7b1dd741d3dd0d749fa33227f3961eba31281935 commit - 85467924748b0e27f0105bde280878a149df9fc8 commit + 7b1dd741d3dd0d749fa33227f3961eba31281935 blob - be366266e526e26c8734719d20d29ed05d463b06 blob + 1c0e6a67d711243f78a28fa4aba05dd2eccf0d98 --- tog/tog.c +++ tog/tog.c @@ -5422,6 +5422,8 @@ done: free(lines); if (commit2 != NULL) got_object_commit_close(commit2); + if (err != NULL && f != NULL && f != s->f) + fclose(f); got_pathlist_free(&changed_paths, GOT_PATHLIST_FREE_ALL); if (s->f && fflush(s->f) != 0 && err == NULL) err = got_error_from_errno("fflush"); -- diff /home/mark/src/got commit - 85467924748b0e27f0105bde280878a149df9fc8 path + /home/mark/src/got blob - be366266e526e26c8734719d20d29ed05d463b06 file + tog/tog.c --- 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"); + 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; + tmp_diff_file = got_opentemp(); - if (tmp_diff_file == NULL) { - err = got_error_from_errno("got_opentemp"); - goto done; - } - if (s->f && fclose(s->f) == EOF) { - err = got_error_from_errno("fclose"); - goto done; - } - s->f = f; + if (tmp_diff_file == NULL) + return got_error_from_errno("got_opentemp"); if (s->id1) err = got_object_get_type(&obj_type, s->repo, s->id1); -- Mark Jamsek <https://bsdbox.org> GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
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()