From: Pranit Bauva <pranit.bauva@xxxxxxxxx> As more and more calls are happening to the subcommands in `git bisect--helper`, more specifically when `bisect_start $rev` is converted to `git bisect--helper --bisect-start $rev` it is necessary to dequote the arguments because of shell to C conversion. Mentored-by: Christian Couder <chriscool@xxxxxxxxxxxxx> Mentored-by: Johannes Schindelin <Johannes.Schindelin@xxxxxx> Signed-off-by: Pranit Bauva <pranit.bauva@xxxxxxxxx> Signed-off-by: Tanushree Tumane <tanushreetumane@xxxxxxxxx> --- builtin/bisect--helper.c | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c index d538cb04fb..b9f2138811 100644 --- a/builtin/bisect--helper.c +++ b/builtin/bisect--helper.c @@ -557,6 +557,11 @@ static int bisect_auto_next(struct bisect_terms *terms, const char *prefix) return 0; } +static inline char *dequote_arg(const char *arg) +{ + return arg[0] != '\'' ? xstrdup(arg) : sq_dequote(xstrdup(arg)); +} + static int bisect_start(struct bisect_terms *terms, int no_checkout, const char **argv, int argc) { @@ -577,15 +582,22 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout, * Check for one bad and then some good revisions */ for (i = 0; i < argc; i++) { - if (!strcmp(argv[i], "--")) { + char *arg = dequote_arg(argv[i]); + + if (!strcmp(arg, "--")) { has_double_dash = 1; + free(arg); break; } + free(arg); } for (i = 0; i < argc; i++) { - const char *arg = argv[i]; - if (!strcmp(argv[i], "--")) { + char *dequoted = dequote_arg(argv[i]); + const char *arg = dequoted; + + if (!strcmp(arg, "--")) { + free(dequoted); break; } else if (!strcmp(arg, "--no-checkout")) { no_checkout = 1; @@ -593,7 +605,7 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout, !strcmp(arg, "--term-old")) { must_write_terms = 1; free((void *) terms->term_good); - terms->term_good = xstrdup(argv[++i]); + terms->term_good = dequote_arg(argv[++i]); } else if (skip_prefix(arg, "--term-good=", &arg) || skip_prefix(arg, "--term-old=", &arg)) { must_write_terms = 1; @@ -603,24 +615,31 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout, !strcmp(arg, "--term-new")) { must_write_terms = 1; free((void *) terms->term_bad); - terms->term_bad = xstrdup(argv[++i]); + terms->term_bad = dequote_arg(argv[++i]); } else if (skip_prefix(arg, "--term-bad=", &arg) || skip_prefix(arg, "--term-new=", &arg)) { must_write_terms = 1; free((void *) terms->term_bad); terms->term_bad = xstrdup(arg); } else if (starts_with(arg, "--") && - !one_of(arg, "--term-good", "--term-bad", NULL)) { - return error(_("unrecognized option: '%s'"), arg); + !one_of(arg, "--term-good", "--term-bad", NULL)) { + error(_("unrecognized option: '%s'"), arg); + free(dequoted); + return -1; } else { char *commit_id = xstrfmt("%s^{commit}", arg); - if (get_oid(commit_id, &oid) && has_double_dash) - die(_("'%s' does not appear to be a valid " - "revision"), arg); + if (get_oid(commit_id, &oid) && has_double_dash) { + error(_("'%s' does not appear to be a valid " + "revision"), arg); + free(commit_id); + free(dequoted); + return -1; + } string_list_append(&revs, oid_to_hex(&oid)); free(commit_id); } + free(dequoted); } pathspec_pos = i; -- gitgitgadget