propagate error from delta cache insertion; fixes mem leak
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
diff --git a/got/Makefile b/got/Makefile
index 8e74120..b96fa54 100644
--- a/got/Makefile
+++ b/got/Makefile
@@ -7,7 +7,9 @@ SRCS= got.c delta.c error.c fileindex.c object.c path.c pack.c \
CPPFLAGS = -I${.CURDIR}/../include -I${.CURDIR}/../lib
LDADD = -lutil -lz
DPADD = ${LIBZ} ${LIBUTIL}
-DEBUG = -O0 -g
+CC = gcc
+DEBUG = -O0 -pg
+CPPFLAGS += -DPROFILE
CFLAGS += -Werror -Wall -Wstrict-prototypes -Wunused-variable
# For now, default to installing binary in ~/bin
diff --git a/got/got.c b/got/got.c
index be95ec2..95a3c58 100644
--- a/got/got.c
+++ b/got/got.c
@@ -173,8 +173,10 @@ cmd_checkout(int argc, char *argv[])
argc -= optind;
argv += optind;
+#ifndef PROFILE
if (pledge("stdio rpath wpath cpath flock", NULL) == -1)
err(1, "pledge");
+#endif
if (argc == 1) {
char *cwd, *base, *dotgit;
@@ -298,9 +300,10 @@ cmd_log(int argc, char *argv[])
struct got_object *obj;
char *repo_path = NULL;
+#ifndef PROFILE
if (pledge("stdio rpath wpath cpath", NULL) == -1)
err(1, "pledge");
-
+#endif
if (argc == 1) {
repo_path = getcwd(NULL, 0);
if (repo_path == NULL)
diff --git a/lib/pack.c b/lib/pack.c
index d3af74a..c7bfedc 100644
--- a/lib/pack.c
+++ b/lib/pack.c
@@ -114,7 +114,7 @@ got_packidx_open(struct got_packidx_v2_hdr **packidx, const char *path)
f = fopen(path, "rb");
if (f == NULL)
- return got_error(GOT_ERR_BAD_PATH);
+ return got_error_from_errno();
err = get_packfile_size(&packfile_size, path);
if (err)
@@ -985,7 +985,7 @@ clear_delta_cache_entry(struct got_delta_cache_entry *entry)
entry->delta_len = 0;
}
-void
+const struct got_error *
add_delta_cache_entry(struct got_delta_cache *cache, off_t data_offset,
uint8_t *delta_buf, size_t delta_len)
{
@@ -1009,13 +1009,14 @@ add_delta_cache_entry(struct got_delta_cache *cache, off_t data_offset,
entry = &cache->deltas[i];
entry->delta_buf = calloc(1, delta_len);
if (entry->delta_buf == NULL)
- return;
+ return got_error(GOT_ERR_NO_MEM);
entry->data_offset = data_offset;
- memcpy(entry->delta_buf, delta_buf, delta_len);
+ entry->delta_buf = delta_buf;
entry->delta_len = delta_len;
+ return NULL;
}
-void
+const struct got_error *
cache_delta(off_t data_offset, uint8_t *delta_buf, size_t delta_len,
const char *path_packfile, struct got_repository *repo)
{
@@ -1026,11 +1027,9 @@ cache_delta(off_t data_offset, uint8_t *delta_buf, size_t delta_len,
cache = &repo->delta_cache[i];
if (cache->path_packfile == NULL)
break;
- if (strcmp(cache->path_packfile, path_packfile) == 0) {
- add_delta_cache_entry(cache, data_offset, delta_buf,
- delta_len);
- return;
- }
+ if (strcmp(cache->path_packfile, path_packfile) == 0)
+ return add_delta_cache_entry(cache, data_offset,
+ delta_buf, delta_len);
}
if (i == nitems(repo->delta_cache)) {
@@ -1052,8 +1051,8 @@ cache_delta(off_t data_offset, uint8_t *delta_buf, size_t delta_len,
cache = &repo->delta_cache[i];
cache->path_packfile = strdup(path_packfile);
if (cache->path_packfile == NULL)
- return;
- add_delta_cache_entry(cache, data_offset, delta_buf, delta_len);
+ return got_error(GOT_ERR_NO_MEM);
+ return add_delta_cache_entry(cache, data_offset, delta_buf, delta_len);
}
void
@@ -1129,7 +1128,6 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE *outfile,
uint8_t *delta_buf = NULL;
size_t delta_len = 0;
FILE *delta_file;
- int is_cached = 0;
delta_file = fopen(delta->path_packfile, "rb");
if (delta_file == NULL) {
@@ -1165,7 +1163,6 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE *outfile,
get_cached_delta(&delta_buf, &delta_len, delta->data_offset,
path_packfile, repo);
-
if (delta_buf == NULL) {
if (fseeko(delta_file, delta->data_offset, SEEK_CUR)
!= 0) {
@@ -1181,16 +1178,16 @@ dump_delta_chain(struct got_delta_chain *deltas, FILE *outfile,
if (err)
goto done;
- cache_delta(delta->data_offset, delta_buf, delta_len,
- path_packfile, repo);
- } else
- is_cached = 1;
+ err = cache_delta(delta->data_offset, delta_buf,
+ delta_len, path_packfile, repo);
+ if (err)
+ goto done;
+ }
+ /* delta_buf is now cached */
err = got_delta_apply(base_file, delta_buf, delta_len,
/* Final delta application writes to the output file. */
++n < deltas->nentries ? accum_file : outfile);
- if (!is_cached)
- free(delta_buf);
if (err)
goto done;