···325}
326327static void get_correspondences(struct string_list *a, struct string_list *b,
328- int creation_factor)
329{
330 int n = a->nr + b->nr;
331 int *cost, c, *a2b, *b2a;
332 int i, j;
333-334- ALLOC_ARRAY(cost, st_mult(n, n));
00000000000335 ALLOC_ARRAY(a2b, n);
336 ALLOC_ARRAY(b2a, n);
337···591 if (!res) {
592 find_exact_matches(&branch1, &branch2);
593 get_correspondences(&branch1, &branch2,
594- range_diff_opts->creation_factor);
0595 output(&branch1, &branch2, range_diff_opts);
596 }
597
···325}
326327static void get_correspondences(struct string_list *a, struct string_list *b,
328+ int creation_factor, size_t max_memory)
329{
330 int n = a->nr + b->nr;
331 int *cost, c, *a2b, *b2a;
332 int i, j;
333+ size_t cost_size = st_mult(n, n);
334+ size_t cost_bytes = st_mult(sizeof(int), cost_size);
335+ if (cost_bytes >= max_memory) {
336+ struct strbuf cost_str = STRBUF_INIT;
337+ struct strbuf max_str = STRBUF_INIT;
338+ strbuf_humanise_bytes(&cost_str, cost_bytes);
339+ strbuf_humanise_bytes(&max_str, max_memory);
340+ die(_("range-diff: unable to compute the range-diff, since it "
341+ "exceeds the maximum memory for the cost matrix: %s "
342+ "(%"PRIuMAX" bytes) needed, limited to %s (%"PRIuMAX" bytes)"),
343+ cost_str.buf, (uintmax_t)cost_bytes, max_str.buf, (uintmax_t)max_memory);
344+ }
345+ ALLOC_ARRAY(cost, cost_size);
346 ALLOC_ARRAY(a2b, n);
347 ALLOC_ARRAY(b2a, n);
348···602 if (!res) {
603 find_exact_matches(&branch1, &branch2);
604 get_correspondences(&branch1, &branch2,
605+ range_diff_opts->creation_factor,
606+ range_diff_opts->max_memory);
607 output(&branch1, &branch2, range_diff_opts);
608 }
609
+5
range-diff.h
···5#include "strvec.h"
67#define RANGE_DIFF_CREATION_FACTOR_DEFAULT 60
000089/*
10 * A much higher value than the default, when we KNOW we are comparing
···17 unsigned dual_color:1;
18 unsigned left_only:1, right_only:1;
19 unsigned include_merges:1;
020 const struct diff_options *diffopt; /* may be NULL */
21 const struct strvec *other_arg; /* may be NULL */
22};
···5#include "strvec.h"
67#define RANGE_DIFF_CREATION_FACTOR_DEFAULT 60
8+#define RANGE_DIFF_MAX_MEMORY_DEFAULT \
9+ (sizeof(void*) >= 8 ? \
10+ ((size_t)(1024L * 1024L) * (size_t)(4L * 1024L)) : /* 4GB on 64-bit */ \
11+ ((size_t)(1024L * 1024L) * (size_t)(2L * 1024L))) /* 2GB on 32-bit */
1213/*
14 * A much higher value than the default, when we KNOW we are comparing
···21 unsigned dual_color:1;
22 unsigned left_only:1, right_only:1;
23 unsigned include_merges:1;
24+ size_t max_memory;
25 const struct diff_options *diffopt; /* may be NULL */
26 const struct strvec *other_arg; /* may be NULL */
27};