Merge pull request #1247 from sba1/dont-segfault-if-transport-doesnt-support-push Don't segfault if transport doesn't support push.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
diff --git a/src/push.c b/src/push.c
index 7122364..452ead4 100644
--- a/src/push.c
+++ b/src/push.c
@@ -369,6 +369,12 @@ static int do_push(git_push *push)
int error;
git_transport *transport = push->remote->transport;
+ if (!transport->push) {
+ giterr_set(GITERR_NET, "Remote transport doesn't support push");
+ error = -1;
+ goto on_error;
+ }
+
/*
* A pack-file MUST be sent if either create or update command
* is used, even if the server already has all the necessary
diff --git a/tests-clar/network/remotes.c b/tests-clar/network/remotes.c
index e947ffe..9be18ba 100644
--- a/tests-clar/network/remotes.c
+++ b/tests-clar/network/remotes.c
@@ -60,6 +60,27 @@ void test_network_remotes__pushurl(void)
cl_assert(git_remote_pushurl(_remote) == NULL);
}
+void test_network_remotes__error_when_no_push_available(void)
+{
+ git_remote *r;
+ git_transport *t;
+ git_push *p;
+
+ cl_git_pass(git_remote_create_inmemory(&r, _repo, NULL, cl_fixture("testrepo.git")));
+
+ cl_git_pass(git_transport_local(&t,r,NULL));
+
+ /* Make sure that push is really not available */
+ t->push = NULL;
+ cl_git_pass(git_remote_connect(r, GIT_DIRECTION_PUSH));
+ cl_git_pass(git_push_new(&p, r));
+ cl_git_pass(git_push_add_refspec(p, "refs/heads/master"));
+ cl_git_fail_with(git_push_finish(p), GIT_ERROR);
+
+ git_push_free(p);
+ git_remote_free(r);
+}
+
void test_network_remotes__parsing_ssh_remote(void)
{
cl_assert( git_remote_valid_url("git@github.com:libgit2/libgit2.git") );