Commit Diff


commit - 58c811c51491d5fcdd876688e147ce6b96f755c0
commit + 3efa19e75ebf0cd7f05f7a3a757ce16f60498dbd
blob - c8bef69378fb819bd6da341a564b69f4c607c911
blob + 89c49ef2aabd9550a244a7e724def3014b1fc8d9
--- lib/inflate.c
+++ lib/inflate.c
@@ -310,7 +310,7 @@ got_inflate_to_mem_mmap(uint8_t **outbuf, size_t *outl
 		err = got_inflate_read_mmap(&zb, map, offset, len, &avail,
 		    &consumed);
 		if (err)
-			return err;
+			goto done;
 		offset += consumed;
 		len -= consumed;
 		*outlen += avail;
blob - 1c66bfadb8250179fc94476c4ca906a53a5a71cf
blob + eaca8311fc195b30910f37ca7d19b7bfe34ffc13
--- lib/pack.c
+++ lib/pack.c
@@ -983,7 +983,7 @@ resolve_ref_delta(struct got_delta_chain *deltas, stru
 	uint64_t base_size;
 	size_t base_tslen;
 	off_t delta_data_offset;
-	uint8_t *delta_buf;
+	uint8_t *delta_buf = NULL;
 	size_t delta_len;
 
 	if (delta_offset >= pack->filesize)
@@ -1006,7 +1006,7 @@ resolve_ref_delta(struct got_delta_chain *deltas, stru
 		err = got_inflate_to_mem_mmap(&delta_buf, &delta_len, pack->map,
 		    mapoff, pack->filesize - mapoff);
 		if (err)
-			return err;
+			goto done;
 	} else {
 		ssize_t n = read(pack->fd, &id, sizeof(id));
 		if (n < 0)
@@ -1015,22 +1015,25 @@ resolve_ref_delta(struct got_delta_chain *deltas, stru
 			return got_error(GOT_ERR_BAD_PACKFILE);
 		err = got_inflate_to_mem_fd(&delta_buf, &delta_len, pack->fd);
 		if (err)
-			return err;
+			goto done;
 	}
 
 	err = add_delta(deltas, pack->path_packfile, delta_offset, tslen,
 	    delta_type, delta_size, delta_data_offset, delta_buf, delta_len);
 	if (err)
-		return err;
+		goto done;
 
 	/* Delta base must be in the same pack file. */
 	idx = get_object_idx(packidx, &id, repo);
-	if (idx == -1)
-		return got_error(GOT_ERR_BAD_PACKFILE);
+	if (idx == -1) {
+		err = got_error(GOT_ERR_BAD_PACKFILE);
+		goto done;
+	}
 
 	base_offset = get_object_offset(packidx, idx);
 	if (base_offset == (uint64_t)-1) {
-		return got_error(GOT_ERR_BAD_PACKIDX);
+		err = got_error(GOT_ERR_BAD_PACKIDX);
+		goto done;
 	}
 
 	if (base_offset >= pack->filesize) {
@@ -1046,6 +1049,8 @@ resolve_ref_delta(struct got_delta_chain *deltas, stru
 	err = resolve_delta_chain(deltas, repo, packidx, pack, base_offset,
 	    base_tslen, base_type, base_size, recursion - 1);
 done:
+	if (err)
+		free(delta_buf);
 	return err;
 }