sequencer.c: fix overflow & segfault in parse_strategy_opts()
commit15a4cc912e601c1641e549861e284f63e30f562c
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Tue, 7 Mar 2023 18:21:59 +0000 (7 19:21 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 Mar 2023 22:14:42 +0000 (8 14:14 -0800)
tree1d212a00d8ce74800c82a64009f50dd1202d616c
parent768bb238c4843bf52847773a621de4dffa6b9ab5
sequencer.c: fix overflow & segfault in parse_strategy_opts()

The split_cmdline() function introduced in [1] returns an "int". If
it's negative it signifies an error. The option parsing in [2] didn't
account for this, and assigned the value directly to the "size_t
xopts_nr". We'd then attempt to loop over all of these elements, and
access uninitialized memory.

There's a few things that use this for option parsing, but one way to
trigger it is with a bad value to "-X <strategy-option>", e.g:

git rebase -X"bad argument\""

In another context this might be a security issue, but in this case
someone who's already able to inject arguments directly to our
commands would be past other defenses, making this potential
escalation a moot point.

As the example above & test case shows the error reporting leaves
something to be desired. The function will loop over the
whitespace-split values, but when it encounters an error we'll only
report the first element, which is OK, not the second "argument\""
whose quote is unbalanced.

This is an inherent limitation of the current API, and the issue
affects other API users. Let's not attempt to fix that now. If and
when that happens these tests will need to be adjusted to assert the
new output.

1. 2b11e3170e9 (If you have a config containing something like this:,
   2006-06-05)
2. ca6c6b45dd9 (sequencer (rebase -i): respect strategy/strategy_opts
   settings, 2017-01-02)

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sequencer.c
t/t3436-rebase-more-options.sh