Skip to content

Commit

Permalink
use xgetcwd() to get the current directory or die
Browse files Browse the repository at this point in the history
Convert several calls of getcwd() and die() to use xgetcwd() instead.
This way we get rid of fixed-size buffers (which can be too small
depending on the used file system) and gain consistent error messages.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and Junio C Hamano committed Aug 26, 2014
1 parent aa14e98 commit 56b9f6e
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 22 deletions.
17 changes: 8 additions & 9 deletions builtin/init-db.c
Original file line number Diff line number Diff line change
Expand Up @@ -426,18 +426,20 @@ int init_db(const char *template_dir, unsigned int flags)

static int guess_repository_type(const char *git_dir)
{
char cwd[PATH_MAX];
const char *slash;
char *cwd;
int cwd_is_git_dir;

/*
* "GIT_DIR=. git init" is always bare.
* "GIT_DIR=`pwd` git init" too.
*/
if (!strcmp(".", git_dir))
return 1;
if (!getcwd(cwd, sizeof(cwd)))
die_errno(_("cannot tell cwd"));
if (!strcmp(git_dir, cwd))
cwd = xgetcwd();
cwd_is_git_dir = !strcmp(git_dir, cwd);
free(cwd);
if (cwd_is_git_dir)
return 1;
/*
* "GIT_DIR=.git or GIT_DIR=something/.git is usually not.
Expand Down Expand Up @@ -572,11 +574,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
git_work_tree_cfg = xstrdup(real_path(rel));
free(rel);
}
if (!git_work_tree_cfg) {
git_work_tree_cfg = xcalloc(PATH_MAX, 1);
if (!getcwd(git_work_tree_cfg, PATH_MAX))
die_errno (_("Cannot access current working directory"));
}
if (!git_work_tree_cfg)
git_work_tree_cfg = xgetcwd();
if (work_tree)
set_git_work_tree(real_path(work_tree));
else
Expand Down
6 changes: 3 additions & 3 deletions builtin/rev-parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
}
if (!strcmp(arg, "--git-dir")) {
const char *gitdir = getenv(GIT_DIR_ENVIRONMENT);
static char cwd[PATH_MAX];
char *cwd;
int len;
if (gitdir) {
puts(gitdir);
Expand All @@ -744,10 +744,10 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
puts(".git");
continue;
}
if (!getcwd(cwd, PATH_MAX))
die_errno("unable to get current working directory");
cwd = xgetcwd();
len = strlen(cwd);
printf("%s%s.git\n", cwd, len && cwd[len-1] != '/' ? "/" : "");
free(cwd);
continue;
}
if (!strcmp(arg, "--resolve-git-dir")) {
Expand Down
12 changes: 8 additions & 4 deletions dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -1500,12 +1500,16 @@ int dir_inside_of(const char *subdir, const char *dir)

int is_inside_dir(const char *dir)
{
char cwd[PATH_MAX];
char *cwd;
int rc;

if (!dir)
return 0;
if (!getcwd(cwd, sizeof(cwd)))
die_errno("can't find the current directory");
return dir_inside_of(cwd, dir) >= 0;

cwd = xgetcwd();
rc = (dir_inside_of(cwd, dir) >= 0);
free(cwd);
return rc;
}

int is_empty_dir(const char *path)
Expand Down
6 changes: 3 additions & 3 deletions setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,16 +434,16 @@ static const char *setup_explicit_git_dir(const char *gitdirenv,
if (is_absolute_path(git_work_tree_cfg))
set_git_work_tree(git_work_tree_cfg);
else {
char core_worktree[PATH_MAX];
char *core_worktree;
if (chdir(gitdirenv))
die_errno("Could not chdir to '%s'", gitdirenv);
if (chdir(git_work_tree_cfg))
die_errno("Could not chdir to '%s'", git_work_tree_cfg);
if (!getcwd(core_worktree, PATH_MAX))
die_errno("Could not get directory '%s'", git_work_tree_cfg);
core_worktree = xgetcwd();
if (chdir(cwd->buf))
die_errno("Could not come back to cwd");
set_git_work_tree(core_worktree);
free(core_worktree);
}
}
else if (!git_env_bool(GIT_IMPLICIT_WORK_TREE_ENVIRONMENT, 1)) {
Expand Down
7 changes: 4 additions & 3 deletions trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,13 +158,12 @@ void trace_repo_setup(const char *prefix)
{
static const char *key = "GIT_TRACE_SETUP";
const char *git_work_tree;
char cwd[PATH_MAX];
char *cwd;

if (!trace_want(key))
return;

if (!getcwd(cwd, PATH_MAX))
die("Unable to get current working directory");
cwd = xgetcwd();

if (!(git_work_tree = get_git_work_tree()))
git_work_tree = "(null)";
Expand All @@ -176,6 +175,8 @@ void trace_repo_setup(const char *prefix)
trace_printf_key(key, "setup: worktree: %s\n", quote_crnl(git_work_tree));
trace_printf_key(key, "setup: cwd: %s\n", quote_crnl(cwd));
trace_printf_key(key, "setup: prefix: %s\n", quote_crnl(prefix));

free(cwd);
}

int trace_want(const char *key)
Expand Down

0 comments on commit 56b9f6e

Please sign in to comment.