Commit Diff


commit - 3b6ceab72113b16a8d3afc65aa69b935c753ffdf
commit + 510885f759bdcb9febc6710d120af30902c7173c
blob - 81bee5d10a73f1abc58d5aa0dd0594fd0e3b594a
blob + 0bf41ae10a87ab991e0d1236f6d45770c65cd94f
--- lib/pack_create.c
+++ lib/pack_create.c
@@ -431,6 +431,8 @@ pick_deltas(struct got_pack_meta **meta, int nmeta, in
 	int i, j, ndeltas, best_ndeltas;
 	off_t size, best_size;
 	const int max_base_candidates = 3;
+	size_t delta_memsize = 0;
+	const size_t max_delta_memsize = 25 * GOT_DELTA_RESULT_SIZE_CACHED_MAX;
 	int outfd = -1;
 
 	qsort(meta, nmeta, sizeof(struct got_pack_meta *), delta_order_cmp);
@@ -547,7 +549,9 @@ pick_deltas(struct got_pack_meta **meta, int nmeta, in
 		}
 
 		if (best_ndeltas > 0) {
-			if (best_size <= GOT_DELTA_RESULT_SIZE_CACHED_MAX) {
+			if (best_size <= GOT_DELTA_RESULT_SIZE_CACHED_MAX &&
+			    delta_memsize + best_size <= max_delta_memsize) {
+				delta_memsize += best_size;
 				err = encode_delta_in_mem(m, raw, best_deltas,
 				    best_ndeltas, best_size, m->prev->size);
 			} else {