Skip to content

Commit

Permalink
git-tag -s must fail if gpg cannot sign the tag.
Browse files Browse the repository at this point in the history
Most of this patch code and message was written by Shawn O. Pearce.
I made some tests to know what the problem was, and then I changed
the code related with the SIGPIPE signal.

If the user has misconfigured `user.signingkey` in their .git/config
or just doesn't have any secret keys on their keyring and they ask
for a signed tag with `git tag -s` we better make sure the resulting
tag was actually signed by gpg.

Prior versions of builtin git-tag allowed this failure to slip
by without error as they were not checking the return value of
the finish_command() so they did not notice when gpg exited with
an error exit status.  They also did not fail if gpg produced an
empty output or if read_in_full received an error from the read
system call while trying to read the pipe back from gpg.

Finally, we did not actually honor any return value from the do_sign
function as it returns ssize_t but was being stored into an unsigned
long.  This caused the compiler to optimize out the die condition,
allowing git-tag to continue along and create the tag object.

However, when gpg gets a wrong username, it exits before any read was done
and then the writing process receives SIGPIPE and program is terminated.
By ignoring this signal, anyway, the function write_or_die gets EPIPE from
write_in_full and exits returning 0 to the system without a message.
Here we better call to write_in_full directly so we can fail
printing a message and return safely to the caller.

With these issues fixed `git-tag -s` will now fail to create the
tag and will report a non-zero exit status to its caller, thereby
allowing automated helper scripts to detect (and recover from)
failure if gpg is not working properly.

Proposed-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Carlos Rica <jasampler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Carlos Rica authored and Junio C Hamano committed Sep 10, 2007
1 parent 7b02b85 commit aba9119
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 4 deletions.
18 changes: 14 additions & 4 deletions builtin-tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,10 @@ static ssize_t do_sign(char *buffer, size_t size, size_t max)
bracket[1] = '\0';
}

/* When the username signingkey is bad, program could be terminated
* because gpg exits without reading and then write gets SIGPIPE. */
signal(SIGPIPE, SIG_IGN);

memset(&gpg, 0, sizeof(gpg));
gpg.argv = args;
gpg.in = -1;
Expand All @@ -212,12 +216,17 @@ static ssize_t do_sign(char *buffer, size_t size, size_t max)
if (start_command(&gpg))
return error("could not run gpg.");

write_or_die(gpg.in, buffer, size);
if (write_in_full(gpg.in, buffer, size) != size) {
close(gpg.in);
finish_command(&gpg);
return error("gpg did not accept the tag data");
}
close(gpg.in);
gpg.close_in = 0;
len = read_in_full(gpg.out, buffer + size, max - size);

finish_command(&gpg);
if (finish_command(&gpg) || !len || len < 0)
return error("gpg failed to sign the tag");

if (len == max - size)
return error("could not read the entire signature from gpg.");
Expand Down Expand Up @@ -310,9 +319,10 @@ static void create_tag(const unsigned char *object, const char *tag,
size += header_len;

if (sign) {
size = do_sign(buffer, size, max_size);
if (size < 0)
ssize_t r = do_sign(buffer, size, max_size);
if (r < 0)
die("unable to sign the tag");
size = r;
}

if (write_sha1_file(buffer, size, tag_type, result) < 0)
Expand Down
7 changes: 7 additions & 0 deletions t/t7004-tag.sh
Original file line number Diff line number Diff line change
Expand Up @@ -990,6 +990,13 @@ test_expect_success \
git diff expect actual
'

# try to sign with bad user.signingkey
git config user.signingkey BobTheMouse
test_expect_failure \
'git-tag -s fails if gpg is misconfigured' \
'git tag -s -m tail tag-gpg-failure'
git config --unset user.signingkey

# try to verify without gpg:

rm -rf gpghome
Expand Down

0 comments on commit aba9119

Please sign in to comment.