Commit 0dc7faa9e43711899b05ff94aa85278352daf2fc

Stefan Sperling 2020-08-09T20:33:12

fix double-free when quitting tog's diff view; found by ofree at /home/stsp/src/got/tog/tog.c:3415 3415 free(s->line_offsets); (gdb) bt msg=0x80e2a4cd87e "chunk is already free %p") at /usr/src/lib/libc/stdlib/malloc.c:300 check=1) at /usr/src/lib/libc/stdlib/malloc.c:1070 clear=0, check=<optimized out>, argsz=0) at /usr/src/lib/libc/stdlib/malloc.c:1431 at /usr/src/lib/libc/stdlib/malloc.c:1488 at /home/stsp/src/got/tog/tog.c:3415 at /home/stsp/src/got/tog/tog.c:518 at /home/stsp/src/got/tog/tog.c:954 at /home/stsp/src/got/tog/tog.c:2728 at /home/stsp/src/got/tog/tog.c:5683 (gdb)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
diff --git a/tog/tog.c b/tog/tog.c
index 3ba1e43..c75199b 100644
--- a/tog/tog.c
+++ b/tog/tog.c
@@ -3103,6 +3103,7 @@ get_filestream_info(size_t *filesize, int *nlines, off_t **line_offsets,
 	if (fflush(infile) != 0) {
 		free(buf);
 		free(*line_offsets);
+		*line_offsets = NULL;
 		return got_error_from_errno("fflush");
 	}
 	rewind(infile);
@@ -3112,6 +3113,7 @@ get_filestream_info(size_t *filesize, int *nlines, off_t **line_offsets,
 
 	free(buf);
 	free(*line_offsets);
+	*line_offsets = NULL;
 	return NULL;
 }