rugged 0.24.0 → 0.24.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +20 -9
- data/vendor/libgit2/deps/http-parser/http_parser.c +5 -2
- data/vendor/libgit2/include/git2/checkout.h +7 -0
- data/vendor/libgit2/include/git2/common.h +16 -1
- data/vendor/libgit2/include/git2/version.h +2 -2
- data/vendor/libgit2/src/array.h +40 -0
- data/vendor/libgit2/src/blame.c +8 -3
- data/vendor/libgit2/src/blame_git.c +20 -9
- data/vendor/libgit2/src/checkout.c +13 -5
- data/vendor/libgit2/src/commit.c +5 -4
- data/vendor/libgit2/src/common.h +1 -1
- data/vendor/libgit2/src/config_cache.c +2 -1
- data/vendor/libgit2/src/config_file.c +14 -20
- data/vendor/libgit2/src/delta-apply.c +36 -5
- data/vendor/libgit2/src/delta-apply.h +12 -0
- data/vendor/libgit2/src/describe.c +2 -1
- data/vendor/libgit2/src/diff_tform.c +5 -3
- data/vendor/libgit2/src/filebuf.c +6 -1
- data/vendor/libgit2/src/global.c +28 -8
- data/vendor/libgit2/src/global.h +1 -0
- data/vendor/libgit2/src/ignore.c +56 -19
- data/vendor/libgit2/src/index.c +27 -8
- data/vendor/libgit2/src/indexer.c +11 -7
- data/vendor/libgit2/src/iterator.c +2 -2
- data/vendor/libgit2/src/merge.c +1 -0
- data/vendor/libgit2/src/mwindow.c +20 -21
- data/vendor/libgit2/src/mwindow.h +1 -2
- data/vendor/libgit2/src/object.c +3 -6
- data/vendor/libgit2/src/odb.c +11 -15
- data/vendor/libgit2/src/odb.h +2 -1
- data/vendor/libgit2/src/odb_loose.c +13 -9
- data/vendor/libgit2/src/odb_pack.c +5 -6
- data/vendor/libgit2/src/oid.h +9 -0
- data/vendor/libgit2/src/openssl_stream.c +60 -27
- data/vendor/libgit2/src/openssl_stream.h +106 -0
- data/vendor/libgit2/src/pack-objects.c +4 -2
- data/vendor/libgit2/src/pack.c +10 -14
- data/vendor/libgit2/src/posix.c +7 -0
- data/vendor/libgit2/src/posix.h +1 -0
- data/vendor/libgit2/src/push.c +6 -6
- data/vendor/libgit2/src/refdb_fs.c +1 -0
- data/vendor/libgit2/src/refs.c +3 -0
- data/vendor/libgit2/src/refspec.c +4 -2
- data/vendor/libgit2/src/remote.c +15 -5
- data/vendor/libgit2/src/repository.c +29 -21
- data/vendor/libgit2/src/settings.c +23 -1
- data/vendor/libgit2/src/stransport_stream.c +15 -9
- data/vendor/libgit2/src/submodule.c +3 -2
- data/vendor/libgit2/src/sysdir.c +41 -47
- data/vendor/libgit2/src/sysdir.h +0 -5
- data/vendor/libgit2/src/tag.c +8 -2
- data/vendor/libgit2/src/thread-utils.h +5 -51
- data/vendor/libgit2/src/transport.c +2 -0
- data/vendor/libgit2/src/transports/http.c +2 -1
- data/vendor/libgit2/src/transports/smart_pkt.c +1 -0
- data/vendor/libgit2/src/transports/smart_protocol.c +72 -17
- data/vendor/libgit2/src/transports/ssh.c +32 -17
- data/vendor/libgit2/src/tree.c +83 -100
- data/vendor/libgit2/src/tree.h +4 -5
- data/vendor/libgit2/src/unix/map.c +5 -0
- data/vendor/libgit2/src/unix/pthread.h +54 -0
- data/vendor/libgit2/src/util.c +3 -3
- data/vendor/libgit2/src/win32/map.c +24 -5
- data/vendor/libgit2/src/win32/precompiled.h +1 -1
- data/vendor/libgit2/src/win32/{pthread.c → thread.c} +50 -80
- data/vendor/libgit2/src/win32/thread.h +62 -0
- data/vendor/libgit2/src/xdiff/xprepare.c +2 -1
- metadata +384 -394
- data/vendor/libgit2/src/win32/pthread.h +0 -92
@@ -458,7 +458,7 @@ static int tree_iterator__set_next(tree_iterator *ti, tree_iterator_frame *tf)
|
|
458
458
|
/* try to load trees for items in [current,next) range */
|
459
459
|
if (!error && git_tree_entry__is_tree(te))
|
460
460
|
error = git_tree_lookup(
|
461
|
-
&tf->entries[tf->next]->tree, ti->base.repo,
|
461
|
+
&tf->entries[tf->next]->tree, ti->base.repo, te->oid);
|
462
462
|
}
|
463
463
|
|
464
464
|
if (tf->next > tf->current + 1)
|
@@ -603,7 +603,7 @@ static int tree_iterator__update_entry(tree_iterator *ti)
|
|
603
603
|
te = tf->entries[tf->current]->te;
|
604
604
|
|
605
605
|
ti->entry.mode = te->attr;
|
606
|
-
git_oid_cpy(&ti->entry.id,
|
606
|
+
git_oid_cpy(&ti->entry.id, te->oid);
|
607
607
|
|
608
608
|
ti->entry.path = tree_iterator__current_filename(ti, te);
|
609
609
|
GITERR_CHECK_ALLOC(ti->entry.path);
|
data/vendor/libgit2/src/merge.c
CHANGED
@@ -2730,6 +2730,7 @@ static int merge_check_workdir(size_t *conflicts, git_repository *repo, git_inde
|
|
2730
2730
|
opts.flags |= GIT_DIFF_DISABLE_PATHSPEC_MATCH;
|
2731
2731
|
opts.pathspec.count = merged_paths->length;
|
2732
2732
|
opts.pathspec.strings = (char **)merged_paths->contents;
|
2733
|
+
opts.ignore_submodules = GIT_SUBMODULE_IGNORE_ALL;
|
2733
2734
|
|
2734
2735
|
if ((error = git_diff_index_to_workdir(&wd_diff_list, repo, NULL, &opts)) < 0)
|
2735
2736
|
goto done;
|
@@ -33,25 +33,20 @@ static git_mwindow_ctl mem_ctl;
|
|
33
33
|
/* Global list of mwindow files, to open packs once across repos */
|
34
34
|
git_strmap *git__pack_cache = NULL;
|
35
35
|
|
36
|
-
|
37
|
-
* Run under mwindow lock
|
38
|
-
*/
|
39
|
-
int git_mwindow_files_init(void)
|
36
|
+
static void git_mwindow_files_free(void)
|
40
37
|
{
|
41
|
-
|
42
|
-
return 0;
|
43
|
-
|
44
|
-
git__on_shutdown(git_mwindow_files_free);
|
38
|
+
git_strmap *tmp = git__pack_cache;
|
45
39
|
|
46
|
-
|
40
|
+
git__pack_cache = NULL;
|
41
|
+
git_strmap_free(tmp);
|
47
42
|
}
|
48
43
|
|
49
|
-
|
44
|
+
int git_mwindow_global_init(void)
|
50
45
|
{
|
51
|
-
|
46
|
+
assert(!git__pack_cache);
|
52
47
|
|
53
|
-
|
54
|
-
|
48
|
+
git__on_shutdown(git_mwindow_files_free);
|
49
|
+
return git_strmap_alloc(&git__pack_cache);
|
55
50
|
}
|
56
51
|
|
57
52
|
int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
|
@@ -69,12 +64,6 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
|
|
69
64
|
return -1;
|
70
65
|
}
|
71
66
|
|
72
|
-
if (git_mwindow_files_init() < 0) {
|
73
|
-
git_mutex_unlock(&git__mwindow_mutex);
|
74
|
-
git__free(packname);
|
75
|
-
return -1;
|
76
|
-
}
|
77
|
-
|
78
67
|
pos = git_strmap_lookup_index(git__pack_cache, packname);
|
79
68
|
git__free(packname);
|
80
69
|
|
@@ -296,8 +285,18 @@ static git_mwindow *new_window(
|
|
296
285
|
*/
|
297
286
|
|
298
287
|
if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < 0) {
|
299
|
-
|
300
|
-
|
288
|
+
/*
|
289
|
+
* The first error might be down to memory fragmentation even if
|
290
|
+
* we're below our soft limits, so free up what we can and try again.
|
291
|
+
*/
|
292
|
+
|
293
|
+
while (git_mwindow_close_lru(mwf) == 0)
|
294
|
+
/* nop */;
|
295
|
+
|
296
|
+
if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < 0) {
|
297
|
+
git__free(w);
|
298
|
+
return NULL;
|
299
|
+
}
|
301
300
|
}
|
302
301
|
|
303
302
|
ctl->mmap_calls++;
|
@@ -43,8 +43,7 @@ int git_mwindow_file_register(git_mwindow_file *mwf);
|
|
43
43
|
void git_mwindow_file_deregister(git_mwindow_file *mwf);
|
44
44
|
void git_mwindow_close(git_mwindow **w_cursor);
|
45
45
|
|
46
|
-
int
|
47
|
-
void git_mwindow_files_free(void);
|
46
|
+
extern int git_mwindow_global_init(void);
|
48
47
|
|
49
48
|
struct git_pack_file; /* just declaration to avoid cyclical includes */
|
50
49
|
int git_mwindow_get_pack(struct git_pack_file **out, const char *path);
|
data/vendor/libgit2/src/object.c
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
#include "commit.h"
|
13
13
|
#include "tree.h"
|
14
14
|
#include "blob.h"
|
15
|
+
#include "oid.h"
|
15
16
|
#include "tag.h"
|
16
17
|
|
17
18
|
bool git_object__strict_input_validation = true;
|
@@ -166,13 +167,9 @@ int git_object_lookup_prefix(
|
|
166
167
|
error = git_odb_read(&odb_obj, odb, id);
|
167
168
|
}
|
168
169
|
} else {
|
169
|
-
git_oid short_oid;
|
170
|
+
git_oid short_oid = {{ 0 }};
|
170
171
|
|
171
|
-
|
172
|
-
memcpy(short_oid.id, id->id, (len + 1) / 2);
|
173
|
-
if (len % 2)
|
174
|
-
short_oid.id[len / 2] &= 0xF0;
|
175
|
-
memset(short_oid.id + (len + 1) / 2, 0, (GIT_OID_HEXSZ - len) / 2);
|
172
|
+
git_oid__cpy_prefix(&short_oid, id, len);
|
176
173
|
|
177
174
|
/* If len < GIT_OID_HEXSZ (a strict short oid was given), we have
|
178
175
|
* 2 options :
|
data/vendor/libgit2/src/odb.c
CHANGED
@@ -725,7 +725,8 @@ int git_odb_exists_prefix(
|
|
725
725
|
git_oid_cpy(out, short_id);
|
726
726
|
return 0;
|
727
727
|
} else {
|
728
|
-
return git_odb__error_notfound(
|
728
|
+
return git_odb__error_notfound(
|
729
|
+
"no match for id prefix", short_id, len);
|
729
730
|
}
|
730
731
|
}
|
731
732
|
|
@@ -740,7 +741,7 @@ int git_odb_exists_prefix(
|
|
740
741
|
error = odb_exists_prefix_1(out, db, &key, len, true);
|
741
742
|
|
742
743
|
if (error == GIT_ENOTFOUND)
|
743
|
-
return git_odb__error_notfound("no match for id prefix", &key);
|
744
|
+
return git_odb__error_notfound("no match for id prefix", &key, len);
|
744
745
|
|
745
746
|
return error;
|
746
747
|
}
|
@@ -802,19 +803,12 @@ int git_odb__read_header_or_object(
|
|
802
803
|
return 0;
|
803
804
|
}
|
804
805
|
|
805
|
-
static git_oid empty_blob = {{ 0xe6, 0x9d, 0xe2, 0x9b, 0xb2, 0xd1, 0xd6, 0x43, 0x4b, 0x8b,
|
806
|
-
0x29, 0xae, 0x77, 0x5a, 0xd8, 0xc2, 0xe4, 0x8c, 0x53, 0x91 }};
|
807
806
|
static git_oid empty_tree = {{ 0x4b, 0x82, 0x5d, 0xc6, 0x42, 0xcb, 0x6e, 0xb9, 0xa0, 0x60,
|
808
807
|
0xe5, 0x4b, 0xf8, 0xd6, 0x92, 0x88, 0xfb, 0xee, 0x49, 0x04 }};
|
809
808
|
|
810
809
|
static int hardcoded_objects(git_rawobj *raw, const git_oid *id)
|
811
810
|
{
|
812
|
-
if (!git_oid_cmp(id, &
|
813
|
-
raw->type = GIT_OBJ_BLOB;
|
814
|
-
raw->len = 0;
|
815
|
-
raw->data = git__calloc(1, sizeof(uint8_t));
|
816
|
-
return 0;
|
817
|
-
} else if (!git_oid_cmp(id, &empty_tree)) {
|
811
|
+
if (!git_oid_cmp(id, &empty_tree)) {
|
818
812
|
raw->type = GIT_OBJ_TREE;
|
819
813
|
raw->len = 0;
|
820
814
|
raw->data = git__calloc(1, sizeof(uint8_t));
|
@@ -881,7 +875,7 @@ int git_odb_read(git_odb_object **out, git_odb *db, const git_oid *id)
|
|
881
875
|
error = odb_read_1(out, db, id, true);
|
882
876
|
|
883
877
|
if (error == GIT_ENOTFOUND)
|
884
|
-
return git_odb__error_notfound("no match for id", id);
|
878
|
+
return git_odb__error_notfound("no match for id", id, GIT_OID_HEXSZ);
|
885
879
|
|
886
880
|
return error;
|
887
881
|
}
|
@@ -967,7 +961,7 @@ int git_odb_read_prefix(
|
|
967
961
|
error = read_prefix_1(out, db, &key, len, true);
|
968
962
|
|
969
963
|
if (error == GIT_ENOTFOUND)
|
970
|
-
return git_odb__error_notfound("no match for prefix", &key);
|
964
|
+
return git_odb__error_notfound("no match for prefix", &key, len);
|
971
965
|
|
972
966
|
return error;
|
973
967
|
}
|
@@ -1223,12 +1217,14 @@ int git_odb_refresh(struct git_odb *db)
|
|
1223
1217
|
return 0;
|
1224
1218
|
}
|
1225
1219
|
|
1226
|
-
int git_odb__error_notfound(
|
1220
|
+
int git_odb__error_notfound(
|
1221
|
+
const char *message, const git_oid *oid, size_t oid_len)
|
1227
1222
|
{
|
1228
1223
|
if (oid != NULL) {
|
1229
1224
|
char oid_str[GIT_OID_HEXSZ + 1];
|
1230
|
-
git_oid_tostr(oid_str,
|
1231
|
-
giterr_set(GITERR_ODB, "Object not found - %s (
|
1225
|
+
git_oid_tostr(oid_str, oid_len+1, oid);
|
1226
|
+
giterr_set(GITERR_ODB, "Object not found - %s (%.*s)",
|
1227
|
+
message, oid_len, oid_str);
|
1232
1228
|
} else
|
1233
1229
|
giterr_set(GITERR_ODB, "Object not found - %s", message);
|
1234
1230
|
|
data/vendor/libgit2/src/odb.h
CHANGED
@@ -82,7 +82,8 @@ int git_odb__hashlink(git_oid *out, const char *path);
|
|
82
82
|
/*
|
83
83
|
* Generate a GIT_ENOTFOUND error for the ODB.
|
84
84
|
*/
|
85
|
-
int git_odb__error_notfound(
|
85
|
+
int git_odb__error_notfound(
|
86
|
+
const char *message, const git_oid *oid, size_t oid_len);
|
86
87
|
|
87
88
|
/*
|
88
89
|
* Generate a GIT_EAMBIGUOUS error for the ODB.
|
@@ -91,7 +91,7 @@ static int object_mkdir(const git_buf *name, const loose_backend *be)
|
|
91
91
|
|
92
92
|
static size_t get_binary_object_header(obj_hdr *hdr, git_buf *obj)
|
93
93
|
{
|
94
|
-
unsigned
|
94
|
+
unsigned long c;
|
95
95
|
unsigned char *data = (unsigned char *)obj->ptr;
|
96
96
|
size_t shift, size, used = 0;
|
97
97
|
|
@@ -547,7 +547,8 @@ static int locate_object_short_oid(
|
|
547
547
|
|
548
548
|
/* Check that directory exists */
|
549
549
|
if (git_path_isdir(object_location->ptr) == false)
|
550
|
-
return git_odb__error_notfound("no matching loose object for prefix",
|
550
|
+
return git_odb__error_notfound("no matching loose object for prefix",
|
551
|
+
short_oid, len);
|
551
552
|
|
552
553
|
state.dir_len = git_buf_len(object_location);
|
553
554
|
state.short_oid_len = len;
|
@@ -560,7 +561,8 @@ static int locate_object_short_oid(
|
|
560
561
|
return error;
|
561
562
|
|
562
563
|
if (!state.found)
|
563
|
-
return git_odb__error_notfound("no matching loose object for prefix",
|
564
|
+
return git_odb__error_notfound("no matching loose object for prefix",
|
565
|
+
short_oid, len);
|
564
566
|
|
565
567
|
if (state.found > 1)
|
566
568
|
return git_odb__error_ambiguous("multiple matches in loose objects");
|
@@ -613,9 +615,10 @@ static int loose_backend__read_header(size_t *len_p, git_otype *type_p, git_odb_
|
|
613
615
|
raw.len = 0;
|
614
616
|
raw.type = GIT_OBJ_BAD;
|
615
617
|
|
616
|
-
if (locate_object(&object_path, (loose_backend *)backend, oid) < 0)
|
617
|
-
error = git_odb__error_notfound("no matching loose object",
|
618
|
-
|
618
|
+
if (locate_object(&object_path, (loose_backend *)backend, oid) < 0) {
|
619
|
+
error = git_odb__error_notfound("no matching loose object",
|
620
|
+
oid, GIT_OID_HEXSZ);
|
621
|
+
} else if ((error = read_header_loose(&raw, &object_path)) == 0) {
|
619
622
|
*len_p = raw.len;
|
620
623
|
*type_p = raw.type;
|
621
624
|
}
|
@@ -633,9 +636,10 @@ static int loose_backend__read(void **buffer_p, size_t *len_p, git_otype *type_p
|
|
633
636
|
|
634
637
|
assert(backend && oid);
|
635
638
|
|
636
|
-
if (locate_object(&object_path, (loose_backend *)backend, oid) < 0)
|
637
|
-
error = git_odb__error_notfound("no matching loose object",
|
638
|
-
|
639
|
+
if (locate_object(&object_path, (loose_backend *)backend, oid) < 0) {
|
640
|
+
error = git_odb__error_notfound("no matching loose object",
|
641
|
+
oid, GIT_OID_HEXSZ);
|
642
|
+
} else if ((error = read_loose(&raw, &object_path)) == 0) {
|
639
643
|
*buffer_p = raw.data;
|
640
644
|
*len_p = raw.len;
|
641
645
|
*type_p = raw.type;
|
@@ -264,7 +264,8 @@ static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backen
|
|
264
264
|
if (!pack_entry_find_inner(e, backend, oid, last_found))
|
265
265
|
return 0;
|
266
266
|
|
267
|
-
return git_odb__error_notfound(
|
267
|
+
return git_odb__error_notfound(
|
268
|
+
"failed to find pack entry", oid, GIT_OID_HEXSZ);
|
268
269
|
}
|
269
270
|
|
270
271
|
static int pack_entry_find_prefix(
|
@@ -309,7 +310,8 @@ static int pack_entry_find_prefix(
|
|
309
310
|
}
|
310
311
|
|
311
312
|
if (!found)
|
312
|
-
return git_odb__error_notfound("no matching pack entry for prefix",
|
313
|
+
return git_odb__error_notfound("no matching pack entry for prefix",
|
314
|
+
short_oid, len);
|
313
315
|
else
|
314
316
|
return 0;
|
315
317
|
}
|
@@ -333,7 +335,7 @@ static int pack_backend__refresh(git_odb_backend *backend_)
|
|
333
335
|
return 0;
|
334
336
|
|
335
337
|
if (p_stat(backend->pack_folder, &st) < 0 || !S_ISDIR(st.st_mode))
|
336
|
-
return git_odb__error_notfound("failed to refresh packfiles", NULL);
|
338
|
+
return git_odb__error_notfound("failed to refresh packfiles", NULL, 0);
|
337
339
|
|
338
340
|
git_buf_sets(&path, backend->pack_folder);
|
339
341
|
|
@@ -589,9 +591,6 @@ int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir)
|
|
589
591
|
struct pack_backend *backend = NULL;
|
590
592
|
git_buf path = GIT_BUF_INIT;
|
591
593
|
|
592
|
-
if (git_mwindow_files_init() < 0)
|
593
|
-
return -1;
|
594
|
-
|
595
594
|
if (pack_backend__alloc(&backend, 8) < 0)
|
596
595
|
return -1;
|
597
596
|
|
data/vendor/libgit2/src/oid.h
CHANGED
@@ -44,4 +44,13 @@ GIT_INLINE(int) git_oid__cmp(const git_oid *a, const git_oid *b)
|
|
44
44
|
return git_oid__hashcmp(a->id, b->id);
|
45
45
|
}
|
46
46
|
|
47
|
+
GIT_INLINE(void) git_oid__cpy_prefix(
|
48
|
+
git_oid *out, const git_oid *id, size_t len)
|
49
|
+
{
|
50
|
+
memcpy(&out->id, id->id, (len + 1) / 2);
|
51
|
+
|
52
|
+
if (len & 1)
|
53
|
+
out->id[len / 2] &= 0xF0;
|
54
|
+
}
|
55
|
+
|
47
56
|
#endif
|
@@ -13,6 +13,7 @@
|
|
13
13
|
#include "posix.h"
|
14
14
|
#include "stream.h"
|
15
15
|
#include "socket_stream.h"
|
16
|
+
#include "openssl_stream.h"
|
16
17
|
#include "netops.h"
|
17
18
|
#include "git2/transport.h"
|
18
19
|
#include "git2/sys/openssl.h"
|
@@ -34,6 +35,8 @@
|
|
34
35
|
|
35
36
|
SSL_CTX *git__ssl_ctx;
|
36
37
|
|
38
|
+
#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"
|
39
|
+
|
37
40
|
#ifdef GIT_THREADS
|
38
41
|
|
39
42
|
static git_mutex *openssl_locks;
|
@@ -69,12 +72,20 @@ static void shutdown_ssl_locking(void)
|
|
69
72
|
|
70
73
|
#endif /* GIT_THREADS */
|
71
74
|
|
75
|
+
static BIO_METHOD *git_stream_bio_method;
|
76
|
+
static int init_bio_method(void);
|
77
|
+
|
72
78
|
/**
|
73
79
|
* This function aims to clean-up the SSL context which
|
74
80
|
* we allocated.
|
75
81
|
*/
|
76
82
|
static void shutdown_ssl(void)
|
77
83
|
{
|
84
|
+
if (git_stream_bio_method) {
|
85
|
+
BIO_meth_free(git_stream_bio_method);
|
86
|
+
git_stream_bio_method = NULL;
|
87
|
+
}
|
88
|
+
|
78
89
|
if (git__ssl_ctx) {
|
79
90
|
SSL_CTX_free(git__ssl_ctx);
|
80
91
|
git__ssl_ctx = NULL;
|
@@ -85,6 +96,7 @@ int git_openssl_stream_global_init(void)
|
|
85
96
|
{
|
86
97
|
#ifdef GIT_OPENSSL
|
87
98
|
long ssl_opts = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
|
99
|
+
const char *ciphers = git_libgit2__ssl_ciphers();
|
88
100
|
|
89
101
|
/* Older OpenSSL and MacOS OpenSSL doesn't have this */
|
90
102
|
#ifdef SSL_OP_NO_COMPRESSION
|
@@ -108,6 +120,23 @@ int git_openssl_stream_global_init(void)
|
|
108
120
|
git__ssl_ctx = NULL;
|
109
121
|
return -1;
|
110
122
|
}
|
123
|
+
|
124
|
+
if (!ciphers) {
|
125
|
+
ciphers = GIT_SSL_DEFAULT_CIPHERS;
|
126
|
+
}
|
127
|
+
|
128
|
+
if(!SSL_CTX_set_cipher_list(git__ssl_ctx, ciphers)) {
|
129
|
+
SSL_CTX_free(git__ssl_ctx);
|
130
|
+
git__ssl_ctx = NULL;
|
131
|
+
return -1;
|
132
|
+
}
|
133
|
+
|
134
|
+
if (init_bio_method() < 0) {
|
135
|
+
SSL_CTX_free(git__ssl_ctx);
|
136
|
+
git__ssl_ctx = NULL;
|
137
|
+
return -1;
|
138
|
+
}
|
139
|
+
|
111
140
|
#endif
|
112
141
|
|
113
142
|
git__on_shutdown(shutdown_ssl);
|
@@ -143,10 +172,8 @@ int git_openssl_set_locking(void)
|
|
143
172
|
|
144
173
|
static int bio_create(BIO *b)
|
145
174
|
{
|
146
|
-
b
|
147
|
-
b
|
148
|
-
b->ptr = NULL;
|
149
|
-
b->flags = 0;
|
175
|
+
BIO_set_init(b, 1);
|
176
|
+
BIO_set_data(b, NULL);
|
150
177
|
|
151
178
|
return 1;
|
152
179
|
}
|
@@ -156,23 +183,22 @@ static int bio_destroy(BIO *b)
|
|
156
183
|
if (!b)
|
157
184
|
return 0;
|
158
185
|
|
159
|
-
b
|
160
|
-
b->num = 0;
|
161
|
-
b->ptr = NULL;
|
162
|
-
b->flags = 0;
|
186
|
+
BIO_set_data(b, NULL);
|
163
187
|
|
164
188
|
return 1;
|
165
189
|
}
|
166
190
|
|
167
191
|
static int bio_read(BIO *b, char *buf, int len)
|
168
192
|
{
|
169
|
-
git_stream *io = (git_stream *) b
|
193
|
+
git_stream *io = (git_stream *) BIO_get_data(b);
|
194
|
+
|
170
195
|
return (int) git_stream_read(io, buf, len);
|
171
196
|
}
|
172
197
|
|
173
198
|
static int bio_write(BIO *b, const char *buf, int len)
|
174
199
|
{
|
175
|
-
git_stream *io = (git_stream *) b
|
200
|
+
git_stream *io = (git_stream *) BIO_get_data(b);
|
201
|
+
|
176
202
|
return (int) git_stream_write(io, buf, len, 0);
|
177
203
|
}
|
178
204
|
|
@@ -201,17 +227,22 @@ static int bio_puts(BIO *b, const char *str)
|
|
201
227
|
return bio_write(b, str, strlen(str));
|
202
228
|
}
|
203
229
|
|
204
|
-
static
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
230
|
+
static int init_bio_method(void)
|
231
|
+
{
|
232
|
+
/* Set up the BIO_METHOD we use for wrapping our own stream implementations */
|
233
|
+
git_stream_bio_method = BIO_meth_new(BIO_TYPE_SOURCE_SINK | BIO_get_new_index(), "git_stream");
|
234
|
+
GITERR_CHECK_ALLOC(git_stream_bio_method);
|
235
|
+
|
236
|
+
BIO_meth_set_write(git_stream_bio_method, bio_write);
|
237
|
+
BIO_meth_set_read(git_stream_bio_method, bio_read);
|
238
|
+
BIO_meth_set_puts(git_stream_bio_method, bio_puts);
|
239
|
+
BIO_meth_set_gets(git_stream_bio_method, bio_gets);
|
240
|
+
BIO_meth_set_ctrl(git_stream_bio_method, bio_ctrl);
|
241
|
+
BIO_meth_set_create(git_stream_bio_method, bio_create);
|
242
|
+
BIO_meth_set_destroy(git_stream_bio_method, bio_destroy);
|
243
|
+
|
244
|
+
return 0;
|
245
|
+
}
|
215
246
|
|
216
247
|
static int ssl_set_error(SSL *ssl, int error)
|
217
248
|
{
|
@@ -326,7 +357,7 @@ static int verify_server_cert(SSL *ssl, const char *host)
|
|
326
357
|
num = sk_GENERAL_NAME_num(alts);
|
327
358
|
for (i = 0; i < num && matched != 1; i++) {
|
328
359
|
const GENERAL_NAME *gn = sk_GENERAL_NAME_value(alts, i);
|
329
|
-
const char *name = (char *)
|
360
|
+
const char *name = (char *) ASN1_STRING_get0_data(gn->d.ia5);
|
330
361
|
size_t namelen = (size_t) ASN1_STRING_length(gn->d.ia5);
|
331
362
|
|
332
363
|
/* Skip any names of a type we're not looking for */
|
@@ -381,7 +412,7 @@ static int verify_server_cert(SSL *ssl, const char *host)
|
|
381
412
|
if (size > 0) {
|
382
413
|
peer_cn = OPENSSL_malloc(size + 1);
|
383
414
|
GITERR_CHECK_ALLOC(peer_cn);
|
384
|
-
memcpy(peer_cn,
|
415
|
+
memcpy(peer_cn, ASN1_STRING_get0_data(str), size);
|
385
416
|
peer_cn[size] = '\0';
|
386
417
|
} else {
|
387
418
|
goto cert_fail_name;
|
@@ -432,11 +463,12 @@ int openssl_connect(git_stream *stream)
|
|
432
463
|
|
433
464
|
st->connected = true;
|
434
465
|
|
435
|
-
bio = BIO_new(
|
466
|
+
bio = BIO_new(git_stream_bio_method);
|
436
467
|
GITERR_CHECK_ALLOC(bio);
|
437
|
-
bio->ptr = st->io;
|
438
468
|
|
469
|
+
BIO_set_data(bio, st->io);
|
439
470
|
SSL_set_bio(st->ssl, bio, bio);
|
471
|
+
|
440
472
|
/* specify the host in case SNI is needed */
|
441
473
|
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
|
442
474
|
SSL_set_tlsext_host_name(st->ssl, st->host);
|
@@ -509,8 +541,9 @@ ssize_t openssl_read(git_stream *stream, void *data, size_t len)
|
|
509
541
|
openssl_stream *st = (openssl_stream *) stream;
|
510
542
|
int ret;
|
511
543
|
|
512
|
-
if ((ret = SSL_read(st->ssl, data, len)) <= 0)
|
513
|
-
ssl_set_error(st->ssl, ret);
|
544
|
+
if ((ret = SSL_read(st->ssl, data, len)) <= 0) {
|
545
|
+
return ssl_set_error(st->ssl, ret);
|
546
|
+
}
|
514
547
|
|
515
548
|
return ret;
|
516
549
|
}
|