Skip to content

Commit

Permalink
var: adjust memory allocation for strings
Browse files Browse the repository at this point in the history
Right now, all of our values are constants whose allocation is managed
elsewhere.  However, in the future, we'll have some variables whose
memory we will need to free.  To keep things consistent, let's make each
of our functions allocate its own memory and make the caller responsible
for freeing it.

Signed-off-by: brian m. carlson <bk2204@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
bk2204 authored and gitster committed Jun 27, 2023
1 parent f74c90d commit cdd489e
Showing 1 changed file with 29 additions and 16 deletions.
45 changes: 29 additions & 16 deletions builtin/var.c
Expand Up @@ -12,47 +12,57 @@

static const char var_usage[] = "git var (-l | <variable>)";

static const char *editor(int ident_flag UNUSED)
static char *committer(int ident_flag)
{
return git_editor();
return xstrdup_or_null(git_committer_info(ident_flag));
}

static const char *sequence_editor(int ident_flag UNUSED)
static char *author(int ident_flag)
{
return git_sequence_editor();
return xstrdup_or_null(git_author_info(ident_flag));
}

static const char *pager(int ident_flag UNUSED)
static char *editor(int ident_flag UNUSED)
{
return xstrdup_or_null(git_editor());
}

static char *sequence_editor(int ident_flag UNUSED)
{
return xstrdup_or_null(git_sequence_editor());
}

static char *pager(int ident_flag UNUSED)
{
const char *pgm = git_pager(1);

if (!pgm)
pgm = "cat";
return pgm;
return xstrdup(pgm);
}

static const char *default_branch(int ident_flag UNUSED)
static char *default_branch(int ident_flag UNUSED)
{
return git_default_branch_name(1);
return xstrdup_or_null(git_default_branch_name(1));
}

static const char *shell_path(int ident_flag UNUSED)
static char *shell_path(int ident_flag UNUSED)
{
return SHELL_PATH;
return xstrdup(SHELL_PATH);
}

struct git_var {
const char *name;
const char *(*read)(int);
char *(*read)(int);
};
static struct git_var git_vars[] = {
{
.name = "GIT_COMMITTER_IDENT",
.read = git_committer_info,
.read = committer,
},
{
.name = "GIT_AUTHOR_IDENT",
.read = git_author_info,
.read = author,
},
{
.name = "GIT_EDITOR",
Expand Down Expand Up @@ -83,11 +93,13 @@ static struct git_var git_vars[] = {
static void list_vars(void)
{
struct git_var *ptr;
const char *val;
char *val;

for (ptr = git_vars; ptr->read; ptr++)
if ((val = ptr->read(0)))
if ((val = ptr->read(0))) {
printf("%s=%s\n", ptr->name, val);
free(val);
}
}

static const struct git_var *get_git_var(const char *var)
Expand All @@ -113,7 +125,7 @@ static int show_config(const char *var, const char *value, void *cb)
int cmd_var(int argc, const char **argv, const char *prefix UNUSED)
{
const struct git_var *git_var;
const char *val;
char *val;

if (argc != 2)
usage(var_usage);
Expand All @@ -134,6 +146,7 @@ int cmd_var(int argc, const char **argv, const char *prefix UNUSED)
return 1;

printf("%s\n", val);
free(val);

return 0;
}

0 comments on commit cdd489e

Please sign in to comment.