Skip to content

Commit a0d51e8

Browse files
Erik E Bradygitster
authored andcommitted
credential: ignore SIGPIPE when writing to credential helpers
The credential subsystem can trigger SIGPIPE when writing to an external helper if that helper closes its stdin before reading the whole input. Normally this is rare, since helpers would need to read that input to make a decision about how to respond, but: 1. It's reasonable to configure a helper which only handles "get" while ignoring "store". Such a handler might not read stdin for "store", thereby rapidly closing stdin upon helper exit. 2. A broken or misbehaving helper might exit immediately. That's an error, but it's not reasonable for it to take down the parent Git process with SIGPIPE. Even with such a helper, seeing this problem should be rare. Getting SIGPIPE requires the helper racily exiting before we've written the fairly small credential output. Signed-off-by: Erik E Brady <[email protected]> Reviewed-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent d32eb83 commit a0d51e8

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

credential.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "run-command.h"
66
#include "url.h"
77
#include "prompt.h"
8+
#include "sigchain.h"
89

910
void credential_init(struct credential *c)
1011
{
@@ -227,8 +228,10 @@ static int run_credential_helper(struct credential *c,
227228
return -1;
228229

229230
fp = xfdopen(helper.in, "w");
231+
sigchain_push(SIGPIPE, SIG_IGN);
230232
credential_write(c, fp);
231233
fclose(fp);
234+
sigchain_pop(SIGPIPE);
232235

233236
if (want_output) {
234237
int r;

0 commit comments

Comments
 (0)