ensure that header->refs is always initialized
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
diff --git a/gotweb/gotweb.c b/gotweb/gotweb.c
index f1b6dca..6eb9c20 100644
--- a/gotweb/gotweb.c
+++ b/gotweb/gotweb.c
@@ -365,7 +365,7 @@ gw_diff(struct gw_trans *gw_trans)
NULL) == -1)
return got_error_from_errno("pledge");
- if ((header = malloc(sizeof(struct gw_header))) == NULL)
+ if ((header = gw_init_header()) == NULL)
return got_error_from_errno("malloc");
error = gw_apply_unveil(gw_trans->gw_dir->path, NULL);
@@ -546,7 +546,7 @@ gw_commits(struct gw_trans *gw_trans)
struct gw_header *header = NULL, *n_header = NULL;
enum kcgi_err kerr;
- if ((header = malloc(sizeof(struct gw_header))) == NULL)
+ if ((header = gw_init_header()) == NULL)
return got_error_from_errno("malloc");
if (pledge("stdio rpath proc exec sendfd unveil",
@@ -589,7 +589,8 @@ gw_commits(struct gw_trans *gw_trans)
if (kerr != KCGI_OK)
error = gw_kcgi_error(kerr);
- got_ref_list_free(&header->refs);
+ if (header)
+ got_ref_list_free(&header->refs);
gw_free_headers(header);
TAILQ_FOREACH(n_header, &gw_trans->gw_headers, entry)
gw_free_headers(n_header);
@@ -604,7 +605,7 @@ gw_briefs(struct gw_trans *gw_trans)
struct gw_header *header = NULL, *n_header = NULL;
enum kcgi_err kerr;
- if ((header = malloc(sizeof(struct gw_header))) == NULL)
+ if ((header = gw_init_header()) == NULL)
return got_error_from_errno("malloc");
if (pledge("stdio rpath proc exec sendfd unveil",
@@ -652,7 +653,8 @@ gw_briefs(struct gw_trans *gw_trans)
if (kerr != KCGI_OK)
error = gw_kcgi_error(kerr);
- got_ref_list_free(&header->refs);
+ if (header)
+ got_ref_list_free(&header->refs);
gw_free_headers(header);
TAILQ_FOREACH(n_header, &gw_trans->gw_headers, entry)
gw_free_headers(n_header);
@@ -782,7 +784,7 @@ gw_tree(struct gw_trans *gw_trans)
if (pledge("stdio rpath proc exec sendfd unveil", NULL) == -1)
return got_error_from_errno("pledge");
- if ((header = malloc(sizeof(struct gw_header))) == NULL)
+ if ((header = gw_init_header()) == NULL)
return got_error_from_errno("malloc");
error = gw_apply_unveil(gw_trans->gw_dir->path, NULL);
@@ -810,7 +812,8 @@ gw_tree(struct gw_trans *gw_trans)
kerr = khttp_puts(gw_trans->gw_req, tree);
if (kerr != KCGI_OK)
error = gw_kcgi_error(kerr);
- got_ref_list_free(&header->refs);
+ if (header)
+ got_ref_list_free(&header->refs);
gw_free_headers(header);
free(tree_html_disp);
free(tree_html);
@@ -1749,13 +1752,15 @@ gw_init_header()
{
struct gw_header *header;
- if ((header = malloc(sizeof(*header))) == NULL)
+ header = malloc(sizeof(*header));
+ if (header == NULL)
return NULL;
header->repo = NULL;
header->commit = NULL;
header->id = NULL;
header->path = NULL;
+ SIMPLEQ_INIT(&header->refs);
return header;
}
@@ -1934,8 +1939,6 @@ gw_get_header(struct gw_trans *gw_trans, struct gw_header *header, int limit)
if (error)
return error;
- SIMPLEQ_INIT(&header->refs);
-
if (gw_trans->commit == NULL) {
struct got_reference *head_ref;
error = got_ref_open(&head_ref, header->repo,