rugged 1.7.2 → 1.9.6

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.
Files changed (477) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/extconf.rb +4 -4
  3. data/ext/rugged/rugged.c +12 -1
  4. data/ext/rugged/rugged_blame.c +22 -6
  5. data/ext/rugged/rugged_blob.c +24 -9
  6. data/ext/rugged/rugged_branch.c +10 -7
  7. data/ext/rugged/rugged_branch_collection.c +8 -6
  8. data/ext/rugged/rugged_commit.c +7 -6
  9. data/ext/rugged/rugged_config.c +20 -11
  10. data/ext/rugged/rugged_diff.c +26 -12
  11. data/ext/rugged/rugged_diff_hunk.c +2 -1
  12. data/ext/rugged/rugged_index.c +39 -29
  13. data/ext/rugged/rugged_note.c +7 -6
  14. data/ext/rugged/rugged_object.c +3 -2
  15. data/ext/rugged/rugged_patch.c +23 -9
  16. data/ext/rugged/rugged_rebase.c +22 -10
  17. data/ext/rugged/rugged_reference.c +22 -13
  18. data/ext/rugged/rugged_reference_collection.c +9 -7
  19. data/ext/rugged/rugged_remote.c +23 -12
  20. data/ext/rugged/rugged_remote_collection.c +11 -9
  21. data/ext/rugged/rugged_repo.c +60 -45
  22. data/ext/rugged/rugged_revwalk.c +22 -12
  23. data/ext/rugged/rugged_submodule.c +23 -20
  24. data/ext/rugged/rugged_submodule_collection.c +20 -9
  25. data/ext/rugged/rugged_tag.c +6 -4
  26. data/ext/rugged/rugged_tag_collection.c +7 -5
  27. data/ext/rugged/rugged_tree.c +27 -15
  28. data/lib/rugged/version.rb +1 -1
  29. data/vendor/libgit2/AUTHORS +3 -0
  30. data/vendor/libgit2/CMakeLists.txt +23 -10
  31. data/vendor/libgit2/COPYING +278 -12
  32. data/vendor/libgit2/cmake/DefaultCFlags.cmake +8 -3
  33. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  34. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  35. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
  36. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  37. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
  38. data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
  39. data/vendor/libgit2/cmake/SelectRegex.cmake +14 -4
  40. data/vendor/libgit2/cmake/SelectSSH.cmake +30 -19
  41. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  42. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  43. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  44. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  45. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  46. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  47. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  48. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  49. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  50. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  51. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  52. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  53. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  54. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  55. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  56. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  57. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  58. data/vendor/libgit2/deps/pcre2/CMakeLists.txt +110 -0
  59. data/vendor/libgit2/deps/pcre2/LICENCE.md +104 -0
  60. data/vendor/libgit2/deps/pcre2/config.h.in +54 -0
  61. data/vendor/libgit2/deps/pcre2/pcre2.h +1079 -0
  62. data/vendor/libgit2/deps/pcre2/pcre2_auto_possess.c +1416 -0
  63. data/vendor/libgit2/deps/{pcre/pcre_chartables.c → pcre2/pcre2_chartables.c} +41 -47
  64. data/vendor/libgit2/deps/{pcre/pcre_ord2utf8.c → pcre2/pcre2_chkdint.c} +36 -36
  65. data/vendor/libgit2/deps/pcre2/pcre2_compile.c +11345 -0
  66. data/vendor/libgit2/deps/pcre2/pcre2_compile.h +356 -0
  67. data/vendor/libgit2/deps/pcre2/pcre2_compile_cgroup.c +632 -0
  68. data/vendor/libgit2/deps/pcre2/pcre2_compile_class.c +2777 -0
  69. data/vendor/libgit2/deps/pcre2/pcre2_config.c +250 -0
  70. data/vendor/libgit2/deps/pcre2/pcre2_context.c +557 -0
  71. data/vendor/libgit2/deps/pcre2/pcre2_convert.c +1263 -0
  72. data/vendor/libgit2/deps/{pcre/pcre_dfa_exec.c → pcre2/pcre2_dfa_match.c} +1402 -943
  73. data/vendor/libgit2/deps/pcre2/pcre2_error.c +384 -0
  74. data/vendor/libgit2/deps/pcre2/pcre2_extuni.c +159 -0
  75. data/vendor/libgit2/deps/pcre2/pcre2_find_bracket.c +217 -0
  76. data/vendor/libgit2/deps/pcre2/pcre2_fuzzsupport.c +844 -0
  77. data/vendor/libgit2/deps/pcre2/pcre2_internal.h +2353 -0
  78. data/vendor/libgit2/deps/pcre2/pcre2_intmodedep.h +1044 -0
  79. data/vendor/libgit2/deps/pcre2/pcre2_maketables.c +177 -0
  80. data/vendor/libgit2/deps/pcre2/pcre2_match.c +8244 -0
  81. data/vendor/libgit2/deps/pcre2/pcre2_match_data.c +184 -0
  82. data/vendor/libgit2/deps/pcre2/pcre2_match_next.c +171 -0
  83. data/vendor/libgit2/deps/{pcre/pcre_newline.c → pcre2/pcre2_newline.c} +92 -63
  84. data/vendor/libgit2/deps/{pcre/pcre_refcount.c → pcre2/pcre2_ord2utf.c} +64 -38
  85. data/vendor/libgit2/deps/pcre2/pcre2_pattern_info.c +430 -0
  86. data/vendor/libgit2/deps/pcre2/pcre2_printint_inc.h +1098 -0
  87. data/vendor/libgit2/deps/pcre2/pcre2_script_run.c +344 -0
  88. data/vendor/libgit2/deps/pcre2/pcre2_serialize.c +284 -0
  89. data/vendor/libgit2/deps/pcre2/pcre2_string_utils.c +199 -0
  90. data/vendor/libgit2/deps/pcre2/pcre2_study.c +2087 -0
  91. data/vendor/libgit2/deps/pcre2/pcre2_substitute.c +1761 -0
  92. data/vendor/libgit2/deps/pcre2/pcre2_substring.c +553 -0
  93. data/vendor/libgit2/deps/pcre2/pcre2_tables.c +310 -0
  94. data/vendor/libgit2/deps/pcre2/pcre2_ucd.c +5805 -0
  95. data/vendor/libgit2/deps/pcre2/pcre2_ucp.h +408 -0
  96. data/vendor/libgit2/deps/pcre2/pcre2_ucptables_inc.h +1596 -0
  97. data/vendor/libgit2/deps/pcre2/pcre2_util.h +179 -0
  98. data/vendor/libgit2/deps/pcre2/pcre2_valid_utf.c +397 -0
  99. data/vendor/libgit2/deps/pcre2/pcre2_xclass.c +547 -0
  100. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +1 -1
  101. data/vendor/libgit2/deps/xdiff/xmerge.c +16 -12
  102. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  103. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  104. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  105. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  106. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  107. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  108. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  109. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  110. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  111. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  112. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  113. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  114. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  115. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  116. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  117. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  118. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  119. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  120. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  121. data/vendor/libgit2/include/git2/apply.h +27 -6
  122. data/vendor/libgit2/include/git2/attr.h +17 -4
  123. data/vendor/libgit2/include/git2/blame.h +133 -28
  124. data/vendor/libgit2/include/git2/blob.h +71 -28
  125. data/vendor/libgit2/include/git2/branch.h +22 -15
  126. data/vendor/libgit2/include/git2/buffer.h +6 -4
  127. data/vendor/libgit2/include/git2/cert.h +2 -1
  128. data/vendor/libgit2/include/git2/checkout.h +83 -32
  129. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  130. data/vendor/libgit2/include/git2/clone.h +25 -9
  131. data/vendor/libgit2/include/git2/commit.h +132 -3
  132. data/vendor/libgit2/include/git2/common.h +132 -63
  133. data/vendor/libgit2/include/git2/config.h +93 -23
  134. data/vendor/libgit2/include/git2/credential.h +30 -2
  135. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  136. data/vendor/libgit2/include/git2/deprecated.h +134 -4
  137. data/vendor/libgit2/include/git2/describe.h +13 -1
  138. data/vendor/libgit2/include/git2/diff.h +38 -8
  139. data/vendor/libgit2/include/git2/email.h +9 -29
  140. data/vendor/libgit2/include/git2/errors.h +46 -73
  141. data/vendor/libgit2/include/git2/filter.h +14 -7
  142. data/vendor/libgit2/include/git2/global.h +8 -1
  143. data/vendor/libgit2/include/git2/graph.h +3 -2
  144. data/vendor/libgit2/include/git2/ignore.h +10 -0
  145. data/vendor/libgit2/include/git2/index.h +100 -15
  146. data/vendor/libgit2/include/git2/indexer.h +21 -4
  147. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  148. data/vendor/libgit2/include/git2/merge.h +50 -3
  149. data/vendor/libgit2/include/git2/message.h +2 -2
  150. data/vendor/libgit2/include/git2/net.h +3 -1
  151. data/vendor/libgit2/include/git2/notes.h +9 -6
  152. data/vendor/libgit2/include/git2/object.h +9 -8
  153. data/vendor/libgit2/include/git2/odb.h +91 -49
  154. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  155. data/vendor/libgit2/include/git2/oid.h +23 -25
  156. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  157. data/vendor/libgit2/include/git2/pack.h +13 -1
  158. data/vendor/libgit2/include/git2/patch.h +2 -3
  159. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  160. data/vendor/libgit2/include/git2/proxy.h +12 -3
  161. data/vendor/libgit2/include/git2/rebase.h +9 -6
  162. data/vendor/libgit2/include/git2/refdb.h +2 -2
  163. data/vendor/libgit2/include/git2/reflog.h +3 -2
  164. data/vendor/libgit2/include/git2/refs.h +9 -6
  165. data/vendor/libgit2/include/git2/refspec.h +14 -4
  166. data/vendor/libgit2/include/git2/remote.h +113 -25
  167. data/vendor/libgit2/include/git2/repository.h +57 -21
  168. data/vendor/libgit2/include/git2/reset.h +16 -3
  169. data/vendor/libgit2/include/git2/revert.h +9 -4
  170. data/vendor/libgit2/include/git2/revparse.h +3 -3
  171. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  172. data/vendor/libgit2/include/git2/signature.h +46 -1
  173. data/vendor/libgit2/include/git2/stash.h +17 -3
  174. data/vendor/libgit2/include/git2/status.h +10 -6
  175. data/vendor/libgit2/include/git2/stdint.h +87 -85
  176. data/vendor/libgit2/include/git2/strarray.h +2 -3
  177. data/vendor/libgit2/include/git2/submodule.h +20 -9
  178. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  179. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  180. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  181. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  182. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  183. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  184. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  185. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  186. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  187. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  188. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  189. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  190. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  191. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  192. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  193. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  194. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  195. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  196. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  197. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  198. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  199. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  200. data/vendor/libgit2/include/git2/sys/transport.h +25 -4
  201. data/vendor/libgit2/include/git2/tag.h +3 -1
  202. data/vendor/libgit2/include/git2/trace.h +9 -3
  203. data/vendor/libgit2/include/git2/transaction.h +3 -2
  204. data/vendor/libgit2/include/git2/transport.h +11 -3
  205. data/vendor/libgit2/include/git2/tree.h +16 -5
  206. data/vendor/libgit2/include/git2/types.h +19 -3
  207. data/vendor/libgit2/include/git2/version.h +46 -8
  208. data/vendor/libgit2/include/git2/worktree.h +16 -6
  209. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  210. data/vendor/libgit2/src/cli/CMakeLists.txt +3 -4
  211. data/vendor/libgit2/src/cli/cmd.c +1 -1
  212. data/vendor/libgit2/src/cli/cmd.h +4 -0
  213. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  214. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  215. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  216. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  217. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  218. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  219. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  220. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  221. data/vendor/libgit2/src/cli/common.c +168 -0
  222. data/vendor/libgit2/src/cli/common.h +63 -0
  223. data/vendor/libgit2/src/cli/error.h +1 -1
  224. data/vendor/libgit2/src/cli/main.c +52 -24
  225. data/vendor/libgit2/src/cli/opt.c +31 -5
  226. data/vendor/libgit2/src/cli/opt.h +21 -3
  227. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  228. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  229. data/vendor/libgit2/src/cli/progress.c +51 -2
  230. data/vendor/libgit2/src/cli/progress.h +12 -0
  231. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  232. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  233. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  234. data/vendor/libgit2/src/libgit2/CMakeLists.txt +55 -21
  235. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  236. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  237. data/vendor/libgit2/src/libgit2/attr_file.c +17 -5
  238. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  239. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  240. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  241. data/vendor/libgit2/src/libgit2/blame.c +135 -43
  242. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  243. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  244. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  245. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  246. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  247. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  248. data/vendor/libgit2/src/libgit2/clone.c +192 -166
  249. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  250. data/vendor/libgit2/src/libgit2/commit.c +93 -1
  251. data/vendor/libgit2/src/libgit2/commit_graph.c +68 -58
  252. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  253. data/vendor/libgit2/src/libgit2/config.c +390 -299
  254. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  255. data/vendor/libgit2/src/libgit2/config.h +9 -4
  256. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  257. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  258. data/vendor/libgit2/src/libgit2/config_file.c +101 -89
  259. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  260. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  261. data/vendor/libgit2/src/libgit2/config_mem.c +195 -40
  262. data/vendor/libgit2/src/libgit2/config_parse.c +12 -10
  263. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  264. data/vendor/libgit2/src/libgit2/delta.c +13 -1
  265. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  266. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  267. data/vendor/libgit2/src/libgit2/diff_driver.c +13 -20
  268. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  269. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  270. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  271. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  272. data/vendor/libgit2/src/libgit2/diff_stats.c +19 -12
  273. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  274. data/vendor/libgit2/src/libgit2/email.c +1 -0
  275. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  276. data/vendor/libgit2/src/libgit2/fetchhead.c +1 -1
  277. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  278. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  279. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  280. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  281. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  282. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  283. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  284. data/vendor/libgit2/src/libgit2/index.c +76 -98
  285. data/vendor/libgit2/src/libgit2/index.h +5 -2
  286. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  287. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  288. data/vendor/libgit2/src/libgit2/indexer.c +38 -41
  289. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  290. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  291. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  292. data/vendor/libgit2/src/libgit2/merge.c +43 -38
  293. data/vendor/libgit2/src/libgit2/merge.h +4 -0
  294. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  295. data/vendor/libgit2/src/libgit2/merge_file.c +43 -30
  296. data/vendor/libgit2/src/libgit2/message.c +1 -1
  297. data/vendor/libgit2/src/libgit2/midx.c +30 -18
  298. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  299. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  300. data/vendor/libgit2/src/libgit2/object.c +6 -5
  301. data/vendor/libgit2/src/libgit2/odb.c +7 -10
  302. data/vendor/libgit2/src/libgit2/odb_loose.c +24 -14
  303. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  304. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  305. data/vendor/libgit2/src/libgit2/oid.c +36 -10
  306. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  307. data/vendor/libgit2/src/libgit2/pack-objects.c +59 -34
  308. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  309. data/vendor/libgit2/src/libgit2/pack.c +33 -24
  310. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  311. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  312. data/vendor/libgit2/src/libgit2/path.c +1 -1
  313. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  314. data/vendor/libgit2/src/libgit2/push.c +79 -28
  315. data/vendor/libgit2/src/libgit2/push.h +1 -0
  316. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  317. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  318. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  319. data/vendor/libgit2/src/libgit2/refs.c +41 -13
  320. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  321. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  322. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  323. data/vendor/libgit2/src/libgit2/remote.c +125 -62
  324. data/vendor/libgit2/src/libgit2/remote.h +0 -1
  325. data/vendor/libgit2/src/libgit2/repository.c +235 -54
  326. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  327. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  328. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  329. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  330. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  331. data/vendor/libgit2/src/libgit2/settings.c +477 -0
  332. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  333. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  334. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  335. data/vendor/libgit2/src/libgit2/status.c +1 -1
  336. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  337. data/vendor/libgit2/src/libgit2/streams/openssl.c +36 -8
  338. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  339. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  340. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  341. data/vendor/libgit2/src/libgit2/streams/socket.c +30 -0
  342. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  343. data/vendor/libgit2/src/libgit2/submodule.c +195 -80
  344. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  345. data/vendor/libgit2/src/libgit2/tag.c +4 -2
  346. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  347. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  348. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  349. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  350. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +2 -0
  351. data/vendor/libgit2/src/libgit2/transports/credential.c +2 -2
  352. data/vendor/libgit2/src/libgit2/transports/git.c +1 -1
  353. data/vendor/libgit2/src/libgit2/transports/http.c +5 -6
  354. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  355. data/vendor/libgit2/src/libgit2/transports/httpclient.c +124 -81
  356. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  357. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  358. data/vendor/libgit2/src/libgit2/transports/local.c +16 -8
  359. data/vendor/libgit2/src/libgit2/transports/smart.c +25 -13
  360. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  361. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +7 -6
  362. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  363. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  364. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +386 -0
  365. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  366. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1132 -0
  367. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  368. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  369. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  370. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  371. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  372. data/vendor/libgit2/src/util/CMakeLists.txt +7 -10
  373. data/vendor/libgit2/src/util/alloc.c +4 -1
  374. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  375. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  376. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  377. data/vendor/libgit2/src/util/array.h +18 -17
  378. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  379. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  380. data/vendor/libgit2/src/util/date.c +22 -14
  381. data/vendor/libgit2/src/util/date.h +12 -0
  382. data/vendor/libgit2/src/util/errors.c +401 -0
  383. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  384. data/vendor/libgit2/src/util/fs_path.c +81 -10
  385. data/vendor/libgit2/src/util/fs_path.h +39 -10
  386. data/vendor/libgit2/src/util/futils.c +6 -5
  387. data/vendor/libgit2/src/util/futils.h +24 -7
  388. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  389. data/vendor/libgit2/src/util/git2_util.h +6 -0
  390. data/vendor/libgit2/src/util/hash/builtin.c +14 -4
  391. data/vendor/libgit2/src/util/hash/openssl.c +148 -0
  392. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  393. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +8 -6
  394. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  395. data/vendor/libgit2/src/util/hashmap.h +425 -0
  396. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  397. data/vendor/libgit2/src/util/integer.h +3 -1
  398. data/vendor/libgit2/src/util/net.c +17 -11
  399. data/vendor/libgit2/src/util/net.h +2 -0
  400. data/vendor/libgit2/src/util/pool.c +1 -1
  401. data/vendor/libgit2/src/util/pool.h +5 -0
  402. data/vendor/libgit2/src/util/pqueue.h +1 -1
  403. data/vendor/libgit2/src/util/process.h +223 -0
  404. data/vendor/libgit2/src/util/rand.c +1 -7
  405. data/vendor/libgit2/src/util/regexp.c +28 -13
  406. data/vendor/libgit2/src/util/regexp.h +7 -2
  407. data/vendor/libgit2/src/util/runtime.c +2 -2
  408. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  409. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  410. data/vendor/libgit2/src/util/str.c +20 -8
  411. data/vendor/libgit2/src/util/str.h +5 -3
  412. data/vendor/libgit2/src/util/strlist.c +108 -0
  413. data/vendor/libgit2/src/util/strlist.h +36 -0
  414. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  415. data/vendor/libgit2/src/util/unix/process.c +706 -0
  416. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  417. data/vendor/libgit2/src/util/util.c +18 -5
  418. data/vendor/libgit2/src/util/util.h +5 -38
  419. data/vendor/libgit2/src/util/vector.c +3 -3
  420. data/vendor/libgit2/src/util/vector.h +2 -2
  421. data/vendor/libgit2/src/util/win32/path_w32.c +81 -5
  422. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  423. data/vendor/libgit2/src/util/win32/process.c +522 -0
  424. metadata +102 -67
  425. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  426. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  427. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  428. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  429. data/vendor/libgit2/deps/pcre/CMakeLists.txt +0 -140
  430. data/vendor/libgit2/deps/pcre/COPYING +0 -5
  431. data/vendor/libgit2/deps/pcre/LICENCE +0 -93
  432. data/vendor/libgit2/deps/pcre/cmake/COPYING-CMAKE-SCRIPTS +0 -22
  433. data/vendor/libgit2/deps/pcre/cmake/FindEditline.cmake +0 -17
  434. data/vendor/libgit2/deps/pcre/cmake/FindPackageHandleStandardArgs.cmake +0 -58
  435. data/vendor/libgit2/deps/pcre/cmake/FindReadline.cmake +0 -29
  436. data/vendor/libgit2/deps/pcre/config.h.in +0 -57
  437. data/vendor/libgit2/deps/pcre/pcre.h +0 -641
  438. data/vendor/libgit2/deps/pcre/pcre_byte_order.c +0 -319
  439. data/vendor/libgit2/deps/pcre/pcre_compile.c +0 -9815
  440. data/vendor/libgit2/deps/pcre/pcre_config.c +0 -190
  441. data/vendor/libgit2/deps/pcre/pcre_exec.c +0 -7173
  442. data/vendor/libgit2/deps/pcre/pcre_fullinfo.c +0 -245
  443. data/vendor/libgit2/deps/pcre/pcre_get.c +0 -669
  444. data/vendor/libgit2/deps/pcre/pcre_globals.c +0 -86
  445. data/vendor/libgit2/deps/pcre/pcre_internal.h +0 -2787
  446. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +0 -11913
  447. data/vendor/libgit2/deps/pcre/pcre_maketables.c +0 -156
  448. data/vendor/libgit2/deps/pcre/pcre_printint.c +0 -834
  449. data/vendor/libgit2/deps/pcre/pcre_string_utils.c +0 -211
  450. data/vendor/libgit2/deps/pcre/pcre_study.c +0 -1686
  451. data/vendor/libgit2/deps/pcre/pcre_tables.c +0 -727
  452. data/vendor/libgit2/deps/pcre/pcre_ucd.c +0 -3644
  453. data/vendor/libgit2/deps/pcre/pcre_valid_utf8.c +0 -301
  454. data/vendor/libgit2/deps/pcre/pcre_version.c +0 -98
  455. data/vendor/libgit2/deps/pcre/pcre_xclass.c +0 -268
  456. data/vendor/libgit2/deps/pcre/pcreposix.c +0 -420
  457. data/vendor/libgit2/deps/pcre/pcreposix.h +0 -117
  458. data/vendor/libgit2/deps/pcre/ucp.h +0 -224
  459. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  460. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  461. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  462. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  463. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  464. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  465. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  466. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  467. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  468. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  469. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  470. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  471. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  472. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  473. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  474. data/vendor/libgit2/src/util/khash.h +0 -615
  475. data/vendor/libgit2/src/util/strmap.c +0 -100
  476. data/vendor/libgit2/src/util/strmap.h +0 -131
  477. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
@@ -32,7 +32,6 @@
32
32
  # endif
33
33
  #endif
34
34
 
35
- #include <mbedtls/config.h>
36
35
  #include <mbedtls/ssl.h>
37
36
  #include <mbedtls/error.h>
38
37
  #include <mbedtls/entropy.h>
@@ -40,12 +39,18 @@
40
39
 
41
40
  #undef inline
42
41
 
43
- #define GIT_SSL_DEFAULT_CIPHERS "TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-DSS-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-DSS-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256:TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA:TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA:TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384:TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384:TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA:TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-DSS-WITH-AES-128-CBC-SHA256:TLS-DHE-DSS-WITH-AES-256-CBC-SHA256:TLS-DHE-DSS-WITH-AES-128-CBC-SHA:TLS-DHE-DSS-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-AES-128-GCM-SHA256:TLS-RSA-WITH-AES-256-GCM-SHA384:TLS-RSA-WITH-AES-128-CBC-SHA256:TLS-RSA-WITH-AES-256-CBC-SHA256:TLS-RSA-WITH-AES-128-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA"
44
- #define GIT_SSL_DEFAULT_CIPHERS_COUNT 30
42
+ #define GIT_SSL_DEFAULT_CIPHERS "TLS1-3-AES-128-GCM-SHA256:TLS1-3-AES-256-GCM-SHA384:TLS1-3-CHACHA20-POLY1305-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256:TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-CHACHA20-POLY1305-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256:TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA:TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA:TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384:TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384:TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA:TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-RSA-WITH-AES-128-GCM-SHA256:TLS-RSA-WITH-AES-256-GCM-SHA384:TLS-RSA-WITH-AES-128-CBC-SHA256:TLS-RSA-WITH-AES-256-CBC-SHA256:TLS-RSA-WITH-AES-128-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA"
43
+ #define GIT_SSL_DEFAULT_CIPHERS_COUNT 28
45
44
 
46
- static mbedtls_ssl_config *git__ssl_conf;
47
45
  static int ciphers_list[GIT_SSL_DEFAULT_CIPHERS_COUNT];
48
- static mbedtls_entropy_context *mbedtls_entropy;
46
+
47
+ static bool initialized = false;
48
+ static mbedtls_ssl_config mbedtls_config;
49
+ static mbedtls_ctr_drbg_context mbedtls_rng;
50
+ static mbedtls_entropy_context mbedtls_entropy;
51
+
52
+ static bool has_ca_chain = false;
53
+ static mbedtls_x509_crt mbedtls_ca_chain;
49
54
 
50
55
  /**
51
56
  * This function aims to clean-up the SSL context which
@@ -53,19 +58,16 @@ static mbedtls_entropy_context *mbedtls_entropy;
53
58
  */
54
59
  static void shutdown_ssl(void)
55
60
  {
56
- if (git__ssl_conf) {
57
- mbedtls_x509_crt_free(git__ssl_conf->ca_chain);
58
- git__free(git__ssl_conf->ca_chain);
59
- mbedtls_ctr_drbg_free(git__ssl_conf->p_rng);
60
- git__free(git__ssl_conf->p_rng);
61
- mbedtls_ssl_config_free(git__ssl_conf);
62
- git__free(git__ssl_conf);
63
- git__ssl_conf = NULL;
61
+ if (has_ca_chain) {
62
+ mbedtls_x509_crt_free(&mbedtls_ca_chain);
63
+ has_ca_chain = false;
64
64
  }
65
- if (mbedtls_entropy) {
66
- mbedtls_entropy_free(mbedtls_entropy);
67
- git__free(mbedtls_entropy);
68
- mbedtls_entropy = NULL;
65
+
66
+ if (initialized) {
67
+ mbedtls_ctr_drbg_free(&mbedtls_rng);
68
+ mbedtls_ssl_config_free(&mbedtls_config);
69
+ mbedtls_entropy_free(&mbedtls_entropy);
70
+ initialized = false;
69
71
  }
70
72
  }
71
73
 
@@ -74,32 +76,33 @@ int git_mbedtls_stream_global_init(void)
74
76
  int loaded = 0;
75
77
  char *crtpath = GIT_DEFAULT_CERT_LOCATION;
76
78
  struct stat statbuf;
77
- mbedtls_ctr_drbg_context *ctr_drbg = NULL;
78
79
 
79
80
  size_t ciphers_known = 0;
80
81
  char *cipher_name = NULL;
81
82
  char *cipher_string = NULL;
82
83
  char *cipher_string_tmp = NULL;
83
84
 
84
- git__ssl_conf = git__malloc(sizeof(mbedtls_ssl_config));
85
- GIT_ERROR_CHECK_ALLOC(git__ssl_conf);
85
+ mbedtls_ssl_config_init(&mbedtls_config);
86
+ mbedtls_entropy_init(&mbedtls_entropy);
87
+ mbedtls_ctr_drbg_init(&mbedtls_rng);
86
88
 
87
- mbedtls_ssl_config_init(git__ssl_conf);
88
- if (mbedtls_ssl_config_defaults(git__ssl_conf,
89
- MBEDTLS_SSL_IS_CLIENT,
90
- MBEDTLS_SSL_TRANSPORT_STREAM,
91
- MBEDTLS_SSL_PRESET_DEFAULT) != 0) {
89
+ if (mbedtls_ssl_config_defaults(&mbedtls_config,
90
+ MBEDTLS_SSL_IS_CLIENT,
91
+ MBEDTLS_SSL_TRANSPORT_STREAM,
92
+ MBEDTLS_SSL_PRESET_DEFAULT) != 0) {
92
93
  git_error_set(GIT_ERROR_SSL, "failed to initialize mbedTLS");
93
94
  goto cleanup;
94
95
  }
95
96
 
96
- /* configure TLSv1 */
97
- mbedtls_ssl_conf_min_version(git__ssl_conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0);
97
+ /* configure TLSv1.1 or better */
98
+ #ifdef MBEDTLS_SSL_MINOR_VERSION_2
99
+ mbedtls_ssl_conf_min_version(&mbedtls_config, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_2);
100
+ #endif
98
101
 
99
102
  /* verify_server_cert is responsible for making the check.
100
103
  * OPTIONAL because REQUIRED drops the certificate as soon as the check
101
104
  * is made, so we can never see the certificate and override it. */
102
- mbedtls_ssl_conf_authmode(git__ssl_conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
105
+ mbedtls_ssl_conf_authmode(&mbedtls_config, MBEDTLS_SSL_VERIFY_OPTIONAL);
103
106
 
104
107
  /* set the list of allowed ciphersuites */
105
108
  ciphers_known = 0;
@@ -123,42 +126,33 @@ int git_mbedtls_stream_global_init(void)
123
126
  git_error_set(GIT_ERROR_SSL, "no cipher could be enabled");
124
127
  goto cleanup;
125
128
  }
126
- mbedtls_ssl_conf_ciphersuites(git__ssl_conf, ciphers_list);
129
+ mbedtls_ssl_conf_ciphersuites(&mbedtls_config, ciphers_list);
127
130
 
128
131
  /* Seeding the random number generator */
129
- mbedtls_entropy = git__malloc(sizeof(mbedtls_entropy_context));
130
- GIT_ERROR_CHECK_ALLOC(mbedtls_entropy);
131
-
132
- mbedtls_entropy_init(mbedtls_entropy);
133
-
134
- ctr_drbg = git__malloc(sizeof(mbedtls_ctr_drbg_context));
135
- GIT_ERROR_CHECK_ALLOC(ctr_drbg);
136
132
 
137
- mbedtls_ctr_drbg_init(ctr_drbg);
138
-
139
- if (mbedtls_ctr_drbg_seed(ctr_drbg,
140
- mbedtls_entropy_func,
141
- mbedtls_entropy, NULL, 0) != 0) {
133
+ if (mbedtls_ctr_drbg_seed(&mbedtls_rng, mbedtls_entropy_func,
134
+ &mbedtls_entropy, NULL, 0) != 0) {
142
135
  git_error_set(GIT_ERROR_SSL, "failed to initialize mbedTLS entropy pool");
143
136
  goto cleanup;
144
137
  }
145
138
 
146
- mbedtls_ssl_conf_rng(git__ssl_conf, mbedtls_ctr_drbg_random, ctr_drbg);
139
+ mbedtls_ssl_conf_rng(&mbedtls_config, mbedtls_ctr_drbg_random, &mbedtls_rng);
147
140
 
148
141
  /* load default certificates */
149
142
  if (crtpath != NULL && stat(crtpath, &statbuf) == 0 && S_ISREG(statbuf.st_mode))
150
143
  loaded = (git_mbedtls__set_cert_location(crtpath, NULL) == 0);
144
+
151
145
  if (!loaded && crtpath != NULL && stat(crtpath, &statbuf) == 0 && S_ISDIR(statbuf.st_mode))
152
146
  loaded = (git_mbedtls__set_cert_location(NULL, crtpath) == 0);
153
147
 
148
+ initialized = true;
149
+
154
150
  return git_runtime_shutdown_register(shutdown_ssl);
155
151
 
156
152
  cleanup:
157
- mbedtls_ctr_drbg_free(ctr_drbg);
158
- git__free(ctr_drbg);
159
- mbedtls_ssl_config_free(git__ssl_conf);
160
- git__free(git__ssl_conf);
161
- git__ssl_conf = NULL;
153
+ mbedtls_ctr_drbg_free(&mbedtls_rng);
154
+ mbedtls_ssl_config_free(&mbedtls_config);
155
+ mbedtls_entropy_free(&mbedtls_entropy);
162
156
 
163
157
  return -1;
164
158
  }
@@ -192,7 +186,7 @@ static int ssl_set_error(mbedtls_ssl_context *ssl, int error)
192
186
  break;
193
187
 
194
188
  case MBEDTLS_ERR_X509_CERT_VERIFY_FAILED:
195
- git_error_set(GIT_ERROR_SSL, "SSL error: %#04x [%x] - %s", error, ssl->session_negotiate->verify_result, errbuf);
189
+ git_error_set(GIT_ERROR_SSL, "SSL error: %#04x [%x] - %s", error, mbedtls_ssl_get_verify_result(ssl), errbuf);
196
190
  ret = GIT_ECERTIFICATE;
197
191
  break;
198
192
 
@@ -374,7 +368,7 @@ static int mbedtls_stream_wrap(
374
368
  st->ssl = git__malloc(sizeof(mbedtls_ssl_context));
375
369
  GIT_ERROR_CHECK_ALLOC(st->ssl);
376
370
  mbedtls_ssl_init(st->ssl);
377
- if (mbedtls_ssl_setup(st->ssl, git__ssl_conf)) {
371
+ if (mbedtls_ssl_setup(st->ssl, &mbedtls_config)) {
378
372
  git_error_set(GIT_ERROR_SSL, "failed to create ssl object");
379
373
  error = -1;
380
374
  goto out_err;
@@ -441,30 +435,30 @@ int git_mbedtls__set_cert_location(const char *file, const char *path)
441
435
  {
442
436
  int ret = 0;
443
437
  char errbuf[512];
444
- mbedtls_x509_crt *cacert;
445
438
 
446
439
  GIT_ASSERT_ARG(file || path);
447
440
 
448
- cacert = git__malloc(sizeof(mbedtls_x509_crt));
449
- GIT_ERROR_CHECK_ALLOC(cacert);
441
+ if (has_ca_chain)
442
+ mbedtls_x509_crt_free(&mbedtls_ca_chain);
443
+
444
+ mbedtls_x509_crt_init(&mbedtls_ca_chain);
450
445
 
451
- mbedtls_x509_crt_init(cacert);
452
446
  if (file)
453
- ret = mbedtls_x509_crt_parse_file(cacert, file);
447
+ ret = mbedtls_x509_crt_parse_file(&mbedtls_ca_chain, file);
448
+
454
449
  if (ret >= 0 && path)
455
- ret = mbedtls_x509_crt_parse_path(cacert, path);
450
+ ret = mbedtls_x509_crt_parse_path(&mbedtls_ca_chain, path);
451
+
456
452
  /* mbedtls_x509_crt_parse_path returns the number of invalid certs on success */
457
453
  if (ret < 0) {
458
- mbedtls_x509_crt_free(cacert);
459
- git__free(cacert);
454
+ mbedtls_x509_crt_free(&mbedtls_ca_chain);
460
455
  mbedtls_strerror( ret, errbuf, 512 );
461
456
  git_error_set(GIT_ERROR_SSL, "failed to load CA certificates: %#04x - %s", ret, errbuf);
462
457
  return -1;
463
458
  }
464
459
 
465
- mbedtls_x509_crt_free(git__ssl_conf->ca_chain);
466
- git__free(git__ssl_conf->ca_chain);
467
- mbedtls_ssl_conf_ca_chain(git__ssl_conf, cacert, NULL);
460
+ mbedtls_ssl_conf_ca_chain(&mbedtls_config, &mbedtls_ca_chain, NULL);
461
+ has_ca_chain = true;
468
462
 
469
463
  return 0;
470
464
  }
@@ -36,10 +36,11 @@
36
36
  # include <openssl/bio.h>
37
37
  #endif
38
38
 
39
- SSL_CTX *git__ssl_ctx;
39
+ extern char *git__ssl_ciphers;
40
40
 
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"
41
+ SSL_CTX *git__ssl_ctx;
42
42
 
43
+ #define GIT_SSL_DEFAULT_CIPHERS "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305: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:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA"
43
44
 
44
45
  static BIO_METHOD *git_stream_bio_method;
45
46
  static int init_bio_method(void);
@@ -105,7 +106,7 @@ static void git_openssl_free(void *mem)
105
106
  static int openssl_init(void)
106
107
  {
107
108
  long ssl_opts = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
108
- const char *ciphers = git_libgit2__ssl_ciphers();
109
+ const char *ciphers = git__ssl_ciphers;
109
110
  #ifdef VALGRIND
110
111
  static bool allocators_initialized = false;
111
112
  #endif
@@ -133,10 +134,10 @@ static int openssl_init(void)
133
134
  OPENSSL_init_ssl(0, NULL);
134
135
 
135
136
  /*
136
- * Load SSLv{2,3} and TLSv1 so that we can talk with servers
137
- * which use the SSL hellos, which are often used for
138
- * compatibility. We then disable SSL so we only allow OpenSSL
139
- * to speak TLSv1 to perform the encryption itself.
137
+ * Despite the name SSLv23_method, this is actually a version-
138
+ * flexible context, which honors the protocol versions
139
+ * specified in `ssl_opts`. So we only support TLSv1.0 and
140
+ * higher.
140
141
  */
141
142
  if (!(git__ssl_ctx = SSL_CTX_new(SSLv23_method())))
142
143
  goto error;
@@ -374,6 +375,7 @@ static int verify_server_cert(SSL *ssl, const char *host)
374
375
  struct in6_addr addr6;
375
376
  struct in_addr addr4;
376
377
  void *addr = NULL;
378
+ size_t addrlen = 0;
377
379
  int i = -1, j, error = 0;
378
380
 
379
381
  if (SSL_get_verify_result(ssl) != X509_V_OK) {
@@ -385,10 +387,12 @@ static int verify_server_cert(SSL *ssl, const char *host)
385
387
  if (p_inet_pton(AF_INET, host, &addr4)) {
386
388
  type = GEN_IPADD;
387
389
  addr = &addr4;
390
+ addrlen = sizeof(addr4);
388
391
  } else {
389
392
  if (p_inet_pton(AF_INET6, host, &addr6)) {
390
393
  type = GEN_IPADD;
391
394
  addr = &addr6;
395
+ addrlen = sizeof(addr6);
392
396
  }
393
397
  }
394
398
 
@@ -423,7 +427,7 @@ static int verify_server_cert(SSL *ssl, const char *host)
423
427
  matched = !!check_host_name(host, name);
424
428
  } else if (type == GEN_IPADD) {
425
429
  /* Here name isn't so much a name but a binary representation of the IP */
426
- matched = addr && !!memcmp(name, addr, namelen);
430
+ matched = (addr && namelen == addrlen && memcmp(name, addr, namelen) == 0);
427
431
  }
428
432
  }
429
433
  }
@@ -720,6 +724,30 @@ int git_openssl__set_cert_location(const char *file, const char *path)
720
724
  return 0;
721
725
  }
722
726
 
727
+ int git_openssl__add_x509_cert(X509 *cert)
728
+ {
729
+ X509_STORE *cert_store;
730
+
731
+ if (openssl_ensure_initialized() < 0)
732
+ return -1;
733
+
734
+ if (!(cert_store = SSL_CTX_get_cert_store(git__ssl_ctx)))
735
+ return -1;
736
+
737
+ if (cert && X509_STORE_add_cert(cert_store, cert) == 0) {
738
+ git_error_set(GIT_ERROR_SSL, "OpenSSL error: failed to add raw X509 certificate");
739
+ return -1;
740
+ }
741
+
742
+ return 0;
743
+ }
744
+
745
+ int git_openssl__reset_context(void)
746
+ {
747
+ shutdown_ssl();
748
+ return openssl_init();
749
+ }
750
+
723
751
  #else
724
752
 
725
753
  #include "stream.h"
@@ -24,6 +24,8 @@ extern int git_openssl_stream_global_init(void);
24
24
 
25
25
  #ifdef GIT_OPENSSL
26
26
  extern int git_openssl__set_cert_location(const char *file, const char *path);
27
+ extern int git_openssl__add_x509_cert(X509 *cert);
28
+ extern int git_openssl__reset_context(void);
27
29
  extern int git_openssl_stream_new(git_stream **out, const char *host, const char *port);
28
30
  extern int git_openssl_stream_wrap(git_stream **out, git_stream *in, const char *host);
29
31
  #endif
@@ -65,6 +65,7 @@ int (*SSL_write)(SSL *ssl, const void *buf, int num);
65
65
  long (*SSL_CTX_ctrl)(SSL_CTX *ctx, int cmd, long larg, void *parg);
66
66
  void (*SSL_CTX_free)(SSL_CTX *ctx);
67
67
  SSL_CTX *(*SSL_CTX_new)(const SSL_METHOD *method);
68
+ X509_STORE *(*SSL_CTX_get_cert_store)(const SSL_CTX *);
68
69
  int (*SSL_CTX_set_cipher_list)(SSL_CTX *ctx, const char *str);
69
70
  int (*SSL_CTX_set_default_verify_paths)(SSL_CTX *ctx);
70
71
  long (*SSL_CTX_set_options)(SSL_CTX *ctx, long options);
@@ -80,6 +81,7 @@ int (*X509_NAME_get_index_by_NID)(X509_NAME *name, int nid, int lastpos);
80
81
  void (*X509_free)(X509 *a);
81
82
  void *(*X509_get_ext_d2i)(const X509 *x, int nid, int *crit, int *idx);
82
83
  X509_NAME *(*X509_get_subject_name)(const X509 *x);
84
+ int (*X509_STORE_add_cert)(X509_STORE *ctx, X509 *x);
83
85
 
84
86
  int (*i2d_X509)(X509 *a, unsigned char **ppout);
85
87
 
@@ -194,6 +196,7 @@ int git_openssl_stream_dynamic_init(void)
194
196
  SSL_CTX_ctrl = (long (*)(SSL_CTX *, int, long, void *))openssl_sym(&err, "SSL_CTX_ctrl", true);
195
197
  SSL_CTX_free = (void (*)(SSL_CTX *))openssl_sym(&err, "SSL_CTX_free", true);
196
198
  SSL_CTX_new = (SSL_CTX *(*)(const SSL_METHOD *))openssl_sym(&err, "SSL_CTX_new", true);
199
+ SSL_CTX_get_cert_store = (X509_STORE *(*)(const SSL_CTX *))openssl_sym(&err, "SSL_CTX_get_cert_store", true);
197
200
  SSL_CTX_set_cipher_list = (int (*)(SSL_CTX *, const char *))openssl_sym(&err, "SSL_CTX_set_cipher_list", true);
198
201
  SSL_CTX_set_default_verify_paths = (int (*)(SSL_CTX *ctx))openssl_sym(&err, "SSL_CTX_set_default_verify_paths", true);
199
202
  SSL_CTX_set_options = (long (*)(SSL_CTX *, long))openssl_sym(&err, "SSL_CTX_set_options", false);
@@ -209,6 +212,7 @@ int git_openssl_stream_dynamic_init(void)
209
212
  X509_free = (void (*)(X509 *))openssl_sym(&err, "X509_free", true);
210
213
  X509_get_ext_d2i = (void *(*)(const X509 *x, int nid, int *crit, int *idx))openssl_sym(&err, "X509_get_ext_d2i", true);
211
214
  X509_get_subject_name = (X509_NAME *(*)(const X509 *))openssl_sym(&err, "X509_get_subject_name", true);
215
+ X509_STORE_add_cert = (int (*)(X509_STORE *ctx, X509 *x))openssl_sym(&err, "X509_STORE_add_cert", true);
212
216
 
213
217
  i2d_X509 = (int (*)(X509 *a, unsigned char **ppout))openssl_sym(&err, "i2d_X509", true);
214
218
 
@@ -204,6 +204,7 @@ typedef void SSL_METHOD;
204
204
  typedef void X509;
205
205
  typedef void X509_NAME;
206
206
  typedef void X509_NAME_ENTRY;
207
+ typedef void X509_STORE;
207
208
  typedef void X509_STORE_CTX;
208
209
 
209
210
  typedef struct {
@@ -309,6 +310,7 @@ extern int (*SSL_write)(SSL *ssl, const void *buf, int num);
309
310
  extern long (*SSL_CTX_ctrl)(SSL_CTX *ctx, int cmd, long larg, void *parg);
310
311
  extern void (*SSL_CTX_free)(SSL_CTX *ctx);
311
312
  extern SSL_CTX *(*SSL_CTX_new)(const SSL_METHOD *method);
313
+ extern X509_STORE *(*SSL_CTX_get_cert_store)(const SSL_CTX *ctx);
312
314
  extern int (*SSL_CTX_set_cipher_list)(SSL_CTX *ctx, const char *str);
313
315
  extern int (*SSL_CTX_set_default_verify_paths)(SSL_CTX *ctx);
314
316
  extern long (*SSL_CTX_set_options)(SSL_CTX *ctx, long options);
@@ -326,6 +328,7 @@ extern int (*X509_NAME_get_index_by_NID)(X509_NAME *name, int nid, int lastpos);
326
328
  extern void (*X509_free)(X509 *a);
327
329
  extern void *(*X509_get_ext_d2i)(const X509 *x, int nid, int *crit, int *idx);
328
330
  extern X509_NAME *(*X509_get_subject_name)(const X509 *x);
331
+ extern int (*X509_STORE_add_cert)(X509_STORE *ctx, X509 *x);
329
332
 
330
333
  extern int (*i2d_X509)(X509 *a, unsigned char **ppout);
331
334
 
@@ -20,6 +20,10 @@
20
20
  # include <netdb.h>
21
21
  # include <netinet/in.h>
22
22
  # include <arpa/inet.h>
23
+ # include <netinet/tcp.h>
24
+ # ifdef __APPLE__
25
+ # include <sys/socket.h>
26
+ # endif
23
27
  #else
24
28
  # include <winsock2.h>
25
29
  # include <ws2tcpip.h>
@@ -188,6 +192,32 @@ static int socket_connect(git_stream *stream)
188
192
  for (p = info; p != NULL; p = p->ai_next) {
189
193
  s = socket(p->ai_family, p->ai_socktype | SOCK_CLOEXEC, p->ai_protocol);
190
194
 
195
+ /* Enable TCP keepalive to detect dead connections */
196
+ if (s != INVALID_SOCKET && p->ai_family == AF_INET) {
197
+ int keepalive = 1;
198
+ if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE,
199
+ (const char *)&keepalive, sizeof(keepalive)) == 0) {
200
+ #ifdef __APPLE__
201
+ /* macOS: Set idle time to 60 seconds */
202
+ int keepidle = 60;
203
+ setsockopt(s, IPPROTO_TCP, TCP_KEEPALIVE,
204
+ &keepidle, sizeof(keepidle));
205
+ /* Note: TCP_CONNECTIONTIMEOUT (0x20) could also be set */
206
+ #elif defined(__linux__)
207
+ /* Linux: Set idle, interval, and count */
208
+ int keepidle = 60; /* Start probes after 60 seconds */
209
+ int keepintvl = 10; /* 10 seconds between probes */
210
+ int keepcnt = 3; /* 3 probes before giving up */
211
+ setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE,
212
+ &keepidle, sizeof(keepidle));
213
+ setsockopt(s, IPPROTO_TCP, TCP_KEEPINTVL,
214
+ &keepintvl, sizeof(keepintvl));
215
+ setsockopt(s, IPPROTO_TCP, TCP_KEEPCNT,
216
+ &keepcnt, sizeof(keepcnt));
217
+ #endif
218
+ }
219
+ }
220
+
191
221
  if (s == INVALID_SOCKET)
192
222
  continue;
193
223
 
@@ -13,13 +13,16 @@
13
13
  #include <Security/SecureTransport.h>
14
14
  #include <Security/SecCertificate.h>
15
15
 
16
+ #include "common.h"
17
+ #include "trace.h"
16
18
  #include "git2/transport.h"
17
-
18
19
  #include "streams/socket.h"
19
20
 
20
21
  static int stransport_error(OSStatus ret)
21
22
  {
22
- CFStringRef message;
23
+ CFStringRef message_ref = NULL;
24
+ const char *message_cstr = NULL;
25
+ char *message_ptr = NULL;
23
26
 
24
27
  if (ret == noErr || ret == errSSLClosedGraceful) {
25
28
  git_error_clear();
@@ -27,14 +30,39 @@ static int stransport_error(OSStatus ret)
27
30
  }
28
31
 
29
32
  #if !TARGET_OS_IPHONE
30
- message = SecCopyErrorMessageString(ret, NULL);
31
- GIT_ERROR_CHECK_ALLOC(message);
33
+ message_ref = SecCopyErrorMessageString(ret, NULL);
34
+ GIT_ERROR_CHECK_ALLOC(message_ref);
35
+
36
+ /*
37
+ * Attempt the cheap CFString conversion; this can return NULL
38
+ * when that would be expensive. In that case, call the more
39
+ * expensive function.
40
+ */
41
+ message_cstr = CFStringGetCStringPtr(message_ref, kCFStringEncodingUTF8);
42
+
43
+ if (!message_cstr) {
44
+ /* Provide buffer to convert from UTF16 to UTF8 */
45
+ size_t message_size = CFStringGetLength(message_ref) * 2 + 1;
46
+
47
+ message_cstr = message_ptr = git__malloc(message_size);
48
+ GIT_ERROR_CHECK_ALLOC(message_ptr);
49
+
50
+ if (!CFStringGetCString(message_ref, message_ptr, message_size, kCFStringEncodingUTF8)) {
51
+ git_error_set(GIT_ERROR_NET, "SecureTransport error: %d", (unsigned int)ret);
52
+ goto done;
53
+ }
54
+ }
32
55
 
33
- git_error_set(GIT_ERROR_NET, "SecureTransport error: %s", CFStringGetCStringPtr(message, kCFStringEncodingUTF8));
34
- CFRelease(message);
56
+ git_error_set(GIT_ERROR_NET, "SecureTransport error: %s", message_cstr);
57
+
58
+ done:
59
+ git__free(message_ptr);
60
+ CFRelease(message_ref);
35
61
  #else
36
62
  git_error_set(GIT_ERROR_NET, "SecureTransport error: OSStatus %d", (unsigned int)ret);
37
- GIT_UNUSED(message);
63
+ GIT_UNUSED(message_ref);
64
+ GIT_UNUSED(message_cstr);
65
+ GIT_UNUSED(message_ptr);
38
66
  #endif
39
67
 
40
68
  return -1;
@@ -236,6 +264,10 @@ static ssize_t stransport_read(git_stream *stream, void *data, size_t len)
236
264
  OSStatus ret;
237
265
 
238
266
  if ((ret = SSLRead(st->ctx, data, len, &processed)) != noErr) {
267
+ /* This specific SecureTransport error is not well described */
268
+ if (ret == -9806)
269
+ git_trace(GIT_TRACE_INFO, "SecureTraceport error during SSLRead: returned -9806 (connection closed via error)");
270
+
239
271
  if (st->error == GIT_TIMEOUT)
240
272
  return GIT_TIMEOUT;
241
273