Re: [PATCH 1/3] rebase: guard against missing files in read_basic_state()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Martin von Zweigbergk <martinvonz@xxxxxxxxx> writes:

> On Thu, Jun 13, 2013 at 3:29 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote:
>> Ramkumar Ramachandra <artagnon@xxxxxxxxx> writes:
>>
>> A more troublesome is that nobody seems to check the return value of
>> this function.  If head-name, onto or orig-head is missing, is that
>> an error condition that should make the callers of read_basic_state
>> stop and refuse to proceed?
>
> Since we unconditionally write those three (and 'quiet'), it seems
> reasonable to require all of them to be there when continuing, so I
> think you're right that we should fail fast.
>
>> The way the && cascade is used seems to indicate that, but up to the
>> point where it sents $verbose. If and only if head-name, onto, orig-head
>> and quiet can be read in state-dir, verbose in state-dir is checked
>> and only then $verbose is set.
>>
>> Martin, this seems to be from your series around early Feburary
>> 2011.  Do you recall why these checks are cascaded this way?
>> I do not offhand think of a good reason.
>
> Neither do I. I think the cascading after 'quiet' is just a mistake on
> my part. The consequences are probably close to none, since if one of
> earlier commands fail, the other files will probably not be there
> either. (Not defending it; I'm happy if it gets fixed, e.g. by making
> it fail fast.)

I think this is probably the right thing to do, if we want to honor
the original intention of the earlier part of && cascade.  Everything
before this new "|| die" reads from a file that should always exist
(e.g. even when not asked to be quiet, that state is not signaled by
the lack of $state_dir/quiet, but by having an empty string in it),
while everything after check optional state variable files (e.g. if
$state_dir/verbose does not exist, it is not an error, but signals
that the user did not ask us to be verbose).

Note that applying this patch _could_ uncover latent bug that was
masked by the lack of "die" here (maybe later codepath may depended
on not having orig_head at all and the only observable effect was
that in such a case, both quiet and verbose were silently ignored,
because the control did not reach the GIT_QUIET=... and verbose=t
assignments.

 git-rebase.sh | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/git-rebase.sh b/git-rebase.sh
index d0c11a9..90506ba 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -95,7 +95,9 @@ read_basic_state () {
 	else
 		orig_head=$(cat "$state_dir"/head)
 	fi &&
-	GIT_QUIET=$(cat "$state_dir"/quiet) &&
+	GIT_QUIET=$(cat "$state_dir"/quiet) ||
+	die "failed to read basic rebase state from $state_dir"
+
 	test -f "$state_dir"/verbose && verbose=t
 	test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
 	test -f "$state_dir"/strategy_opts &&


--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]