Skip to content

Commit

Permalink
Merge branch 'jk/external-diff-use-argv-array' (early part)
Browse files Browse the repository at this point in the history
Crash fix for codepath that miscounted the necessary size for an
array when spawning an external diff program.

* 'jk/external-diff-use-argv-array' (early part):
  run_external_diff: use an argv_array for the command line
  • Loading branch information
Junio C Hamano committed Apr 28, 2014
2 parents 35936f8 + 82fbf26 commit 5f11a7a
Showing 1 changed file with 16 additions and 16 deletions.
32 changes: 16 additions & 16 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "submodule.h"
#include "ll-merge.h"
#include "string-list.h"
#include "argv-array.h"

#ifdef NO_FAST_WORKING_DIRECTORY
#define FAST_WORKING_DIRECTORY 0
Expand Down Expand Up @@ -2894,9 +2895,8 @@ static void run_external_diff(const char *pgm,
int complete_rewrite,
struct diff_options *o)
{
const char *spawn_arg[10];
struct argv_array argv = ARGV_ARRAY_INIT;
int retval;
const char **arg = &spawn_arg[0];
struct diff_queue_struct *q = &diff_queued_diff;
const char *env[3] = { NULL };
char env_counter[50];
Expand All @@ -2907,23 +2907,22 @@ static void run_external_diff(const char *pgm,
const char *othername = (other ? other : name);
temp_one = prepare_temp_file(name, one);
temp_two = prepare_temp_file(othername, two);
*arg++ = pgm;
*arg++ = name;
*arg++ = temp_one->name;
*arg++ = temp_one->hex;
*arg++ = temp_one->mode;
*arg++ = temp_two->name;
*arg++ = temp_two->hex;
*arg++ = temp_two->mode;
argv_array_push(&argv, pgm);
argv_array_push(&argv, name);
argv_array_push(&argv, temp_one->name);
argv_array_push(&argv, temp_one->hex);
argv_array_push(&argv, temp_one->mode);
argv_array_push(&argv, temp_two->name);
argv_array_push(&argv, temp_two->hex);
argv_array_push(&argv, temp_two->mode);
if (other) {
*arg++ = other;
*arg++ = xfrm_msg;
argv_array_push(&argv, other);
argv_array_push(&argv, xfrm_msg);
}
} else {
*arg++ = pgm;
*arg++ = name;
argv_array_push(&argv, pgm);
argv_array_push(&argv, name);
}
*arg = NULL;
fflush(NULL);

env[0] = env_counter;
Expand All @@ -2932,8 +2931,9 @@ static void run_external_diff(const char *pgm,
env[1] = env_total;
snprintf(env_total, sizeof(env_total), "GIT_DIFF_PATH_TOTAL=%d", q->nr);

retval = run_command_v_opt_cd_env(spawn_arg, RUN_USING_SHELL, NULL, env);
retval = run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env);
remove_tempfile();
argv_array_clear(&argv);
if (retval) {
fprintf(stderr, "external diff died, stopping at %s.\n", name);
exit(1);
Expand Down

0 comments on commit 5f11a7a

Please sign in to comment.