All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Shawn O. Pearce" <spearce@spearce.org>
To: Junio C Hamano <junkio@cox.net>
Cc: git@vger.kernel.org
Subject: [PATCH 3/3] Use /dev/null for update hook stdin.
Date: Sat, 30 Dec 2006 21:55:22 -0500	[thread overview]
Message-ID: <20061231025522.GC5530@spearce.org> (raw)
In-Reply-To: <a0aecffe21074288c911c396f92901bfb558d591.1167533707.git.spearce@spearce.org>

Currently the update hook invoked by receive-pack has its stdin
connected to the pushing client.  The hook shouldn't attempt to
read from this stream, and doing so may consume data that was
meant for receive-pack.  Instead we should give the update hook
/dev/null as its stdin, ensuring that it always receives EOF and
doesn't disrupt the protocol if it attempts to read any data.

The post-update hook is similar, as it gets invoked with /dev/null
on stdin to prevent the hook from reading data from the client.
Previously we had invoked it with stdout also connected to /dev/null,
throwing away anything on stdout, to prevent client protocol errors.
Instead we should redirect stdout to stderr, like we do with the
update hook.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 receive-pack.c |    6 ++++--
 run-command.c  |    6 +++---
 run-command.h  |    2 +-
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/receive-pack.c b/receive-pack.c
index 64289e9..cf83109 100644
--- a/receive-pack.c
+++ b/receive-pack.c
@@ -73,7 +73,8 @@ static int run_update_hook(const char *refname,
 
 	if (access(update_hook, X_OK) < 0)
 		return 0;
-	code = run_command_opt(RUN_COMMAND_STDOUT_TO_STDERR,
+	code = run_command_opt(RUN_COMMAND_NO_STDIN
+		| RUN_COMMAND_STDOUT_TO_STDERR,
 		update_hook, refname, old_hex, new_hex, NULL);
 	switch (code) {
 	case 0:
@@ -188,7 +189,8 @@ static void run_update_post_hook(struct command *cmd)
 		argc++;
 	}
 	argv[argc] = NULL;
-	run_command_v_opt(argv, RUN_COMMAND_NO_STDIO);
+	run_command_v_opt(argv, RUN_COMMAND_NO_STDIN
+		| RUN_COMMAND_STDOUT_TO_STDERR);
 }
 
 /*
diff --git a/run-command.c b/run-command.c
index 7e4ca43..cfbad74 100644
--- a/run-command.c
+++ b/run-command.c
@@ -9,12 +9,12 @@ int run_command_v_opt(const char **argv, int flags)
 	if (pid < 0)
 		return -ERR_RUN_COMMAND_FORK;
 	if (!pid) {
-		if (flags & RUN_COMMAND_NO_STDIO) {
+		if (flags & RUN_COMMAND_NO_STDIN) {
 			int fd = open("/dev/null", O_RDWR);
 			dup2(fd, 0);
-			dup2(fd, 1);
 			close(fd);
-		} else if (flags & RUN_COMMAND_STDOUT_TO_STDERR)
+		}
+		if (flags & RUN_COMMAND_STDOUT_TO_STDERR)
 			dup2(2, 1);
 		if (flags & RUN_GIT_CMD) {
 			execv_git_cmd(argv);
diff --git a/run-command.h b/run-command.h
index 8156eac..59c4476 100644
--- a/run-command.h
+++ b/run-command.h
@@ -11,7 +11,7 @@ enum {
 	ERR_RUN_COMMAND_WAITPID_NOEXIT,
 };
 
-#define RUN_COMMAND_NO_STDIO 1
+#define RUN_COMMAND_NO_STDIN 1
 #define RUN_GIT_CMD	     2	/*If this is to be git sub-command */
 #define RUN_COMMAND_STDOUT_TO_STDERR 4
 int run_command_v_opt(const char **argv, int opt);
-- 
1.5.0.rc0.g6bb1

  parent reply	other threads:[~2006-12-31  2:55 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <a0aecffe21074288c911c396f92901bfb558d591.1167533707.git.spearce@spearce.org>
2006-12-31  2:55 ` [PATCH 2/3] Redirect update hook stdout to stderr Shawn O. Pearce
2006-12-31  2:55 ` Shawn O. Pearce [this message]
2006-12-31  6:03   ` [PATCH 3/3] Use /dev/null for update hook stdin Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20061231025522.GC5530@spearce.org \
    --to=spearce@spearce.org \
    --cc=git@vger.kernel.org \
    --cc=junkio@cox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.