Re: [PATCH v4 2/5] commit.c/GPG signature verification: Also look at the first GPG status line
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Mar 28, 2013, 22:33 UTC
- Message-ID
- <7v620brw82.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <51518106.6060804@physik.tu-berlin.de>
Sebastian Götte <jaseg@physik.tu-berlin.de> writes:
Show 27 quoted lines
> Signed-off-by: Sebastian Götte <jaseg@physik-pool.tu-berlin.de>
> ---
> commit.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/commit.c b/commit.c
> index 1aeb17a..533727c 100644
> --- a/commit.c
> +++ b/commit.c
> @@ -1027,8 +1027,8 @@ static struct {
> char result;
> const char *check;
> } signature_check[] = {
> - { 'G', "\n[GNUPG:] GOODSIG " },
> - { 'B', "\n[GNUPG:] BADSIG " },
> + { 'G', "[GNUPG:] GOODSIG " },
> + { 'B', "[GNUPG:] BADSIG " },
> };
>
> static void parse_signature_lines(struct signature *sig)
> @@ -1041,6 +1041,9 @@ static void parse_signature_lines(struct signature *sig)
> const char *next;
> if (!found)
> continue;
> + if (found != buf)
> + if (found[-1] != '\n')
> + continue;It would be much easier to read if it were "unless we are not looking at the very first byte, the previous byte must be LF", i.e.
if (found != buf && found[-1] != '\n')
Is that continue correct? Don't you want to retry from the end of the line that contains the mistaken hit?
The "\n" at the beginning anchors the expected string for quicker multi-line scan done with strstr(). If you really want to lose that LF and still write this function correctly and clearly, I think you would need to iterate over the buffer line by line.
What you want to do may be more like this, I think.
commit.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/commit.c b/commit.c index d093c9c..d6e0b00 100644 --- a/commit.c +++ b/commit.c @@ -1045,8 +1045,8 @@ static struct { char result; const char *check; } signature_check[] = { - { 'G', "[GNUPG:] GOODSIG " }, - { 'B', "[GNUPG:] BADSIG " }, + { 'G', "\n[GNUPG:] GOODSIG " }, + { 'B', "\n[GNUPG:] BADSIG " }, }; static void parse_signature_lines(struct signature *sig) @@ -1055,15 +1055,18 @@ static void parse_signature_lines(struct signature *sig) int i; for (i = 0; i < ARRAY_SIZE(signature_check); i++) { - const char *found = strstr(buf, signature_check[i].check); - const char *next; - if (!found) - continue; - if (found != buf) - if (found[-1] != '\n') + const char *found, *next; + + if (!prefixcmp(buf, signature_check[i].check + 1)) { + /* At the very beginning of the buffer */ + found = buf + strlen(signature_check[i].check + 1); + } else { + found = strstr(buf, signature_check[i].check); + if (!found) continue; + found += strlen(signature_check[i].check); + } sig->check_result = signature_check[i].result; - found += strlen(signature_check[i].check); sig->key = xmemdupz(found, 16); found += 17; next = strchrnul(found, '\n');