rugged 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -0
- data/README.md +1 -1
- data/ext/rugged/rugged.c +7 -4
- data/ext/rugged/rugged_object.c +1 -1
- data/ext/rugged/rugged_repo.c +3 -3
- data/lib/rugged/repository.rb +2 -2
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +11 -6
- data/vendor/libgit2/COPYING +109 -1
- data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +4 -0
- data/vendor/libgit2/cmake/SelectHashes.cmake +1 -0
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +17 -5
- data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +150 -118
- data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
- data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
- data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
- data/vendor/libgit2/include/git2/attr.h +89 -0
- data/vendor/libgit2/include/git2/blame.h +93 -42
- data/vendor/libgit2/include/git2/blob.h +14 -2
- data/vendor/libgit2/include/git2/branch.h +25 -0
- data/vendor/libgit2/include/git2/cert.h +42 -5
- data/vendor/libgit2/include/git2/checkout.h +28 -12
- data/vendor/libgit2/include/git2/commit.h +35 -19
- data/vendor/libgit2/include/git2/common.h +14 -4
- data/vendor/libgit2/include/git2/deprecated.h +206 -6
- data/vendor/libgit2/include/git2/diff.h +34 -19
- data/vendor/libgit2/include/git2/errors.h +6 -6
- data/vendor/libgit2/include/git2/filter.h +57 -17
- data/vendor/libgit2/include/git2/graph.h +20 -2
- data/vendor/libgit2/include/git2/index.h +2 -2
- data/vendor/libgit2/include/git2/odb.h +29 -0
- data/vendor/libgit2/include/git2/patch.h +8 -0
- data/vendor/libgit2/include/git2/rebase.h +25 -1
- data/vendor/libgit2/include/git2/refs.h +6 -2
- data/vendor/libgit2/include/git2/remote.h +59 -6
- data/vendor/libgit2/include/git2/revparse.h +5 -5
- data/vendor/libgit2/include/git2/status.h +115 -59
- data/vendor/libgit2/include/git2/submodule.h +9 -0
- data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
- data/vendor/libgit2/include/git2/sys/filter.h +49 -28
- data/vendor/libgit2/include/git2/sys/midx.h +74 -0
- data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
- data/vendor/libgit2/include/git2/sys/transport.h +1 -0
- data/vendor/libgit2/include/git2/tag.h +12 -0
- data/vendor/libgit2/include/git2/tree.h +0 -14
- data/vendor/libgit2/include/git2/types.h +9 -0
- data/vendor/libgit2/include/git2/version.h +4 -4
- data/vendor/libgit2/include/git2/worktree.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +25 -4
- data/vendor/libgit2/src/alloc.c +21 -8
- data/vendor/libgit2/src/allocators/failalloc.c +92 -0
- data/vendor/libgit2/src/allocators/failalloc.h +23 -0
- data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
- data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
- data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
- data/vendor/libgit2/src/annotated_commit.c +21 -9
- data/vendor/libgit2/src/apply.c +16 -7
- data/vendor/libgit2/src/array.h +11 -11
- data/vendor/libgit2/src/attr.c +181 -74
- data/vendor/libgit2/src/attr_file.c +84 -39
- data/vendor/libgit2/src/attr_file.h +32 -11
- data/vendor/libgit2/src/attrcache.c +42 -37
- data/vendor/libgit2/src/attrcache.h +4 -5
- data/vendor/libgit2/src/blame.c +11 -5
- data/vendor/libgit2/src/blob.c +35 -24
- data/vendor/libgit2/src/branch.c +69 -17
- data/vendor/libgit2/src/buffer.c +334 -25
- data/vendor/libgit2/src/buffer.h +153 -2
- data/vendor/libgit2/src/cache.c +2 -2
- data/vendor/libgit2/src/cache.h +7 -7
- data/vendor/libgit2/src/cc-compat.h +10 -2
- data/vendor/libgit2/src/checkout.c +48 -26
- data/vendor/libgit2/src/cherrypick.c +6 -2
- data/vendor/libgit2/src/clone.c +41 -47
- data/vendor/libgit2/src/commit.c +41 -28
- data/vendor/libgit2/src/commit_graph.c +1209 -0
- data/vendor/libgit2/src/commit_graph.h +162 -0
- data/vendor/libgit2/src/commit_list.c +46 -0
- data/vendor/libgit2/src/commit_list.h +2 -0
- data/vendor/libgit2/src/common.h +25 -2
- data/vendor/libgit2/src/config.c +37 -15
- data/vendor/libgit2/src/config_cache.c +5 -3
- data/vendor/libgit2/src/config_file.c +16 -8
- data/vendor/libgit2/src/config_parse.c +4 -6
- data/vendor/libgit2/src/crlf.c +16 -6
- data/vendor/libgit2/src/date.c +4 -3
- data/vendor/libgit2/src/delta.c +1 -1
- data/vendor/libgit2/src/describe.c +6 -3
- data/vendor/libgit2/src/diff.c +11 -8
- data/vendor/libgit2/src/diff_driver.c +21 -17
- data/vendor/libgit2/src/diff_file.c +2 -6
- data/vendor/libgit2/src/diff_generate.c +46 -17
- data/vendor/libgit2/src/diff_print.c +19 -6
- data/vendor/libgit2/src/diff_stats.c +7 -5
- data/vendor/libgit2/src/diff_tform.c +9 -8
- data/vendor/libgit2/src/diff_xdiff.c +4 -2
- data/vendor/libgit2/src/diff_xdiff.h +1 -1
- data/vendor/libgit2/src/errors.c +24 -19
- data/vendor/libgit2/src/features.h.in +5 -1
- data/vendor/libgit2/src/fetch.c +5 -2
- data/vendor/libgit2/src/fetchhead.c +8 -4
- data/vendor/libgit2/src/filebuf.c +9 -7
- data/vendor/libgit2/src/filter.c +206 -110
- data/vendor/libgit2/src/filter.h +24 -5
- data/vendor/libgit2/src/futils.c +5 -5
- data/vendor/libgit2/src/futils.h +1 -1
- data/vendor/libgit2/src/graph.c +64 -9
- data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
- data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
- data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
- data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
- data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
- data/vendor/libgit2/src/hash.c +16 -13
- data/vendor/libgit2/src/hash.h +1 -1
- data/vendor/libgit2/src/hashsig.c +23 -10
- data/vendor/libgit2/src/ident.c +13 -3
- data/vendor/libgit2/src/ignore.c +35 -19
- data/vendor/libgit2/src/index.c +106 -70
- data/vendor/libgit2/src/index.h +1 -1
- data/vendor/libgit2/src/indexer.c +31 -29
- data/vendor/libgit2/src/integer.h +64 -2
- data/vendor/libgit2/src/iterator.c +36 -24
- data/vendor/libgit2/src/iterator.h +1 -1
- data/vendor/libgit2/src/khash.h +2 -11
- data/vendor/libgit2/src/{settings.c → libgit2.c} +117 -50
- data/vendor/libgit2/src/libgit2.h +15 -0
- data/vendor/libgit2/src/mailmap.c +23 -10
- data/vendor/libgit2/src/map.h +3 -3
- data/vendor/libgit2/src/merge.c +70 -30
- data/vendor/libgit2/src/merge.h +2 -1
- data/vendor/libgit2/src/merge_driver.c +19 -13
- data/vendor/libgit2/src/merge_file.c +11 -3
- data/vendor/libgit2/src/message.c +3 -1
- data/vendor/libgit2/src/midx.c +471 -10
- data/vendor/libgit2/src/midx.h +28 -1
- data/vendor/libgit2/src/mwindow.c +103 -59
- data/vendor/libgit2/src/mwindow.h +3 -3
- data/vendor/libgit2/src/net.c +127 -3
- data/vendor/libgit2/src/net.h +16 -2
- data/vendor/libgit2/src/netops.c +6 -4
- data/vendor/libgit2/src/netops.h +2 -2
- data/vendor/libgit2/src/notes.c +10 -10
- data/vendor/libgit2/src/object.c +22 -14
- data/vendor/libgit2/src/odb.c +285 -48
- data/vendor/libgit2/src/odb.h +16 -2
- data/vendor/libgit2/src/odb_loose.c +28 -18
- data/vendor/libgit2/src/odb_mempack.c +1 -1
- data/vendor/libgit2/src/odb_pack.c +391 -114
- data/vendor/libgit2/src/oid.c +5 -4
- data/vendor/libgit2/src/pack-objects.c +54 -48
- data/vendor/libgit2/src/pack.c +329 -119
- data/vendor/libgit2/src/pack.h +25 -7
- data/vendor/libgit2/src/patch.c +14 -7
- data/vendor/libgit2/src/patch_generate.c +2 -2
- data/vendor/libgit2/src/patch_parse.c +2 -1
- data/vendor/libgit2/src/path.c +98 -53
- data/vendor/libgit2/src/path.h +79 -6
- data/vendor/libgit2/src/pathspec.c +8 -8
- data/vendor/libgit2/src/pool.c +13 -7
- data/vendor/libgit2/src/posix.c +11 -3
- data/vendor/libgit2/src/reader.c +10 -6
- data/vendor/libgit2/src/rebase.c +93 -49
- data/vendor/libgit2/src/refdb.c +30 -13
- data/vendor/libgit2/src/refdb_fs.c +121 -69
- data/vendor/libgit2/src/reflog.c +19 -14
- data/vendor/libgit2/src/refs.c +76 -41
- data/vendor/libgit2/src/refspec.c +32 -12
- data/vendor/libgit2/src/remote.c +272 -102
- data/vendor/libgit2/src/remote.h +2 -1
- data/vendor/libgit2/src/repository.c +176 -103
- data/vendor/libgit2/src/repository.h +12 -1
- data/vendor/libgit2/src/reset.c +7 -6
- data/vendor/libgit2/src/revert.c +6 -2
- data/vendor/libgit2/src/revparse.c +14 -9
- data/vendor/libgit2/src/revwalk.c +32 -15
- data/vendor/libgit2/src/runtime.c +162 -0
- data/vendor/libgit2/src/runtime.h +62 -0
- data/vendor/libgit2/src/settings.h +11 -0
- data/vendor/libgit2/src/signature.c +6 -5
- data/vendor/libgit2/src/sortedcache.h +10 -8
- data/vendor/libgit2/src/stash.c +3 -1
- data/vendor/libgit2/src/status.c +7 -4
- data/vendor/libgit2/src/strarray.c +2 -1
- data/vendor/libgit2/src/streams/mbedtls.c +14 -17
- data/vendor/libgit2/src/streams/mbedtls.h +1 -1
- data/vendor/libgit2/src/streams/openssl.c +101 -201
- data/vendor/libgit2/src/streams/openssl.h +9 -1
- data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
- data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
- data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
- data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
- data/vendor/libgit2/src/streams/registry.c +5 -6
- data/vendor/libgit2/src/streams/socket.c +6 -2
- data/vendor/libgit2/src/streams/stransport.c +6 -3
- data/vendor/libgit2/src/streams/tls.c +5 -3
- data/vendor/libgit2/src/submodule.c +128 -62
- data/vendor/libgit2/src/submodule.h +9 -9
- data/vendor/libgit2/src/sysdir.c +4 -6
- data/vendor/libgit2/src/tag.c +47 -11
- data/vendor/libgit2/src/thread.c +140 -0
- data/vendor/libgit2/src/thread.h +479 -0
- data/vendor/libgit2/src/threadstate.c +83 -0
- data/vendor/libgit2/src/threadstate.h +24 -0
- data/vendor/libgit2/src/trace.c +2 -2
- data/vendor/libgit2/src/trace.h +17 -13
- data/vendor/libgit2/src/transaction.c +19 -8
- data/vendor/libgit2/src/transport.c +3 -3
- data/vendor/libgit2/src/transports/auth.c +1 -1
- data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
- data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
- data/vendor/libgit2/src/transports/credential.c +15 -7
- data/vendor/libgit2/src/transports/git.c +1 -3
- data/vendor/libgit2/src/transports/http.c +19 -17
- data/vendor/libgit2/src/transports/http.h +1 -0
- data/vendor/libgit2/src/transports/httpclient.c +53 -26
- data/vendor/libgit2/src/transports/httpclient.h +1 -1
- data/vendor/libgit2/src/transports/local.c +3 -3
- data/vendor/libgit2/src/transports/smart.c +12 -7
- data/vendor/libgit2/src/transports/smart.h +1 -1
- data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
- data/vendor/libgit2/src/transports/ssh.c +51 -17
- data/vendor/libgit2/src/transports/winhttp.c +41 -31
- data/vendor/libgit2/src/tree.c +100 -77
- data/vendor/libgit2/src/tree.h +1 -0
- data/vendor/libgit2/src/tsort.c +0 -2
- data/vendor/libgit2/src/unix/map.c +3 -1
- data/vendor/libgit2/src/unix/pthread.h +2 -1
- data/vendor/libgit2/src/utf8.c +150 -0
- data/vendor/libgit2/src/utf8.h +52 -0
- data/vendor/libgit2/src/util.c +53 -129
- data/vendor/libgit2/src/util.h +33 -39
- data/vendor/libgit2/src/vector.c +23 -19
- data/vendor/libgit2/src/vector.h +4 -2
- data/vendor/libgit2/src/win32/findfile.c +4 -2
- data/vendor/libgit2/src/win32/map.c +1 -1
- data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
- data/vendor/libgit2/src/win32/path_w32.c +22 -24
- data/vendor/libgit2/src/win32/path_w32.h +0 -1
- data/vendor/libgit2/src/win32/posix_w32.c +7 -1
- data/vendor/libgit2/src/win32/precompiled.h +0 -1
- data/vendor/libgit2/src/win32/reparse.h +4 -4
- data/vendor/libgit2/src/win32/thread.c +24 -15
- data/vendor/libgit2/src/win32/thread.h +1 -1
- data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
- data/vendor/libgit2/src/win32/w32_common.h +18 -9
- data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
- data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
- data/vendor/libgit2/src/win32/w32_util.h +6 -6
- data/vendor/libgit2/src/worktree.c +27 -16
- data/vendor/libgit2/src/zstream.c +1 -1
- metadata +32 -16
- data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
- data/vendor/libgit2/src/buf_text.c +0 -316
- data/vendor/libgit2/src/buf_text.h +0 -122
- data/vendor/libgit2/src/global.c +0 -363
- data/vendor/libgit2/src/global.h +0 -41
- data/vendor/libgit2/src/thread-utils.c +0 -58
- data/vendor/libgit2/src/thread-utils.h +0 -369
- data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
- data/vendor/libgit2/src/win32/w32_stack.c +0 -188
- data/vendor/libgit2/src/win32/w32_stack.h +0 -140
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
|
6
|
+
*/
|
|
7
|
+
#ifndef INCLUDE_runtime_h__
|
|
8
|
+
#define INCLUDE_runtime_h__
|
|
9
|
+
|
|
10
|
+
#include "common.h"
|
|
11
|
+
|
|
12
|
+
typedef int (*git_runtime_init_fn)(void);
|
|
13
|
+
typedef void (*git_runtime_shutdown_fn)(void);
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Start up a new runtime. If this is the first time that this
|
|
17
|
+
* function is called within the context of the current library
|
|
18
|
+
* or executable, then the given `init_fns` will be invoked. If
|
|
19
|
+
* it is not the first time, they will be ignored.
|
|
20
|
+
*
|
|
21
|
+
* The given initialization functions _may_ register shutdown
|
|
22
|
+
* handlers using `git_runtime_shutdown_register` to be notified
|
|
23
|
+
* when the runtime is shutdown.
|
|
24
|
+
*
|
|
25
|
+
* @param init_fns The list of initialization functions to call
|
|
26
|
+
* @param cnt The number of init_fns
|
|
27
|
+
* @return The number of initializations performed (including this one) or an error
|
|
28
|
+
*/
|
|
29
|
+
int git_runtime_init(git_runtime_init_fn init_fns[], size_t cnt);
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
* Returns the number of initializations active (the number of calls to
|
|
33
|
+
* `git_runtime_init` minus the number of calls sto `git_runtime_shutdown`).
|
|
34
|
+
* If 0, the runtime is not currently initialized.
|
|
35
|
+
*
|
|
36
|
+
* @return The number of initializations performed or an error
|
|
37
|
+
*/
|
|
38
|
+
int git_runtime_init_count(void);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Shut down the runtime. If this is the last shutdown call,
|
|
42
|
+
* such that there are no remaining `init` calls, then any
|
|
43
|
+
* shutdown hooks that have been registered will be invoked.
|
|
44
|
+
*
|
|
45
|
+
* The number of outstanding initializations will be returned.
|
|
46
|
+
* If this number is 0, then the runtime is shutdown.
|
|
47
|
+
*
|
|
48
|
+
* @return The number of outstanding initializations (after this one) or an error
|
|
49
|
+
*/
|
|
50
|
+
int git_runtime_shutdown(void);
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Register a shutdown handler for this runtime. This should be done
|
|
54
|
+
* by a function invoked by `git_runtime_init` to ensure that the
|
|
55
|
+
* appropriate locks are taken.
|
|
56
|
+
*
|
|
57
|
+
* @param callback The shutdown handler callback
|
|
58
|
+
* @return 0 or an error code
|
|
59
|
+
*/
|
|
60
|
+
int git_runtime_shutdown_register(git_runtime_shutdown_fn callback);
|
|
61
|
+
|
|
62
|
+
#endif
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) the libgit2 contributors. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* This file is part of libgit2, distributed under the GNU GPL v2 with
|
|
5
|
+
* a Linking Exception. For full terms see the included COPYING file.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
extern int git_settings_global_init(void);
|
|
9
|
+
|
|
10
|
+
extern const char *git_libgit2__user_agent(void);
|
|
11
|
+
extern const char *git_libgit2__ssl_ciphers(void);
|
|
@@ -65,7 +65,8 @@ int git_signature_new(git_signature **sig_out, const char *name, const char *ema
|
|
|
65
65
|
{
|
|
66
66
|
git_signature *p = NULL;
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
GIT_ASSERT_ARG(name);
|
|
69
|
+
GIT_ASSERT_ARG(email);
|
|
69
70
|
|
|
70
71
|
*sig_out = NULL;
|
|
71
72
|
|
|
@@ -279,7 +280,8 @@ int git_signature_from_buffer(git_signature **out, const char *buf)
|
|
|
279
280
|
const char *buf_end;
|
|
280
281
|
int error;
|
|
281
282
|
|
|
282
|
-
|
|
283
|
+
GIT_ASSERT_ARG(out);
|
|
284
|
+
GIT_ASSERT_ARG(buf);
|
|
283
285
|
|
|
284
286
|
*out = NULL;
|
|
285
287
|
|
|
@@ -302,8 +304,6 @@ void git_signature__writebuf(git_buf *buf, const char *header, const git_signatu
|
|
|
302
304
|
int offset, hours, mins;
|
|
303
305
|
char sign;
|
|
304
306
|
|
|
305
|
-
assert(buf && sig);
|
|
306
|
-
|
|
307
307
|
offset = sig->when.offset;
|
|
308
308
|
sign = (sig->when.offset < 0 || sig->when.sign == '-') ? '-' : '+';
|
|
309
309
|
|
|
@@ -320,7 +320,8 @@ void git_signature__writebuf(git_buf *buf, const char *header, const git_signatu
|
|
|
320
320
|
|
|
321
321
|
bool git_signature__equal(const git_signature *one, const git_signature *two)
|
|
322
322
|
{
|
|
323
|
-
|
|
323
|
+
GIT_ASSERT_ARG(one);
|
|
324
|
+
GIT_ASSERT_ARG(two);
|
|
324
325
|
|
|
325
326
|
return
|
|
326
327
|
git__strcmp(one->name, two->name) == 0 &&
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
#include "util.h"
|
|
13
13
|
#include "futils.h"
|
|
14
14
|
#include "vector.h"
|
|
15
|
-
#include "thread
|
|
15
|
+
#include "thread.h"
|
|
16
16
|
#include "pool.h"
|
|
17
17
|
#include "strmap.h"
|
|
18
18
|
|
|
@@ -58,7 +58,7 @@ typedef struct {
|
|
|
58
58
|
* may be NULL. The cache makes it easy to load this and check
|
|
59
59
|
* if it has been modified since the last load and/or write.
|
|
60
60
|
*/
|
|
61
|
-
int git_sortedcache_new(
|
|
61
|
+
GIT_WARN_UNUSED_RESULT int git_sortedcache_new(
|
|
62
62
|
git_sortedcache **out,
|
|
63
63
|
size_t item_path_offset, /* use offsetof(struct, path-field) macro */
|
|
64
64
|
git_sortedcache_free_item_fn free_item,
|
|
@@ -71,7 +71,7 @@ int git_sortedcache_new(
|
|
|
71
71
|
* - `copy_item` can be NULL to just use memcpy
|
|
72
72
|
* - if `lock`, grabs read lock on `src` during copy and releases after
|
|
73
73
|
*/
|
|
74
|
-
int git_sortedcache_copy(
|
|
74
|
+
GIT_WARN_UNUSED_RESULT int git_sortedcache_copy(
|
|
75
75
|
git_sortedcache **out,
|
|
76
76
|
git_sortedcache *src,
|
|
77
77
|
bool lock,
|
|
@@ -100,7 +100,7 @@ const char *git_sortedcache_path(git_sortedcache *sc);
|
|
|
100
100
|
*/
|
|
101
101
|
|
|
102
102
|
/* Lock sortedcache for write */
|
|
103
|
-
int git_sortedcache_wlock(git_sortedcache *sc);
|
|
103
|
+
GIT_WARN_UNUSED_RESULT int git_sortedcache_wlock(git_sortedcache *sc);
|
|
104
104
|
|
|
105
105
|
/* Unlock sorted cache when done with write */
|
|
106
106
|
void git_sortedcache_wunlock(git_sortedcache *sc);
|
|
@@ -120,7 +120,8 @@ void git_sortedcache_wunlock(git_sortedcache *sc);
|
|
|
120
120
|
*
|
|
121
121
|
* @return 0 if up-to-date, 1 if out-of-date, <0 on error
|
|
122
122
|
*/
|
|
123
|
-
int git_sortedcache_lockandload(
|
|
123
|
+
GIT_WARN_UNUSED_RESULT int git_sortedcache_lockandload(
|
|
124
|
+
git_sortedcache *sc, git_buf *buf);
|
|
124
125
|
|
|
125
126
|
/* Refresh file timestamp after write completes
|
|
126
127
|
* You should already be holding the write lock when you call this.
|
|
@@ -132,12 +133,13 @@ void git_sortedcache_updated(git_sortedcache *sc);
|
|
|
132
133
|
* If `wlock` is true, grabs write lock and releases when done, otherwise
|
|
133
134
|
* you should already be holding a write lock when you call this.
|
|
134
135
|
*/
|
|
135
|
-
int git_sortedcache_clear(
|
|
136
|
+
GIT_WARN_UNUSED_RESULT int git_sortedcache_clear(
|
|
137
|
+
git_sortedcache *sc, bool wlock);
|
|
136
138
|
|
|
137
139
|
/* Find and/or insert item, returning pointer to item data.
|
|
138
140
|
* You should already be holding the write lock when you call this.
|
|
139
141
|
*/
|
|
140
|
-
int git_sortedcache_upsert(
|
|
142
|
+
GIT_WARN_UNUSED_RESULT int git_sortedcache_upsert(
|
|
141
143
|
void **out, git_sortedcache *sc, const char *key);
|
|
142
144
|
|
|
143
145
|
/* Removes entry at pos from cache
|
|
@@ -155,7 +157,7 @@ int git_sortedcache_remove(git_sortedcache *sc, size_t pos);
|
|
|
155
157
|
*/
|
|
156
158
|
|
|
157
159
|
/* Lock sortedcache for read */
|
|
158
|
-
int git_sortedcache_rlock(git_sortedcache *sc);
|
|
160
|
+
GIT_WARN_UNUSED_RESULT int git_sortedcache_rlock(git_sortedcache *sc);
|
|
159
161
|
|
|
160
162
|
/* Unlock sorted cache when done with read */
|
|
161
163
|
void git_sortedcache_runlock(git_sortedcache *sc);
|
data/vendor/libgit2/src/stash.c
CHANGED
|
@@ -546,7 +546,9 @@ int git_stash_save(
|
|
|
546
546
|
git_buf msg = GIT_BUF_INIT;
|
|
547
547
|
int error;
|
|
548
548
|
|
|
549
|
-
|
|
549
|
+
GIT_ASSERT_ARG(out);
|
|
550
|
+
GIT_ASSERT_ARG(repo);
|
|
551
|
+
GIT_ASSERT_ARG(stasher);
|
|
550
552
|
|
|
551
553
|
if ((error = git_repository__ensure_not_bare(repo, "stash save")) < 0)
|
|
552
554
|
return error;
|
data/vendor/libgit2/src/status.c
CHANGED
|
@@ -391,14 +391,14 @@ done:
|
|
|
391
391
|
|
|
392
392
|
size_t git_status_list_entrycount(git_status_list *status)
|
|
393
393
|
{
|
|
394
|
-
|
|
394
|
+
GIT_ASSERT_ARG_WITH_RETVAL(status, 0);
|
|
395
395
|
|
|
396
396
|
return status->paired.length;
|
|
397
397
|
}
|
|
398
398
|
|
|
399
399
|
const git_status_entry *git_status_byindex(git_status_list *status, size_t i)
|
|
400
400
|
{
|
|
401
|
-
|
|
401
|
+
GIT_ASSERT_ARG_WITH_RETVAL(status, NULL);
|
|
402
402
|
|
|
403
403
|
return git_vector_get(&status->paired, i);
|
|
404
404
|
}
|
|
@@ -492,7 +492,9 @@ int git_status_file(
|
|
|
492
492
|
struct status_file_info sfi = {0};
|
|
493
493
|
git_index *index;
|
|
494
494
|
|
|
495
|
-
|
|
495
|
+
GIT_ASSERT_ARG(status_flags);
|
|
496
|
+
GIT_ASSERT_ARG(repo);
|
|
497
|
+
GIT_ASSERT_ARG(path);
|
|
496
498
|
|
|
497
499
|
if ((error = git_repository_index__weakptr(&index, repo)) < 0)
|
|
498
500
|
return error;
|
|
@@ -558,7 +560,8 @@ int git_status_init_options(git_status_options *opts, unsigned int version)
|
|
|
558
560
|
int git_status_list_get_perfdata(
|
|
559
561
|
git_diff_perfdata *out, const git_status_list *status)
|
|
560
562
|
{
|
|
561
|
-
|
|
563
|
+
GIT_ASSERT_ARG(out);
|
|
564
|
+
|
|
562
565
|
GIT_ERROR_CHECK_VERSION(out, GIT_DIFF_PERFDATA_VERSION, "git_diff_perfdata");
|
|
563
566
|
|
|
564
567
|
out->stat_calls = 0;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
#include <ctype.h>
|
|
13
13
|
|
|
14
|
-
#include "
|
|
14
|
+
#include "runtime.h"
|
|
15
15
|
#include "stream.h"
|
|
16
16
|
#include "streams/socket.h"
|
|
17
17
|
#include "netops.h"
|
|
@@ -68,8 +68,6 @@ static void shutdown_ssl(void)
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
int git_mbedtls__set_cert_location(const char *path, int is_dir);
|
|
72
|
-
|
|
73
71
|
int git_mbedtls_stream_global_init(void)
|
|
74
72
|
{
|
|
75
73
|
int loaded = 0;
|
|
@@ -148,13 +146,11 @@ int git_mbedtls_stream_global_init(void)
|
|
|
148
146
|
|
|
149
147
|
/* load default certificates */
|
|
150
148
|
if (crtpath != NULL && stat(crtpath, &statbuf) == 0 && S_ISREG(statbuf.st_mode))
|
|
151
|
-
loaded = (git_mbedtls__set_cert_location(crtpath,
|
|
149
|
+
loaded = (git_mbedtls__set_cert_location(crtpath, NULL) == 0);
|
|
152
150
|
if (!loaded && crtpath != NULL && stat(crtpath, &statbuf) == 0 && S_ISDIR(statbuf.st_mode))
|
|
153
|
-
loaded = (git_mbedtls__set_cert_location(
|
|
154
|
-
|
|
155
|
-
git__on_shutdown(shutdown_ssl);
|
|
151
|
+
loaded = (git_mbedtls__set_cert_location(NULL, crtpath) == 0);
|
|
156
152
|
|
|
157
|
-
return
|
|
153
|
+
return git_runtime_shutdown_register(shutdown_ssl);
|
|
158
154
|
|
|
159
155
|
cleanup:
|
|
160
156
|
mbedtls_ctr_drbg_free(ctr_drbg);
|
|
@@ -183,8 +179,8 @@ static int ssl_set_error(mbedtls_ssl_context *ssl, int error)
|
|
|
183
179
|
char errbuf[512];
|
|
184
180
|
int ret = -1;
|
|
185
181
|
|
|
186
|
-
|
|
187
|
-
|
|
182
|
+
GIT_ASSERT(error != MBEDTLS_ERR_SSL_WANT_READ);
|
|
183
|
+
GIT_ASSERT(error != MBEDTLS_ERR_SSL_WANT_WRITE);
|
|
188
184
|
|
|
189
185
|
if (error != 0)
|
|
190
186
|
mbedtls_strerror( error, errbuf, 512 );
|
|
@@ -425,7 +421,9 @@ int git_mbedtls_stream_new(
|
|
|
425
421
|
git_stream *stream;
|
|
426
422
|
int error;
|
|
427
423
|
|
|
428
|
-
|
|
424
|
+
GIT_ASSERT_ARG(out);
|
|
425
|
+
GIT_ASSERT_ARG(host);
|
|
426
|
+
GIT_ASSERT_ARG(port);
|
|
429
427
|
|
|
430
428
|
if ((error = git_socket_stream_new(&stream, host, port)) < 0)
|
|
431
429
|
return error;
|
|
@@ -438,23 +436,22 @@ int git_mbedtls_stream_new(
|
|
|
438
436
|
return error;
|
|
439
437
|
}
|
|
440
438
|
|
|
441
|
-
int git_mbedtls__set_cert_location(const char *
|
|
439
|
+
int git_mbedtls__set_cert_location(const char *file, const char *path)
|
|
442
440
|
{
|
|
443
441
|
int ret = 0;
|
|
444
442
|
char errbuf[512];
|
|
445
443
|
mbedtls_x509_crt *cacert;
|
|
446
444
|
|
|
447
|
-
|
|
445
|
+
GIT_ASSERT_ARG(file || path);
|
|
448
446
|
|
|
449
447
|
cacert = git__malloc(sizeof(mbedtls_x509_crt));
|
|
450
448
|
GIT_ERROR_CHECK_ALLOC(cacert);
|
|
451
449
|
|
|
452
450
|
mbedtls_x509_crt_init(cacert);
|
|
453
|
-
if (
|
|
451
|
+
if (file)
|
|
452
|
+
ret = mbedtls_x509_crt_parse_file(cacert, file);
|
|
453
|
+
if (ret >= 0 && path)
|
|
454
454
|
ret = mbedtls_x509_crt_parse_path(cacert, path);
|
|
455
|
-
} else {
|
|
456
|
-
ret = mbedtls_x509_crt_parse_file(cacert, path);
|
|
457
|
-
}
|
|
458
455
|
/* mbedtls_x509_crt_parse_path returns the number of invalid certs on success */
|
|
459
456
|
if (ret < 0) {
|
|
460
457
|
mbedtls_x509_crt_free(cacert);
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
extern int git_mbedtls_stream_global_init(void);
|
|
15
15
|
|
|
16
16
|
#ifdef GIT_MBEDTLS
|
|
17
|
-
extern int git_mbedtls__set_cert_location(const char *
|
|
17
|
+
extern int git_mbedtls__set_cert_location(const char *file, const char *path);
|
|
18
18
|
|
|
19
19
|
extern int git_mbedtls_stream_new(git_stream **out, const char *host, const char *port);
|
|
20
20
|
extern int git_mbedtls_stream_wrap(git_stream **out, git_stream *in, const char *host);
|
|
@@ -6,12 +6,16 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
#include "streams/openssl.h"
|
|
9
|
+
#include "streams/openssl_legacy.h"
|
|
10
|
+
#include "streams/openssl_dynamic.h"
|
|
9
11
|
|
|
10
12
|
#ifdef GIT_OPENSSL
|
|
11
13
|
|
|
12
14
|
#include <ctype.h>
|
|
13
15
|
|
|
14
|
-
#include "
|
|
16
|
+
#include "common.h"
|
|
17
|
+
#include "runtime.h"
|
|
18
|
+
#include "settings.h"
|
|
15
19
|
#include "posix.h"
|
|
16
20
|
#include "stream.h"
|
|
17
21
|
#include "streams/socket.h"
|
|
@@ -25,156 +29,17 @@
|
|
|
25
29
|
# include <netinet/in.h>
|
|
26
30
|
#endif
|
|
27
31
|
|
|
28
|
-
#
|
|
29
|
-
#include <openssl/
|
|
30
|
-
#include <openssl/
|
|
31
|
-
#include <openssl/
|
|
32
|
+
#ifndef GIT_OPENSSL_DYNAMIC
|
|
33
|
+
# include <openssl/ssl.h>
|
|
34
|
+
# include <openssl/err.h>
|
|
35
|
+
# include <openssl/x509v3.h>
|
|
36
|
+
# include <openssl/bio.h>
|
|
37
|
+
#endif
|
|
32
38
|
|
|
33
39
|
SSL_CTX *git__ssl_ctx;
|
|
34
40
|
|
|
35
41
|
#define GIT_SSL_DEFAULT_CIPHERS "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-SHA256:DHE-DSS-AES128-SHA:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA"
|
|
36
42
|
|
|
37
|
-
#if (defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x10100000L) || \
|
|
38
|
-
(defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x20700000L)
|
|
39
|
-
# define OPENSSL_LEGACY_API
|
|
40
|
-
#endif
|
|
41
|
-
|
|
42
|
-
/*
|
|
43
|
-
* OpenSSL 1.1 made BIO opaque so we have to use functions to interact with it
|
|
44
|
-
* which do not exist in previous versions. We define these inline functions so
|
|
45
|
-
* we can program against the interface instead of littering the implementation
|
|
46
|
-
* with ifdefs. We do the same for OPENSSL_init_ssl.
|
|
47
|
-
*/
|
|
48
|
-
#if defined(OPENSSL_LEGACY_API)
|
|
49
|
-
static int OPENSSL_init_ssl(int opts, void *settings)
|
|
50
|
-
{
|
|
51
|
-
GIT_UNUSED(opts);
|
|
52
|
-
GIT_UNUSED(settings);
|
|
53
|
-
SSL_load_error_strings();
|
|
54
|
-
OpenSSL_add_ssl_algorithms();
|
|
55
|
-
return 0;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
static BIO_METHOD* BIO_meth_new(int type, const char *name)
|
|
59
|
-
{
|
|
60
|
-
BIO_METHOD *meth = git__calloc(1, sizeof(BIO_METHOD));
|
|
61
|
-
if (!meth) {
|
|
62
|
-
return NULL;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
meth->type = type;
|
|
66
|
-
meth->name = name;
|
|
67
|
-
|
|
68
|
-
return meth;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
static void BIO_meth_free(BIO_METHOD *biom)
|
|
72
|
-
{
|
|
73
|
-
git__free(biom);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
static int BIO_meth_set_write(BIO_METHOD *biom, int (*write) (BIO *, const char *, int))
|
|
77
|
-
{
|
|
78
|
-
biom->bwrite = write;
|
|
79
|
-
return 1;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
static int BIO_meth_set_read(BIO_METHOD *biom, int (*read) (BIO *, char *, int))
|
|
83
|
-
{
|
|
84
|
-
biom->bread = read;
|
|
85
|
-
return 1;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
static int BIO_meth_set_puts(BIO_METHOD *biom, int (*puts) (BIO *, const char *))
|
|
89
|
-
{
|
|
90
|
-
biom->bputs = puts;
|
|
91
|
-
return 1;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
static int BIO_meth_set_gets(BIO_METHOD *biom, int (*gets) (BIO *, char *, int))
|
|
95
|
-
|
|
96
|
-
{
|
|
97
|
-
biom->bgets = gets;
|
|
98
|
-
return 1;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
static int BIO_meth_set_ctrl(BIO_METHOD *biom, long (*ctrl) (BIO *, int, long, void *))
|
|
102
|
-
{
|
|
103
|
-
biom->ctrl = ctrl;
|
|
104
|
-
return 1;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
static int BIO_meth_set_create(BIO_METHOD *biom, int (*create) (BIO *))
|
|
108
|
-
{
|
|
109
|
-
biom->create = create;
|
|
110
|
-
return 1;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
static int BIO_meth_set_destroy(BIO_METHOD *biom, int (*destroy) (BIO *))
|
|
114
|
-
{
|
|
115
|
-
biom->destroy = destroy;
|
|
116
|
-
return 1;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
static int BIO_get_new_index(void)
|
|
120
|
-
{
|
|
121
|
-
/* This exists as of 1.1 so before we'd just have 0 */
|
|
122
|
-
return 0;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
static void BIO_set_init(BIO *b, int init)
|
|
126
|
-
{
|
|
127
|
-
b->init = init;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
static void BIO_set_data(BIO *a, void *ptr)
|
|
131
|
-
{
|
|
132
|
-
a->ptr = ptr;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
static void *BIO_get_data(BIO *a)
|
|
136
|
-
{
|
|
137
|
-
return a->ptr;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
static const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *x)
|
|
141
|
-
{
|
|
142
|
-
return ASN1_STRING_data((ASN1_STRING *)x);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
# if defined(GIT_THREADS)
|
|
146
|
-
static git_mutex *openssl_locks;
|
|
147
|
-
|
|
148
|
-
static void openssl_locking_function(
|
|
149
|
-
int mode, int n, const char *file, int line)
|
|
150
|
-
{
|
|
151
|
-
int lock;
|
|
152
|
-
|
|
153
|
-
GIT_UNUSED(file);
|
|
154
|
-
GIT_UNUSED(line);
|
|
155
|
-
|
|
156
|
-
lock = mode & CRYPTO_LOCK;
|
|
157
|
-
|
|
158
|
-
if (lock) {
|
|
159
|
-
(void)git_mutex_lock(&openssl_locks[n]);
|
|
160
|
-
} else {
|
|
161
|
-
git_mutex_unlock(&openssl_locks[n]);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
static void shutdown_ssl_locking(void)
|
|
166
|
-
{
|
|
167
|
-
int num_locks, i;
|
|
168
|
-
|
|
169
|
-
num_locks = CRYPTO_num_locks();
|
|
170
|
-
CRYPTO_set_locking_callback(NULL);
|
|
171
|
-
|
|
172
|
-
for (i = 0; i < num_locks; ++i)
|
|
173
|
-
git_mutex_free(&openssl_locks[i]);
|
|
174
|
-
git__free(openssl_locks);
|
|
175
|
-
}
|
|
176
|
-
# endif /* GIT_THREADS */
|
|
177
|
-
#endif /* OPENSSL_LEGACY_API */
|
|
178
43
|
|
|
179
44
|
static BIO_METHOD *git_stream_bio_method;
|
|
180
45
|
static int init_bio_method(void);
|
|
@@ -197,46 +62,47 @@ static void shutdown_ssl(void)
|
|
|
197
62
|
}
|
|
198
63
|
|
|
199
64
|
#ifdef VALGRIND
|
|
200
|
-
#
|
|
201
|
-
static void *git_openssl_malloc(size_t bytes)
|
|
202
|
-
{
|
|
203
|
-
return git__calloc(1, bytes);
|
|
204
|
-
}
|
|
65
|
+
# if !defined(GIT_OPENSSL_LEGACY) && !defined(GIT_OPENSSL_DYNAMIC)
|
|
205
66
|
|
|
206
|
-
static void *git_openssl_realloc(void *mem, size_t size)
|
|
207
|
-
{
|
|
208
|
-
return git__realloc(mem, size);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
static void git_openssl_free(void *mem)
|
|
212
|
-
{
|
|
213
|
-
return git__free(mem);
|
|
214
|
-
}
|
|
215
|
-
#else
|
|
216
67
|
static void *git_openssl_malloc(size_t bytes, const char *file, int line)
|
|
217
68
|
{
|
|
218
69
|
GIT_UNUSED(file);
|
|
219
70
|
GIT_UNUSED(line);
|
|
220
71
|
return git__calloc(1, bytes);
|
|
221
72
|
}
|
|
222
|
-
|
|
73
|
+
|
|
223
74
|
static void *git_openssl_realloc(void *mem, size_t size, const char *file, int line)
|
|
224
75
|
{
|
|
225
76
|
GIT_UNUSED(file);
|
|
226
77
|
GIT_UNUSED(line);
|
|
227
78
|
return git__realloc(mem, size);
|
|
228
79
|
}
|
|
229
|
-
|
|
80
|
+
|
|
230
81
|
static void git_openssl_free(void *mem, const char *file, int line)
|
|
231
82
|
{
|
|
232
83
|
GIT_UNUSED(file);
|
|
233
84
|
GIT_UNUSED(line);
|
|
234
|
-
|
|
85
|
+
git__free(mem);
|
|
86
|
+
}
|
|
87
|
+
# else /* !GIT_OPENSSL_LEGACY && !GIT_OPENSSL_DYNAMIC */
|
|
88
|
+
static void *git_openssl_malloc(size_t bytes)
|
|
89
|
+
{
|
|
90
|
+
return git__calloc(1, bytes);
|
|
235
91
|
}
|
|
236
|
-
#endif
|
|
237
|
-
#endif
|
|
238
92
|
|
|
239
|
-
|
|
93
|
+
static void *git_openssl_realloc(void *mem, size_t size)
|
|
94
|
+
{
|
|
95
|
+
return git__realloc(mem, size);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static void git_openssl_free(void *mem)
|
|
99
|
+
{
|
|
100
|
+
git__free(mem);
|
|
101
|
+
}
|
|
102
|
+
# endif /* !GIT_OPENSSL_LEGACY && !GIT_OPENSSL_DYNAMIC */
|
|
103
|
+
#endif /* VALGRIND */
|
|
104
|
+
|
|
105
|
+
static int openssl_init(void)
|
|
240
106
|
{
|
|
241
107
|
long ssl_opts = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
|
|
242
108
|
const char *ciphers = git_libgit2__ssl_ciphers();
|
|
@@ -250,13 +116,18 @@ int git_openssl_stream_global_init(void)
|
|
|
250
116
|
#endif
|
|
251
117
|
|
|
252
118
|
#ifdef VALGRIND
|
|
253
|
-
/*
|
|
254
|
-
|
|
119
|
+
/*
|
|
120
|
+
* Swap in our own allocator functions that initialize
|
|
121
|
+
* allocated memory to avoid spurious valgrind warnings.
|
|
122
|
+
* Don't error on failure; many builds of OpenSSL do not
|
|
123
|
+
* allow you to set these functions.
|
|
124
|
+
*/
|
|
125
|
+
if (!allocators_initialized) {
|
|
255
126
|
CRYPTO_set_mem_functions(git_openssl_malloc,
|
|
256
127
|
git_openssl_realloc,
|
|
257
|
-
git_openssl_free)
|
|
258
|
-
|
|
259
|
-
|
|
128
|
+
git_openssl_free);
|
|
129
|
+
allocators_initialized = true;
|
|
130
|
+
}
|
|
260
131
|
#endif
|
|
261
132
|
|
|
262
133
|
OPENSSL_init_ssl(0, NULL);
|
|
@@ -285,9 +156,7 @@ int git_openssl_stream_global_init(void)
|
|
|
285
156
|
if (init_bio_method() < 0)
|
|
286
157
|
goto error;
|
|
287
158
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
return 0;
|
|
159
|
+
return git_runtime_shutdown_register(shutdown_ssl);
|
|
291
160
|
|
|
292
161
|
error:
|
|
293
162
|
git_error_set(GIT_ERROR_NET, "could not initialize openssl: %s",
|
|
@@ -297,42 +166,60 @@ error:
|
|
|
297
166
|
return -1;
|
|
298
167
|
}
|
|
299
168
|
|
|
300
|
-
|
|
301
|
-
|
|
169
|
+
/*
|
|
170
|
+
* When we use dynamic loading, we defer OpenSSL initialization until
|
|
171
|
+
* it's first used. `openssl_ensure_initialized` will do the work
|
|
172
|
+
* under a mutex.
|
|
173
|
+
*/
|
|
174
|
+
git_mutex openssl_mutex;
|
|
175
|
+
bool openssl_initialized;
|
|
176
|
+
|
|
177
|
+
int git_openssl_stream_global_init(void)
|
|
302
178
|
{
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
179
|
+
#ifndef GIT_OPENSSL_DYNAMIC
|
|
180
|
+
return openssl_init();
|
|
181
|
+
#else
|
|
182
|
+
if (git_mutex_init(&openssl_mutex) != 0)
|
|
183
|
+
return -1;
|
|
184
|
+
|
|
185
|
+
return 0;
|
|
306
186
|
#endif
|
|
187
|
+
}
|
|
307
188
|
|
|
308
|
-
int
|
|
189
|
+
static int openssl_ensure_initialized(void)
|
|
309
190
|
{
|
|
310
|
-
#
|
|
311
|
-
int
|
|
191
|
+
#ifdef GIT_OPENSSL_DYNAMIC
|
|
192
|
+
int error = 0;
|
|
312
193
|
|
|
313
|
-
|
|
194
|
+
if (git_mutex_lock(&openssl_mutex) != 0)
|
|
195
|
+
return -1;
|
|
314
196
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
197
|
+
if (!openssl_initialized) {
|
|
198
|
+
if ((error = git_openssl_stream_dynamic_init()) == 0)
|
|
199
|
+
error = openssl_init();
|
|
318
200
|
|
|
319
|
-
|
|
320
|
-
if (git_mutex_init(&openssl_locks[i]) != 0) {
|
|
321
|
-
git_error_set(GIT_ERROR_SSL, "failed to initialize openssl locks");
|
|
322
|
-
return -1;
|
|
323
|
-
}
|
|
201
|
+
openssl_initialized = true;
|
|
324
202
|
}
|
|
325
203
|
|
|
326
|
-
|
|
327
|
-
|
|
204
|
+
error |= git_mutex_unlock(&openssl_mutex);
|
|
205
|
+
return error;
|
|
206
|
+
|
|
207
|
+
#else
|
|
328
208
|
return 0;
|
|
329
|
-
#
|
|
209
|
+
#endif
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
#if !defined(GIT_OPENSSL_LEGACY) && !defined(GIT_OPENSSL_DYNAMIC)
|
|
213
|
+
int git_openssl_set_locking(void)
|
|
214
|
+
{
|
|
215
|
+
# ifdef GIT_THREADS
|
|
330
216
|
return 0;
|
|
331
|
-
#else
|
|
217
|
+
# else
|
|
332
218
|
git_error_set(GIT_ERROR_THREAD, "libgit2 was not built with threads");
|
|
333
219
|
return -1;
|
|
334
|
-
#endif
|
|
220
|
+
# endif
|
|
335
221
|
}
|
|
222
|
+
#endif
|
|
336
223
|
|
|
337
224
|
|
|
338
225
|
static int bio_create(BIO *b)
|
|
@@ -415,8 +302,8 @@ static int ssl_set_error(SSL *ssl, int error)
|
|
|
415
302
|
|
|
416
303
|
err = SSL_get_error(ssl, error);
|
|
417
304
|
|
|
418
|
-
|
|
419
|
-
|
|
305
|
+
GIT_ASSERT(err != SSL_ERROR_WANT_READ);
|
|
306
|
+
GIT_ASSERT(err != SSL_ERROR_WANT_WRITE);
|
|
420
307
|
|
|
421
308
|
switch (err) {
|
|
422
309
|
case SSL_ERROR_WANT_CONNECT:
|
|
@@ -758,7 +645,9 @@ static int openssl_stream_wrap(
|
|
|
758
645
|
{
|
|
759
646
|
openssl_stream *st;
|
|
760
647
|
|
|
761
|
-
|
|
648
|
+
GIT_ASSERT_ARG(out);
|
|
649
|
+
GIT_ASSERT_ARG(in);
|
|
650
|
+
GIT_ASSERT_ARG(host);
|
|
762
651
|
|
|
763
652
|
st = git__calloc(1, sizeof(openssl_stream));
|
|
764
653
|
GIT_ERROR_CHECK_ALLOC(st);
|
|
@@ -793,6 +682,9 @@ static int openssl_stream_wrap(
|
|
|
793
682
|
|
|
794
683
|
int git_openssl_stream_wrap(git_stream **out, git_stream *in, const char *host)
|
|
795
684
|
{
|
|
685
|
+
if (openssl_ensure_initialized() < 0)
|
|
686
|
+
return -1;
|
|
687
|
+
|
|
796
688
|
return openssl_stream_wrap(out, in, host, 0);
|
|
797
689
|
}
|
|
798
690
|
|
|
@@ -801,7 +693,12 @@ int git_openssl_stream_new(git_stream **out, const char *host, const char *port)
|
|
|
801
693
|
git_stream *stream = NULL;
|
|
802
694
|
int error;
|
|
803
695
|
|
|
804
|
-
|
|
696
|
+
GIT_ASSERT_ARG(out);
|
|
697
|
+
GIT_ASSERT_ARG(host);
|
|
698
|
+
GIT_ASSERT_ARG(port);
|
|
699
|
+
|
|
700
|
+
if (openssl_ensure_initialized() < 0)
|
|
701
|
+
return -1;
|
|
805
702
|
|
|
806
703
|
if ((error = git_socket_stream_new(&stream, host, port)) < 0)
|
|
807
704
|
return error;
|
|
@@ -816,6 +713,9 @@ int git_openssl_stream_new(git_stream **out, const char *host, const char *port)
|
|
|
816
713
|
|
|
817
714
|
int git_openssl__set_cert_location(const char *file, const char *path)
|
|
818
715
|
{
|
|
716
|
+
if (openssl_ensure_initialized() < 0)
|
|
717
|
+
return -1;
|
|
718
|
+
|
|
819
719
|
if (SSL_CTX_load_verify_locations(git__ssl_ctx, file, path) == 0) {
|
|
820
720
|
char errmsg[256];
|
|
821
721
|
|