From 76448e806720d99a57f492fbaeff44bf3250b914 Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Tue, 12 Jun 2018 18:45:32 +0200 Subject: git-receiver: git shell should reinstall hooks if symlinks are broken --- src/blogc-git-receiver/shell.c | 15 +++++++++++++-- tests/blogc-git-receiver/check_shell.sh.in | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/blogc-git-receiver/shell.c b/src/blogc-git-receiver/shell.c index 8c45b54..d288654 100644 --- a/src/blogc-git-receiver/shell.c +++ b/src/blogc-git-receiver/shell.c @@ -19,6 +19,17 @@ #include "shell.h" +static bool +lexists(const char *pathname) +{ + struct stat b; + int tmp_errno = errno; + bool rv = lstat(pathname, &b) == 0; + errno = tmp_errno; + return rv; +} + + int bgr_shell(int argc, char *argv[]) { @@ -96,7 +107,7 @@ bgr_shell(int argc, char *argv[]) goto cleanup; } - if (0 == access("pre-receive", F_OK)) { + if (lexists("pre-receive")) { if (0 != unlink("pre-receive")) { fprintf(stderr, "error: failed to remove old symlink " "(%s/hooks/pre-receive): %s\n", repo, strerror(errno)); @@ -112,7 +123,7 @@ bgr_shell(int argc, char *argv[]) goto cleanup; } - if (0 == access("post-receive", F_OK)) { + if (lexists("post-receive")) { if (0 != unlink("post-receive")) { fprintf(stderr, "error: failed to remove old symlink " "(%s/hooks/post-receive): %s\n", repo, strerror(errno)); diff --git a/tests/blogc-git-receiver/check_shell.sh.in b/tests/blogc-git-receiver/check_shell.sh.in index 8743293..f70fc50 100755 --- a/tests/blogc-git-receiver/check_shell.sh.in +++ b/tests/blogc-git-receiver/check_shell.sh.in @@ -36,6 +36,21 @@ fi [[ -h "${TEMP}/repos/lol.git/hooks/post-receive" ]] [[ "$(readlink "${TEMP}/repos/lol.git/hooks/post-receive")" == "${SELF}" ]] +rm "${TEMP}/repos/lol.git/hooks/pre-receive" +ln -s /lolheheasdxd "${TEMP}/repos/lol.git/hooks/pre-receive" + +echo 0000 | call_bgr -c "git-receive-pack 'lol.git'" 2>&1 > "${TEMP}/output.txt" +if [[ -n "${VALGRIND}" ]]; then + grep "git-shell -c \"git-receive-pack '.*repos/lol.git'\"" "${TEMP}/output.txt" &> /dev/null +else + grep "agent=" "${TEMP}/output.txt" &> /dev/null +fi +[[ -d "${TEMP}/repos/lol.git" ]] +[[ -h "${TEMP}/repos/lol.git/hooks/pre-receive" ]] +[[ "$(readlink "${TEMP}/repos/lol.git/hooks/pre-receive")" == "${SELF}" ]] +[[ -h "${TEMP}/repos/lol.git/hooks/post-receive" ]] +[[ "$(readlink "${TEMP}/repos/lol.git/hooks/post-receive")" == "${SELF}" ]] + cat > "${TEMP}/tmp.txt" <