Browse Source

Merge branch 'jk/save-getenv-result'

There were many places the code relied on the string returned from
getenv() to be non-volatile, which is not true, that have been
corrected.

* jk/save-getenv-result:
  builtin_diff(): read $GIT_DIFF_OPTS closer to use
  merge-recursive: copy $GITHEAD strings
  init: make a copy of $GIT_DIR string
  config: make a copy of $GIT_CONFIG string
  commit: copy saved getenv() result
  get_super_prefix(): copy getenv() result
maint
Junio C Hamano 6 years ago
parent
commit
773e408881
  1. 3
      builtin/commit.c
  2. 2
      builtin/config.c
  3. 6
      builtin/init-db.c
  4. 15
      builtin/merge-recursive.c
  5. 5
      diff.c
  6. 4
      environment.c

3
builtin/commit.c

@ -351,7 +351,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
if (write_locked_index(&the_index, &index_lock, 0)) if (write_locked_index(&the_index, &index_lock, 0))
die(_("unable to create temporary index")); die(_("unable to create temporary index"));


old_index_env = getenv(INDEX_ENVIRONMENT); old_index_env = xstrdup_or_null(getenv(INDEX_ENVIRONMENT));
setenv(INDEX_ENVIRONMENT, get_lock_file_path(&index_lock), 1); setenv(INDEX_ENVIRONMENT, get_lock_file_path(&index_lock), 1);


if (interactive_add(argc, argv, prefix, patch_interactive) != 0) if (interactive_add(argc, argv, prefix, patch_interactive) != 0)
@ -361,6 +361,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix
setenv(INDEX_ENVIRONMENT, old_index_env, 1); setenv(INDEX_ENVIRONMENT, old_index_env, 1);
else else
unsetenv(INDEX_ENVIRONMENT); unsetenv(INDEX_ENVIRONMENT);
FREE_AND_NULL(old_index_env);


discard_cache(); discard_cache();
read_cache_from(get_lock_file_path(&index_lock)); read_cache_from(get_lock_file_path(&index_lock));

2
builtin/config.c

@ -599,7 +599,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
int nongit = !startup_info->have_repository; int nongit = !startup_info->have_repository;
char *value; char *value;


given_config_source.file = getenv(CONFIG_ENVIRONMENT); given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT));


argc = parse_options(argc, argv, prefix, builtin_config_options, argc = parse_options(argc, argv, prefix, builtin_config_options,
builtin_config_usage, builtin_config_usage,

6
builtin/init-db.c

@ -542,8 +542,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
* GIT_WORK_TREE makes sense only in conjunction with GIT_DIR * GIT_WORK_TREE makes sense only in conjunction with GIT_DIR
* without --bare. Catch the error early. * without --bare. Catch the error early.
*/ */
git_dir = getenv(GIT_DIR_ENVIRONMENT); git_dir = xstrdup_or_null(getenv(GIT_DIR_ENVIRONMENT));
work_tree = getenv(GIT_WORK_TREE_ENVIRONMENT); work_tree = xstrdup_or_null(getenv(GIT_WORK_TREE_ENVIRONMENT));
if ((!git_dir || is_bare_repository_cfg == 1) && work_tree) if ((!git_dir || is_bare_repository_cfg == 1) && work_tree)
die(_("%s (or --work-tree=<directory>) not allowed without " die(_("%s (or --work-tree=<directory>) not allowed without "
"specifying %s (or --git-dir=<directory>)"), "specifying %s (or --git-dir=<directory>)"),
@ -582,6 +582,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
} }


UNLEAK(real_git_dir); UNLEAK(real_git_dir);
UNLEAK(git_dir);
UNLEAK(work_tree);


flags |= INIT_DB_EXIST_OK; flags |= INIT_DB_EXIST_OK;
return init_db(git_dir, real_git_dir, template_dir, flags); return init_db(git_dir, real_git_dir, template_dir, flags);

15
builtin/merge-recursive.c

@ -7,16 +7,16 @@
static const char builtin_merge_recursive_usage[] = static const char builtin_merge_recursive_usage[] =
"git %s <base>... -- <head> <remote> ..."; "git %s <base>... -- <head> <remote> ...";


static const char *better_branch_name(const char *branch) static char *better_branch_name(const char *branch)
{ {
static char githead_env[8 + GIT_MAX_HEXSZ + 1]; static char githead_env[8 + GIT_MAX_HEXSZ + 1];
char *name; char *name;


if (strlen(branch) != the_hash_algo->hexsz) if (strlen(branch) != the_hash_algo->hexsz)
return branch; return xstrdup(branch);
xsnprintf(githead_env, sizeof(githead_env), "GITHEAD_%s", branch); xsnprintf(githead_env, sizeof(githead_env), "GITHEAD_%s", branch);
name = getenv(githead_env); name = getenv(githead_env);
return name ? name : branch; return xstrdup(name ? name : branch);
} }


int cmd_merge_recursive(int argc, const char **argv, const char *prefix) int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
@ -26,6 +26,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
int i, failed; int i, failed;
struct object_id h1, h2; struct object_id h1, h2;
struct merge_options o; struct merge_options o;
char *better1, *better2;
struct commit *result; struct commit *result;


init_merge_options(&o); init_merge_options(&o);
@ -70,13 +71,17 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
if (get_oid(o.branch2, &h2)) if (get_oid(o.branch2, &h2))
die(_("could not resolve ref '%s'"), o.branch2); die(_("could not resolve ref '%s'"), o.branch2);


o.branch1 = better_branch_name(o.branch1); o.branch1 = better1 = better_branch_name(o.branch1);
o.branch2 = better_branch_name(o.branch2); o.branch2 = better2 = better_branch_name(o.branch2);


if (o.verbosity >= 3) if (o.verbosity >= 3)
printf(_("Merging %s with %s\n"), o.branch1, o.branch2); printf(_("Merging %s with %s\n"), o.branch1, o.branch2);


failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, &result); failed = merge_recursive_generic(&o, &h1, &h2, bases_count, bases, &result);

free(better1);
free(better2);

if (failed < 0) if (failed < 0)
return 128; /* die() error code */ return 128; /* die() error code */
return failed; return failed;

5
diff.c

@ -3544,7 +3544,7 @@ static void builtin_diff(const char *name_a,
o->found_changes = 1; o->found_changes = 1;
} else { } else {
/* Crazy xdl interfaces.. */ /* Crazy xdl interfaces.. */
const char *diffopts = getenv("GIT_DIFF_OPTS"); const char *diffopts;
const char *v; const char *v;
xpparam_t xpp; xpparam_t xpp;
xdemitconf_t xecfg; xdemitconf_t xecfg;
@ -3587,12 +3587,15 @@ static void builtin_diff(const char *name_a,
xecfg.flags |= XDL_EMIT_FUNCCONTEXT; xecfg.flags |= XDL_EMIT_FUNCCONTEXT;
if (pe) if (pe)
xdiff_set_find_func(&xecfg, pe->pattern, pe->cflags); xdiff_set_find_func(&xecfg, pe->pattern, pe->cflags);

diffopts = getenv("GIT_DIFF_OPTS");
if (!diffopts) if (!diffopts)
; ;
else if (skip_prefix(diffopts, "--unified=", &v)) else if (skip_prefix(diffopts, "--unified=", &v))
xecfg.ctxlen = strtoul(v, NULL, 10); xecfg.ctxlen = strtoul(v, NULL, 10);
else if (skip_prefix(diffopts, "-u", &v)) else if (skip_prefix(diffopts, "-u", &v))
xecfg.ctxlen = strtoul(v, NULL, 10); xecfg.ctxlen = strtoul(v, NULL, 10);

if (o->word_diff) if (o->word_diff)
init_diff_words_data(&ecbdata, o, one, two); init_diff_words_data(&ecbdata, o, one, two);
if (xdi_diff_outf(&mf1, &mf2, NULL, fn_out_consume, if (xdi_diff_outf(&mf1, &mf2, NULL, fn_out_consume,

4
environment.c

@ -107,7 +107,7 @@ char *git_work_tree_cfg;


static char *git_namespace; static char *git_namespace;


static const char *super_prefix; static char *super_prefix;


/* /*
* Repository-local GIT_* environment variables; see cache.h for details. * Repository-local GIT_* environment variables; see cache.h for details.
@ -240,7 +240,7 @@ const char *get_super_prefix(void)
{ {
static int initialized; static int initialized;
if (!initialized) { if (!initialized) {
super_prefix = getenv(GIT_SUPER_PREFIX_ENVIRONMENT); super_prefix = xstrdup_or_null(getenv(GIT_SUPER_PREFIX_ENVIRONMENT));
initialized = 1; initialized = 1;
} }
return super_prefix; return super_prefix;

Loading…
Cancel
Save