diff options
author | Ben Straub <bs@github.com> | 2013-01-17 13:37:32 -0800 |
---|---|---|
committer | Ben Straub <bs@github.com> | 2013-01-17 13:37:32 -0800 |
commit | c49fa037cc3fb5d12737bd8d8e74bafffd5a8a58 (patch) | |
tree | 1c8be3303f69923d69021a85262f7571bd7eed15 | |
parent | 5c8901ab80a3db654a2e8b1d123b727182b70ab0 (diff) | |
parent | b90eb84ff9fc092d48954247c4b1019f09ca72c7 (diff) | |
download | libgit2-c49fa037cc3fb5d12737bd8d8e74bafffd5a8a58.tar.gz |
Merge pull request #1247 from sba1/dont-segfault-if-transport-doesnt-support-push
Don't segfault if transport doesn't support push.
-rw-r--r-- | src/push.c | 6 | ||||
-rw-r--r-- | tests-clar/network/remotes.c | 21 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/push.c b/src/push.c index 71223645a..452ead405 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 e947ffe93..9be18baea 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") ); |