summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/remote.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/remote.c b/src/remote.c
index c84911aa1..d516d07fb 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -985,10 +985,25 @@ void git_remote_check_cert(git_remote *remote, int check)
remote->check_cert = check;
}
-void git_remote_set_callbacks(git_remote *remote, git_remote_callbacks *callbacks)
+static bool callbacks_have_valid_version(git_remote_callbacks *callbacks)
+{
+ if (!callbacks)
+ return true;
+
+ if (callbacks->version > 0 && callbacks->version <= GIT_REMOTE_CALLBACKS_VERSION)
+ return true;
+
+ giterr_set(GITERR_INVALID, "Invalid version %d for git_remote_callbacks", callbacks->version);
+ return false;
+}
+
+int git_remote_set_callbacks(git_remote *remote, git_remote_callbacks *callbacks)
{
assert(remote && callbacks);
+ if (!callbacks_have_valid_version(callbacks))
+ return -1;
+
memcpy(&remote->callbacks, callbacks, sizeof(git_remote_callbacks));
if (remote->transport && remote->transport->set_callbacks)
@@ -996,6 +1011,8 @@ void git_remote_set_callbacks(git_remote *remote, git_remote_callbacks *callback
remote->callbacks.progress,
NULL,
remote->callbacks.payload);
+
+ return 0;
}
void git_remote_set_cred_acquire_cb(