rugged 1.7.2 → 1.9.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.
Files changed (361) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rugged/version.rb +1 -1
  3. data/vendor/libgit2/AUTHORS +1 -0
  4. data/vendor/libgit2/CMakeLists.txt +23 -10
  5. data/vendor/libgit2/COPYING +195 -1
  6. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  7. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  8. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
  9. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  10. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
  11. data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
  12. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  13. data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
  14. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  15. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  16. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  17. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  18. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  19. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  20. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  21. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  22. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  23. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  24. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  25. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  26. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  27. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  28. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  29. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  30. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  31. data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
  32. data/vendor/libgit2/deps/xdiff/xmerge.c +2 -2
  33. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  34. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  35. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  36. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  37. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  38. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  39. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  40. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  41. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  42. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  43. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  44. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  45. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  46. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  47. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  48. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  49. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  50. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  51. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  52. data/vendor/libgit2/include/git2/apply.h +27 -6
  53. data/vendor/libgit2/include/git2/attr.h +17 -4
  54. data/vendor/libgit2/include/git2/blame.h +133 -28
  55. data/vendor/libgit2/include/git2/blob.h +71 -28
  56. data/vendor/libgit2/include/git2/branch.h +22 -15
  57. data/vendor/libgit2/include/git2/buffer.h +6 -4
  58. data/vendor/libgit2/include/git2/cert.h +2 -1
  59. data/vendor/libgit2/include/git2/checkout.h +83 -32
  60. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  61. data/vendor/libgit2/include/git2/clone.h +25 -9
  62. data/vendor/libgit2/include/git2/commit.h +132 -3
  63. data/vendor/libgit2/include/git2/common.h +120 -63
  64. data/vendor/libgit2/include/git2/config.h +93 -23
  65. data/vendor/libgit2/include/git2/credential.h +30 -2
  66. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  67. data/vendor/libgit2/include/git2/deprecated.h +133 -3
  68. data/vendor/libgit2/include/git2/describe.h +13 -1
  69. data/vendor/libgit2/include/git2/diff.h +38 -8
  70. data/vendor/libgit2/include/git2/email.h +9 -29
  71. data/vendor/libgit2/include/git2/errors.h +46 -73
  72. data/vendor/libgit2/include/git2/filter.h +14 -7
  73. data/vendor/libgit2/include/git2/global.h +8 -1
  74. data/vendor/libgit2/include/git2/graph.h +3 -2
  75. data/vendor/libgit2/include/git2/ignore.h +10 -0
  76. data/vendor/libgit2/include/git2/index.h +99 -14
  77. data/vendor/libgit2/include/git2/indexer.h +21 -4
  78. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  79. data/vendor/libgit2/include/git2/merge.h +46 -1
  80. data/vendor/libgit2/include/git2/message.h +2 -2
  81. data/vendor/libgit2/include/git2/net.h +3 -1
  82. data/vendor/libgit2/include/git2/notes.h +9 -6
  83. data/vendor/libgit2/include/git2/object.h +9 -8
  84. data/vendor/libgit2/include/git2/odb.h +91 -49
  85. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  86. data/vendor/libgit2/include/git2/oid.h +23 -24
  87. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  88. data/vendor/libgit2/include/git2/pack.h +13 -1
  89. data/vendor/libgit2/include/git2/patch.h +2 -3
  90. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  91. data/vendor/libgit2/include/git2/proxy.h +10 -0
  92. data/vendor/libgit2/include/git2/rebase.h +9 -6
  93. data/vendor/libgit2/include/git2/refdb.h +2 -2
  94. data/vendor/libgit2/include/git2/reflog.h +3 -2
  95. data/vendor/libgit2/include/git2/refs.h +9 -6
  96. data/vendor/libgit2/include/git2/refspec.h +14 -4
  97. data/vendor/libgit2/include/git2/remote.h +94 -18
  98. data/vendor/libgit2/include/git2/repository.h +57 -21
  99. data/vendor/libgit2/include/git2/reset.h +16 -3
  100. data/vendor/libgit2/include/git2/revert.h +9 -4
  101. data/vendor/libgit2/include/git2/revparse.h +3 -3
  102. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  103. data/vendor/libgit2/include/git2/signature.h +46 -1
  104. data/vendor/libgit2/include/git2/stash.h +17 -3
  105. data/vendor/libgit2/include/git2/status.h +10 -6
  106. data/vendor/libgit2/include/git2/stdint.h +87 -85
  107. data/vendor/libgit2/include/git2/strarray.h +2 -3
  108. data/vendor/libgit2/include/git2/submodule.h +20 -9
  109. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  110. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  111. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  112. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  113. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  114. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  115. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  116. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  117. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  118. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  119. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  120. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  121. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  122. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  123. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  124. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  125. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  126. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  127. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  128. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  129. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  130. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  131. data/vendor/libgit2/include/git2/sys/transport.h +24 -3
  132. data/vendor/libgit2/include/git2/tag.h +3 -1
  133. data/vendor/libgit2/include/git2/trace.h +9 -3
  134. data/vendor/libgit2/include/git2/transaction.h +3 -2
  135. data/vendor/libgit2/include/git2/transport.h +11 -3
  136. data/vendor/libgit2/include/git2/tree.h +16 -5
  137. data/vendor/libgit2/include/git2/types.h +19 -3
  138. data/vendor/libgit2/include/git2/version.h +44 -8
  139. data/vendor/libgit2/include/git2/worktree.h +16 -6
  140. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  141. data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
  142. data/vendor/libgit2/src/cli/cmd.c +1 -1
  143. data/vendor/libgit2/src/cli/cmd.h +4 -0
  144. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  145. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  146. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  147. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  148. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  149. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  150. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  151. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  152. data/vendor/libgit2/src/cli/common.c +168 -0
  153. data/vendor/libgit2/src/cli/common.h +63 -0
  154. data/vendor/libgit2/src/cli/error.h +1 -1
  155. data/vendor/libgit2/src/cli/main.c +52 -24
  156. data/vendor/libgit2/src/cli/opt.c +29 -3
  157. data/vendor/libgit2/src/cli/opt.h +21 -3
  158. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  159. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  160. data/vendor/libgit2/src/cli/progress.c +51 -2
  161. data/vendor/libgit2/src/cli/progress.h +12 -0
  162. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  163. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  164. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  165. data/vendor/libgit2/src/libgit2/CMakeLists.txt +26 -8
  166. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  167. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  168. data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
  169. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  170. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  171. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  172. data/vendor/libgit2/src/libgit2/blame.c +130 -44
  173. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  174. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  175. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  176. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  177. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  178. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  179. data/vendor/libgit2/src/libgit2/clone.c +186 -166
  180. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  181. data/vendor/libgit2/src/libgit2/commit.c +92 -0
  182. data/vendor/libgit2/src/libgit2/commit_graph.c +67 -56
  183. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  184. data/vendor/libgit2/src/libgit2/config.c +389 -298
  185. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  186. data/vendor/libgit2/src/libgit2/config.h +9 -4
  187. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  188. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  189. data/vendor/libgit2/src/libgit2/config_file.c +99 -88
  190. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  191. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  192. data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
  193. data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
  194. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  195. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  196. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  197. data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
  198. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  199. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  200. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  201. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  202. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  203. data/vendor/libgit2/src/libgit2/email.c +1 -0
  204. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  205. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  206. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  207. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  208. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  209. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  210. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  211. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  212. data/vendor/libgit2/src/libgit2/index.c +68 -90
  213. data/vendor/libgit2/src/libgit2/index.h +2 -2
  214. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  215. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  216. data/vendor/libgit2/src/libgit2/indexer.c +34 -38
  217. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  218. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  219. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  220. data/vendor/libgit2/src/libgit2/merge.c +42 -37
  221. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  222. data/vendor/libgit2/src/libgit2/midx.c +28 -15
  223. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  224. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  225. data/vendor/libgit2/src/libgit2/object.c +6 -5
  226. data/vendor/libgit2/src/libgit2/odb.c +5 -4
  227. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  228. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  229. data/vendor/libgit2/src/libgit2/oid.c +32 -5
  230. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  231. data/vendor/libgit2/src/libgit2/pack-objects.c +58 -31
  232. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  233. data/vendor/libgit2/src/libgit2/pack.c +30 -24
  234. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  235. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  236. data/vendor/libgit2/src/libgit2/path.c +1 -1
  237. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  238. data/vendor/libgit2/src/libgit2/push.c +79 -28
  239. data/vendor/libgit2/src/libgit2/push.h +1 -0
  240. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  241. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  242. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  243. data/vendor/libgit2/src/libgit2/refs.c +26 -7
  244. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  245. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  246. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  247. data/vendor/libgit2/src/libgit2/remote.c +121 -61
  248. data/vendor/libgit2/src/libgit2/repository.c +231 -51
  249. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  250. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  251. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  252. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  253. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  254. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  255. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  256. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  257. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  258. data/vendor/libgit2/src/libgit2/status.c +1 -1
  259. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  260. data/vendor/libgit2/src/libgit2/streams/openssl.c +32 -7
  261. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  262. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  263. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  264. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  265. data/vendor/libgit2/src/libgit2/submodule.c +106 -63
  266. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  267. data/vendor/libgit2/src/libgit2/tag.c +1 -1
  268. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  269. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  270. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  271. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  272. data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
  273. data/vendor/libgit2/src/libgit2/transports/http.c +1 -2
  274. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  275. data/vendor/libgit2/src/libgit2/transports/httpclient.c +112 -72
  276. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  277. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  278. data/vendor/libgit2/src/libgit2/transports/local.c +8 -7
  279. data/vendor/libgit2/src/libgit2/transports/smart.c +20 -8
  280. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  281. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +2 -2
  282. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  283. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  284. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  285. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  286. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  287. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  288. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  289. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  290. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  291. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  292. data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
  293. data/vendor/libgit2/src/util/alloc.c +4 -1
  294. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  295. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  296. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  297. data/vendor/libgit2/src/util/array.h +18 -17
  298. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  299. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  300. data/vendor/libgit2/src/util/date.c +22 -14
  301. data/vendor/libgit2/src/util/date.h +12 -0
  302. data/vendor/libgit2/src/util/errors.c +401 -0
  303. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  304. data/vendor/libgit2/src/util/fs_path.c +15 -4
  305. data/vendor/libgit2/src/util/fs_path.h +23 -0
  306. data/vendor/libgit2/src/util/futils.c +6 -5
  307. data/vendor/libgit2/src/util/futils.h +13 -4
  308. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  309. data/vendor/libgit2/src/util/git2_util.h +6 -0
  310. data/vendor/libgit2/src/util/hash/openssl.c +152 -0
  311. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  312. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  313. data/vendor/libgit2/src/util/hashmap.h +424 -0
  314. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  315. data/vendor/libgit2/src/util/integer.h +3 -1
  316. data/vendor/libgit2/src/util/net.c +13 -7
  317. data/vendor/libgit2/src/util/net.h +2 -0
  318. data/vendor/libgit2/src/util/pool.c +1 -1
  319. data/vendor/libgit2/src/util/pool.h +5 -0
  320. data/vendor/libgit2/src/util/pqueue.h +1 -1
  321. data/vendor/libgit2/src/util/process.h +222 -0
  322. data/vendor/libgit2/src/util/rand.c +1 -7
  323. data/vendor/libgit2/src/util/regexp.c +1 -1
  324. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  325. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  326. data/vendor/libgit2/src/util/str.c +2 -2
  327. data/vendor/libgit2/src/util/strlist.c +108 -0
  328. data/vendor/libgit2/src/util/strlist.h +36 -0
  329. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  330. data/vendor/libgit2/src/util/unix/process.c +629 -0
  331. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  332. data/vendor/libgit2/src/util/util.c +2 -2
  333. data/vendor/libgit2/src/util/util.h +4 -38
  334. data/vendor/libgit2/src/util/vector.c +3 -3
  335. data/vendor/libgit2/src/util/vector.h +2 -2
  336. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  337. data/vendor/libgit2/src/util/win32/process.c +506 -0
  338. metadata +45 -28
  339. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  340. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  341. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  342. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  343. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  344. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  345. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  346. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  347. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  348. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  349. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  350. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  351. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  352. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  353. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  354. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  355. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  356. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  357. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  358. data/vendor/libgit2/src/util/khash.h +0 -615
  359. data/vendor/libgit2/src/util/strmap.c +0 -100
  360. data/vendor/libgit2/src/util/strmap.h +0 -131
  361. /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;
@@ -720,6 +721,30 @@ int git_openssl__set_cert_location(const char *file, const char *path)
720
721
  return 0;
721
722
  }
722
723
 
724
+ int git_openssl__add_x509_cert(X509 *cert)
725
+ {
726
+ X509_STORE *cert_store;
727
+
728
+ if (openssl_ensure_initialized() < 0)
729
+ return -1;
730
+
731
+ if (!(cert_store = SSL_CTX_get_cert_store(git__ssl_ctx)))
732
+ return -1;
733
+
734
+ if (cert && X509_STORE_add_cert(cert_store, cert) == 0) {
735
+ git_error_set(GIT_ERROR_SSL, "OpenSSL error: failed to add raw X509 certificate");
736
+ return -1;
737
+ }
738
+
739
+ return 0;
740
+ }
741
+
742
+ int git_openssl__reset_context(void)
743
+ {
744
+ shutdown_ssl();
745
+ return openssl_init();
746
+ }
747
+
723
748
  #else
724
749
 
725
750
  #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
 
@@ -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