Merge branch 'ab/refspec-init-fix'

Make refspec parsing codepath more robust.

* ab/refspec-init-fix:
  refspec: initalize `refspec_item` in `valid_fetch_refspec()`
  refspec: add back a refspec_item_init() function
  refspec: s/refspec_item_init/&_or_die/g
maint
Junio C Hamano 2018-06-28 12:53:29 -07:00
commit a909726903
4 changed files with 15 additions and 7 deletions

View File

@ -1077,7 +1077,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
if (option_required_reference.nr || option_optional_reference.nr) if (option_required_reference.nr || option_optional_reference.nr)
setup_reference(); setup_reference();


refspec_item_init(&refspec, value.buf, REFSPEC_FETCH); refspec_item_init_or_die(&refspec, value.buf, REFSPEC_FETCH);


strbuf_reset(&value); strbuf_reset(&value);



View File

@ -684,7 +684,7 @@ static const char *get_tracking_branch(const char *remote, const char *refspec)
const char *spec_src; const char *spec_src;
const char *merge_branch; const char *merge_branch;


refspec_item_init(&spec, refspec, REFSPEC_FETCH); refspec_item_init_or_die(&spec, refspec, REFSPEC_FETCH);
spec_src = spec.src; spec_src = spec.src;
if (!*spec_src || !strcmp(spec_src, "HEAD")) if (!*spec_src || !strcmp(spec_src, "HEAD"))
spec_src = "HEAD"; spec_src = "HEAD";

View File

@ -124,11 +124,16 @@ static int parse_refspec(struct refspec_item *item, const char *refspec, int fet
return 1; return 1;
} }


void refspec_item_init(struct refspec_item *item, const char *refspec, int fetch) int refspec_item_init(struct refspec_item *item, const char *refspec, int fetch)
{ {
memset(item, 0, sizeof(*item)); memset(item, 0, sizeof(*item));
return parse_refspec(item, refspec, fetch);
}


if (!parse_refspec(item, refspec, fetch)) void refspec_item_init_or_die(struct refspec_item *item, const char *refspec,
int fetch)
{
if (!refspec_item_init(item, refspec, fetch))
die("Invalid refspec '%s'", refspec); die("Invalid refspec '%s'", refspec);
} }


@ -152,7 +157,7 @@ void refspec_append(struct refspec *rs, const char *refspec)
{ {
struct refspec_item item; struct refspec_item item;


refspec_item_init(&item, refspec, rs->fetch); refspec_item_init_or_die(&item, refspec, rs->fetch);


ALLOC_GROW(rs->items, rs->nr + 1, rs->alloc); ALLOC_GROW(rs->items, rs->nr + 1, rs->alloc);
rs->items[rs->nr++] = item; rs->items[rs->nr++] = item;
@ -191,7 +196,7 @@ void refspec_clear(struct refspec *rs)
int valid_fetch_refspec(const char *fetch_refspec_str) int valid_fetch_refspec(const char *fetch_refspec_str)
{ {
struct refspec_item refspec; struct refspec_item refspec;
int ret = parse_refspec(&refspec, fetch_refspec_str, REFSPEC_FETCH); int ret = refspec_item_init(&refspec, fetch_refspec_str, REFSPEC_FETCH);
refspec_item_clear(&refspec); refspec_item_clear(&refspec);
return ret; return ret;
} }

View File

@ -32,7 +32,10 @@ struct refspec {
int fetch; int fetch;
}; };


void refspec_item_init(struct refspec_item *item, const char *refspec, int fetch); int refspec_item_init(struct refspec_item *item, const char *refspec,
int fetch);
void refspec_item_init_or_die(struct refspec_item *item, const char *refspec,
int fetch);
void refspec_item_clear(struct refspec_item *item); void refspec_item_clear(struct refspec_item *item);
void refspec_init(struct refspec *rs, int fetch); void refspec_init(struct refspec *rs, int fetch);
void refspec_append(struct refspec *rs, const char *refspec); void refspec_append(struct refspec *rs, const char *refspec);