rugged 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +1 -1
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -0
- data/vendor/libgit2/deps/ntlmclient/compat.h +0 -34
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +1 -1
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +5 -5
- data/vendor/libgit2/deps/ntlmclient/util.c +15 -1
- data/vendor/libgit2/deps/ntlmclient/util.h +2 -1
- data/vendor/libgit2/include/git2/apply.h +2 -0
- data/vendor/libgit2/include/git2/blob.h +17 -1
- data/vendor/libgit2/include/git2/common.h +5 -0
- data/vendor/libgit2/include/git2/config.h +1 -1
- data/vendor/libgit2/include/git2/diff.h +1 -1
- data/vendor/libgit2/include/git2/index.h +2 -2
- data/vendor/libgit2/include/git2/indexer.h +2 -1
- data/vendor/libgit2/include/git2/odb.h +15 -20
- data/vendor/libgit2/include/git2/refs.h +3 -3
- data/vendor/libgit2/include/git2/repository.h +95 -52
- data/vendor/libgit2/include/git2/transport.h +1 -1
- data/vendor/libgit2/include/git2/tree.h +2 -0
- data/vendor/libgit2/include/git2/version.h +2 -2
- data/vendor/libgit2/src/blame.c +15 -10
- data/vendor/libgit2/src/blob.c +9 -0
- data/vendor/libgit2/src/clone.c +42 -21
- data/vendor/libgit2/src/config_cache.c +6 -3
- data/vendor/libgit2/src/diff_tform.c +2 -2
- data/vendor/libgit2/src/index.c +6 -5
- data/vendor/libgit2/src/indexer.c +19 -3
- data/vendor/libgit2/src/integer.h +15 -0
- data/vendor/libgit2/src/merge.c +5 -2
- data/vendor/libgit2/src/mwindow.c +3 -1
- data/vendor/libgit2/src/odb.c +4 -3
- data/vendor/libgit2/src/pack.c +10 -6
- data/vendor/libgit2/src/posix.c +32 -9
- data/vendor/libgit2/src/posix.h +9 -0
- data/vendor/libgit2/src/refdb_fs.c +4 -2
- data/vendor/libgit2/src/refs.c +20 -7
- data/vendor/libgit2/src/refs.h +1 -1
- data/vendor/libgit2/src/refspec.c +48 -32
- data/vendor/libgit2/src/remote.c +13 -7
- data/vendor/libgit2/src/repository.c +15 -15
- data/vendor/libgit2/src/repository.h +1 -1
- data/vendor/libgit2/src/thread-utils.h +24 -19
- data/vendor/libgit2/src/transports/httpclient.c +9 -4
- data/vendor/libgit2/src/transports/winhttp.c +99 -52
- data/vendor/libgit2/src/unix/posix.h +3 -0
- data/vendor/libgit2/src/win32/posix_w32.c +70 -0
- data/vendor/libgit2/src/worktree.c +8 -1
- metadata +2 -2
@@ -334,6 +334,7 @@ GIT_EXTERN(int) git_treebuilder_insert(
|
|
334
334
|
*
|
335
335
|
* @param bld Tree builder
|
336
336
|
* @param filename Filename of the entry to remove
|
337
|
+
* @return 0 or an error code
|
337
338
|
*/
|
338
339
|
GIT_EXTERN(int) git_treebuilder_remove(
|
339
340
|
git_treebuilder *bld, const char *filename);
|
@@ -477,6 +478,7 @@ typedef struct {
|
|
477
478
|
* @param baseline the tree to base these changes on
|
478
479
|
* @param nupdates the number of elements in the update list
|
479
480
|
* @param updates the list of updates to perform
|
481
|
+
* @return 0 or an error code
|
480
482
|
*/
|
481
483
|
GIT_EXTERN(int) git_tree_create_updated(git_oid *out, git_repository *repo, git_tree *baseline, size_t nupdates, const git_tree_update *updates);
|
482
484
|
|
@@ -7,10 +7,10 @@
|
|
7
7
|
#ifndef INCLUDE_git_version_h__
|
8
8
|
#define INCLUDE_git_version_h__
|
9
9
|
|
10
|
-
#define LIBGIT2_VERSION "1.1.
|
10
|
+
#define LIBGIT2_VERSION "1.1.1"
|
11
11
|
#define LIBGIT2_VER_MAJOR 1
|
12
12
|
#define LIBGIT2_VER_MINOR 1
|
13
|
-
#define LIBGIT2_VER_REVISION
|
13
|
+
#define LIBGIT2_VER_REVISION 1
|
14
14
|
#define LIBGIT2_VER_PATCH 0
|
15
15
|
|
16
16
|
#define LIBGIT2_SOVERSION "1.1"
|
data/vendor/libgit2/src/blame.c
CHANGED
@@ -76,6 +76,14 @@ static git_blame_hunk* new_hunk(
|
|
76
76
|
return hunk;
|
77
77
|
}
|
78
78
|
|
79
|
+
static void free_hunk(git_blame_hunk *hunk)
|
80
|
+
{
|
81
|
+
git__free((void*)hunk->orig_path);
|
82
|
+
git_signature_free(hunk->final_signature);
|
83
|
+
git_signature_free(hunk->orig_signature);
|
84
|
+
git__free(hunk);
|
85
|
+
}
|
86
|
+
|
79
87
|
static git_blame_hunk* dup_hunk(git_blame_hunk *hunk)
|
80
88
|
{
|
81
89
|
git_blame_hunk *newhunk = new_hunk(
|
@@ -90,17 +98,14 @@ static git_blame_hunk* dup_hunk(git_blame_hunk *hunk)
|
|
90
98
|
git_oid_cpy(&newhunk->orig_commit_id, &hunk->orig_commit_id);
|
91
99
|
git_oid_cpy(&newhunk->final_commit_id, &hunk->final_commit_id);
|
92
100
|
newhunk->boundary = hunk->boundary;
|
93
|
-
git_signature_dup(&newhunk->final_signature, hunk->final_signature);
|
94
|
-
git_signature_dup(&newhunk->orig_signature, hunk->orig_signature);
|
95
|
-
return newhunk;
|
96
|
-
}
|
97
101
|
|
98
|
-
|
99
|
-
{
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
102
|
+
if (git_signature_dup(&newhunk->final_signature, hunk->final_signature) < 0 ||
|
103
|
+
git_signature_dup(&newhunk->orig_signature, hunk->orig_signature) < 0) {
|
104
|
+
free_hunk(newhunk);
|
105
|
+
return NULL;
|
106
|
+
}
|
107
|
+
|
108
|
+
return newhunk;
|
104
109
|
}
|
105
110
|
|
106
111
|
/* Starting with the hunk that includes start_line, shift all following hunks'
|
data/vendor/libgit2/src/blob.c
CHANGED
@@ -400,6 +400,15 @@ int git_blob_is_binary(const git_blob *blob)
|
|
400
400
|
return git_buf_text_is_binary(&content);
|
401
401
|
}
|
402
402
|
|
403
|
+
int git_blob_filter_options_init(
|
404
|
+
git_blob_filter_options *opts,
|
405
|
+
unsigned int version)
|
406
|
+
{
|
407
|
+
GIT_INIT_STRUCTURE_FROM_TEMPLATE(opts, version,
|
408
|
+
git_blob_filter_options, GIT_BLOB_FILTER_OPTIONS_INIT);
|
409
|
+
return 0;
|
410
|
+
}
|
411
|
+
|
403
412
|
int git_blob_filter(
|
404
413
|
git_buf *out,
|
405
414
|
git_blob *blob,
|
data/vendor/libgit2/src/clone.c
CHANGED
@@ -162,6 +162,37 @@ done:
|
|
162
162
|
return error;
|
163
163
|
}
|
164
164
|
|
165
|
+
static int update_remote_head_byname(
|
166
|
+
git_repository *repo,
|
167
|
+
const char *remote_name,
|
168
|
+
const char *tracking_branch_name,
|
169
|
+
const char *reflog_message)
|
170
|
+
{
|
171
|
+
git_buf tracking_head_name = GIT_BUF_INIT;
|
172
|
+
git_reference *remote_head = NULL;
|
173
|
+
int error;
|
174
|
+
|
175
|
+
if ((error = git_buf_printf(&tracking_head_name,
|
176
|
+
"%s%s/%s",
|
177
|
+
GIT_REFS_REMOTES_DIR,
|
178
|
+
remote_name,
|
179
|
+
GIT_HEAD_FILE)) < 0)
|
180
|
+
goto cleanup;
|
181
|
+
|
182
|
+
error = git_reference_symbolic_create(
|
183
|
+
&remote_head,
|
184
|
+
repo,
|
185
|
+
git_buf_cstr(&tracking_head_name),
|
186
|
+
tracking_branch_name,
|
187
|
+
true,
|
188
|
+
reflog_message);
|
189
|
+
|
190
|
+
cleanup:
|
191
|
+
git_reference_free(remote_head);
|
192
|
+
git_buf_dispose(&tracking_head_name);
|
193
|
+
return error;
|
194
|
+
}
|
195
|
+
|
165
196
|
static int update_remote_head(
|
166
197
|
git_repository *repo,
|
167
198
|
git_remote *remote,
|
@@ -169,9 +200,7 @@ static int update_remote_head(
|
|
169
200
|
const char *reflog_message)
|
170
201
|
{
|
171
202
|
git_refspec *refspec;
|
172
|
-
|
173
|
-
git_buf remote_head_name = GIT_BUF_INIT;
|
174
|
-
git_buf remote_branch_name = GIT_BUF_INIT;
|
203
|
+
git_buf tracking_branch_name = GIT_BUF_INIT;
|
175
204
|
int error;
|
176
205
|
|
177
206
|
/* Determine the remote tracking ref name from the local branch */
|
@@ -184,30 +213,19 @@ static int update_remote_head(
|
|
184
213
|
}
|
185
214
|
|
186
215
|
if ((error = git_refspec_transform(
|
187
|
-
&
|
216
|
+
&tracking_branch_name,
|
188
217
|
refspec,
|
189
218
|
git_buf_cstr(target))) < 0)
|
190
219
|
goto cleanup;
|
191
220
|
|
192
|
-
|
193
|
-
"%s%s/%s",
|
194
|
-
GIT_REFS_REMOTES_DIR,
|
195
|
-
git_remote_name(remote),
|
196
|
-
GIT_HEAD_FILE)) < 0)
|
197
|
-
goto cleanup;
|
198
|
-
|
199
|
-
error = git_reference_symbolic_create(
|
200
|
-
&remote_head,
|
221
|
+
error = update_remote_head_byname(
|
201
222
|
repo,
|
202
|
-
|
203
|
-
git_buf_cstr(&
|
204
|
-
true,
|
223
|
+
git_remote_name(remote),
|
224
|
+
git_buf_cstr(&tracking_branch_name),
|
205
225
|
reflog_message);
|
206
226
|
|
207
227
|
cleanup:
|
208
|
-
|
209
|
-
git_buf_dispose(&remote_branch_name);
|
210
|
-
git_buf_dispose(&remote_head_name);
|
228
|
+
git_buf_dispose(&tracking_branch_name);
|
211
229
|
return error;
|
212
230
|
}
|
213
231
|
|
@@ -276,8 +294,11 @@ static int update_head_to_branch(
|
|
276
294
|
if ((retcode = git_reference_lookup(&remote_ref, repo, git_buf_cstr(&remote_branch_name))) < 0)
|
277
295
|
goto cleanup;
|
278
296
|
|
279
|
-
retcode = update_head_to_new_branch(repo, git_reference_target(remote_ref), branch,
|
280
|
-
reflog_message)
|
297
|
+
if ((retcode = update_head_to_new_branch(repo, git_reference_target(remote_ref), branch,
|
298
|
+
reflog_message)) < 0)
|
299
|
+
goto cleanup;
|
300
|
+
|
301
|
+
retcode = update_remote_head_byname(repo, remote_name, remote_branch_name.ptr, reflog_message);
|
281
302
|
|
282
303
|
cleanup:
|
283
304
|
git_reference_free(remote_ref);
|
@@ -111,9 +111,11 @@ int git_config__configmap_lookup(int *out, git_config *config, git_configmap_ite
|
|
111
111
|
|
112
112
|
int git_repository__configmap_lookup(int *out, git_repository *repo, git_configmap_item item)
|
113
113
|
{
|
114
|
-
|
114
|
+
intptr_t value = repo->configmap_cache[(int)item];
|
115
115
|
|
116
|
-
|
116
|
+
*out = (int)value;
|
117
|
+
|
118
|
+
if (value == GIT_CONFIGMAP_NOT_CACHED) {
|
117
119
|
int error;
|
118
120
|
git_config *config;
|
119
121
|
|
@@ -121,7 +123,8 @@ int git_repository__configmap_lookup(int *out, git_repository *repo, git_configm
|
|
121
123
|
(error = git_config__configmap_lookup(out, config, item)) < 0)
|
122
124
|
return error;
|
123
125
|
|
124
|
-
|
126
|
+
value = *out;
|
127
|
+
repo->configmap_cache[(int)item] = value;
|
125
128
|
}
|
126
129
|
|
127
130
|
return 0;
|
@@ -1038,7 +1038,7 @@ find_best_matches:
|
|
1038
1038
|
memcpy(&src->old_file, &swap, sizeof(src->old_file));
|
1039
1039
|
|
1040
1040
|
/* if we've just swapped the new element into the correct
|
1041
|
-
* place, clear the SPLIT
|
1041
|
+
* place, clear the SPLIT and RENAME_TARGET flags
|
1042
1042
|
*/
|
1043
1043
|
if (tgt2src[s].idx == t &&
|
1044
1044
|
tgt2src[s].similarity >
|
@@ -1046,7 +1046,7 @@ find_best_matches:
|
|
1046
1046
|
src->status = GIT_DELTA_RENAMED;
|
1047
1047
|
src->similarity = tgt2src[s].similarity;
|
1048
1048
|
tgt2src[s].similarity = 0;
|
1049
|
-
src->flags &= ~GIT_DIFF_FLAG__TO_SPLIT;
|
1049
|
+
src->flags &= ~(GIT_DIFF_FLAG__TO_SPLIT | GIT_DIFF_FLAG__IS_RENAME_TARGET);
|
1050
1050
|
num_rewrites--;
|
1051
1051
|
}
|
1052
1052
|
/* otherwise, if we just overwrote a source, update mapping */
|
data/vendor/libgit2/src/index.c
CHANGED
@@ -2826,14 +2826,16 @@ static int write_entries(git_index *index, git_filebuf *file)
|
|
2826
2826
|
{
|
2827
2827
|
int error = 0;
|
2828
2828
|
size_t i;
|
2829
|
-
git_vector case_sorted, *entries;
|
2829
|
+
git_vector case_sorted = GIT_VECTOR_INIT, *entries = NULL;
|
2830
2830
|
git_index_entry *entry;
|
2831
2831
|
const char *last = NULL;
|
2832
2832
|
|
2833
2833
|
/* If index->entries is sorted case-insensitively, then we need
|
2834
2834
|
* to re-sort it case-sensitively before writing */
|
2835
2835
|
if (index->ignore_case) {
|
2836
|
-
git_vector_dup(&case_sorted, &index->entries, git_index_entry_cmp)
|
2836
|
+
if ((error = git_vector_dup(&case_sorted, &index->entries, git_index_entry_cmp)) < 0)
|
2837
|
+
goto done;
|
2838
|
+
|
2837
2839
|
git_vector_sort(&case_sorted);
|
2838
2840
|
entries = &case_sorted;
|
2839
2841
|
} else {
|
@@ -2850,9 +2852,8 @@ static int write_entries(git_index *index, git_filebuf *file)
|
|
2850
2852
|
last = entry->path;
|
2851
2853
|
}
|
2852
2854
|
|
2853
|
-
|
2854
|
-
|
2855
|
-
|
2855
|
+
done:
|
2856
|
+
git_vector_free(&case_sorted);
|
2856
2857
|
return error;
|
2857
2858
|
}
|
2858
2859
|
|
@@ -604,6 +604,23 @@ static void hash_partially(git_indexer *idx, const uint8_t *data, size_t size)
|
|
604
604
|
|
605
605
|
static int write_at(git_indexer *idx, const void *data, off64_t offset, size_t size)
|
606
606
|
{
|
607
|
+
#ifdef NO_MMAP
|
608
|
+
size_t remaining_size = size;
|
609
|
+
const char *ptr = (const char *)data;
|
610
|
+
|
611
|
+
/* Handle data size larger that ssize_t */
|
612
|
+
while (remaining_size > 0) {
|
613
|
+
ssize_t nb;
|
614
|
+
HANDLE_EINTR(nb, p_pwrite(idx->pack->mwf.fd, (void *)ptr,
|
615
|
+
remaining_size, offset));
|
616
|
+
if (nb <= 0)
|
617
|
+
return -1;
|
618
|
+
|
619
|
+
ptr += nb;
|
620
|
+
offset += nb;
|
621
|
+
remaining_size -= nb;
|
622
|
+
}
|
623
|
+
#else
|
607
624
|
git_file fd = idx->pack->mwf.fd;
|
608
625
|
size_t mmap_alignment;
|
609
626
|
size_t page_offset;
|
@@ -627,6 +644,7 @@ static int write_at(git_indexer *idx, const void *data, off64_t offset, size_t s
|
|
627
644
|
map_data = (unsigned char *)map.data;
|
628
645
|
memcpy(map_data + page_offset, data, size);
|
629
646
|
p_munmap(&map);
|
647
|
+
#endif
|
630
648
|
|
631
649
|
return 0;
|
632
650
|
}
|
@@ -638,7 +656,6 @@ static int append_to_pack(git_indexer *idx, const void *data, size_t size)
|
|
638
656
|
size_t page_offset;
|
639
657
|
off64_t page_start;
|
640
658
|
off64_t current_size = idx->pack->mwf.size;
|
641
|
-
int fd = idx->pack->mwf.fd;
|
642
659
|
int error;
|
643
660
|
|
644
661
|
if (!size)
|
@@ -655,8 +672,7 @@ static int append_to_pack(git_indexer *idx, const void *data, size_t size)
|
|
655
672
|
page_offset = new_size % mmap_alignment;
|
656
673
|
page_start = new_size - page_offset;
|
657
674
|
|
658
|
-
if (
|
659
|
-
p_write(idx->pack->mwf.fd, data, 1) < 0) {
|
675
|
+
if (p_pwrite(idx->pack->mwf.fd, data, 1, page_start + mmap_alignment - 1) < 0) {
|
660
676
|
git_error_set(GIT_ERROR_OS, "cannot extend packfile '%s'", idx->pack->pack_name);
|
661
677
|
return -1;
|
662
678
|
}
|
@@ -77,6 +77,9 @@ GIT_INLINE(int) git__is_int(long long p)
|
|
77
77
|
# define git__sub_int_overflow(out, one, two) \
|
78
78
|
__builtin_ssub_overflow(one, two, out)
|
79
79
|
|
80
|
+
# define git__add_int64_overflow(out, one, two) \
|
81
|
+
__builtin_add_overflow(one, two, out)
|
82
|
+
|
80
83
|
/* Use Microsoft's safe integer handling functions where available */
|
81
84
|
#elif defined(_MSC_VER)
|
82
85
|
|
@@ -92,6 +95,9 @@ GIT_INLINE(int) git__is_int(long long p)
|
|
92
95
|
#define git__sub_int_overflow(out, one, two) \
|
93
96
|
(IntSub(one, two, out) != S_OK)
|
94
97
|
|
98
|
+
#define git__add_int64_overflow(out, one, two) \
|
99
|
+
(LongLongAdd(one, two, out) != S_OK)
|
100
|
+
|
95
101
|
#else
|
96
102
|
|
97
103
|
/**
|
@@ -136,6 +142,15 @@ GIT_INLINE(bool) git__sub_int_overflow(int *out, int one, int two)
|
|
136
142
|
return false;
|
137
143
|
}
|
138
144
|
|
145
|
+
GIT_INLINE(bool) git__add_int64_overflow(int64_t *out, int64_t one, int64_t two)
|
146
|
+
{
|
147
|
+
if ((two > 0 && one > (INT64_MAX - two)) ||
|
148
|
+
(two < 0 && one < (INT64_MIN - two)))
|
149
|
+
return true;
|
150
|
+
*out = one + two;
|
151
|
+
return false;
|
152
|
+
}
|
153
|
+
|
139
154
|
#endif
|
140
155
|
|
141
156
|
#endif
|
data/vendor/libgit2/src/merge.c
CHANGED
@@ -2258,8 +2258,11 @@ static int create_virtual_base(
|
|
2258
2258
|
result->type = GIT_ANNOTATED_COMMIT_VIRTUAL;
|
2259
2259
|
result->index = index;
|
2260
2260
|
|
2261
|
-
insert_head_ids(&result->parents, one)
|
2262
|
-
|
2261
|
+
if (insert_head_ids(&result->parents, one) < 0 ||
|
2262
|
+
insert_head_ids(&result->parents, two) < 0) {
|
2263
|
+
git_annotated_commit_free(result);
|
2264
|
+
return -1;
|
2265
|
+
}
|
2263
2266
|
|
2264
2267
|
*out = result;
|
2265
2268
|
return 0;
|
@@ -295,8 +295,10 @@ static int git_mwindow_close_lru_file(void)
|
|
295
295
|
current_file, &mru_window, NULL, true, GIT_MWINDOW__MRU)) {
|
296
296
|
continue;
|
297
297
|
}
|
298
|
-
if (!lru_window || lru_window->last_used > mru_window->last_used)
|
298
|
+
if (!lru_window || lru_window->last_used > mru_window->last_used) {
|
299
|
+
lru_window = mru_window;
|
299
300
|
lru_file = current_file;
|
301
|
+
}
|
300
302
|
}
|
301
303
|
|
302
304
|
if (!lru_file) {
|
data/vendor/libgit2/src/odb.c
CHANGED
@@ -298,14 +298,15 @@ int git_odb__hashlink(git_oid *out, const char *path)
|
|
298
298
|
GIT_ERROR_CHECK_ALLOC(link_data);
|
299
299
|
|
300
300
|
read_len = p_readlink(path, link_data, size);
|
301
|
-
|
302
|
-
if (read_len != size) {
|
301
|
+
if (read_len == -1) {
|
303
302
|
git_error_set(GIT_ERROR_OS, "failed to read symlink data for '%s'", path);
|
304
303
|
git__free(link_data);
|
305
304
|
return -1;
|
306
305
|
}
|
306
|
+
GIT_ASSERT(read_len <= size);
|
307
|
+
link_data[read_len] = '\0';
|
307
308
|
|
308
|
-
result = git_odb_hash(out, link_data,
|
309
|
+
result = git_odb_hash(out, link_data, read_len, GIT_OBJECT_BLOB);
|
309
310
|
git__free(link_data);
|
310
311
|
} else {
|
311
312
|
int fd = git_futils_open_ro(path);
|
data/vendor/libgit2/src/pack.c
CHANGED
@@ -841,7 +841,7 @@ static int packfile_unpack_compressed(
|
|
841
841
|
|
842
842
|
do {
|
843
843
|
size_t bytes = buffer_len - total;
|
844
|
-
unsigned int window_len;
|
844
|
+
unsigned int window_len, consumed;
|
845
845
|
unsigned char *in;
|
846
846
|
|
847
847
|
if ((in = pack_window_open(p, mwindow, *position, &window_len)) == NULL) {
|
@@ -857,10 +857,15 @@ static int packfile_unpack_compressed(
|
|
857
857
|
|
858
858
|
git_mwindow_close(mwindow);
|
859
859
|
|
860
|
-
|
861
|
-
|
860
|
+
consumed = window_len - (unsigned int)zstream.in_len;
|
861
|
+
|
862
|
+
if (!bytes && !consumed) {
|
863
|
+
git_error_set(GIT_ERROR_ZLIB, "error inflating zlib stream");
|
864
|
+
error = -1;
|
865
|
+
goto out;
|
866
|
+
}
|
862
867
|
|
863
|
-
*position +=
|
868
|
+
*position += consumed;
|
864
869
|
total += bytes;
|
865
870
|
} while (!git_zstream_eos(&zstream));
|
866
871
|
|
@@ -1058,8 +1063,7 @@ static int packfile_open(struct git_pack_file *p)
|
|
1058
1063
|
|
1059
1064
|
/* Verify the pack matches its index. */
|
1060
1065
|
if (p->num_objects != ntohl(hdr.hdr_entries) ||
|
1061
|
-
|
1062
|
-
p_read(p->mwf.fd, sha1.id, GIT_OID_RAWSZ) < 0)
|
1066
|
+
p_pread(p->mwf.fd, sha1.id, GIT_OID_RAWSZ, p->mwf.size - GIT_OID_RAWSZ) < 0)
|
1063
1067
|
goto cleanup;
|
1064
1068
|
|
1065
1069
|
idx_sha1 = ((unsigned char *)p->index_map.data) + p->index_map.len - 40;
|
data/vendor/libgit2/src/posix.c
CHANGED
@@ -237,24 +237,43 @@ int git__mmap_alignment(size_t *alignment)
|
|
237
237
|
|
238
238
|
int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, off64_t offset)
|
239
239
|
{
|
240
|
+
const char *ptr;
|
241
|
+
size_t remaining_len;
|
242
|
+
|
240
243
|
GIT_MMAP_VALIDATE(out, len, prot, flags);
|
241
244
|
|
242
|
-
|
243
|
-
|
245
|
+
/* writes cannot be emulated without handling pagefaults since write happens by
|
246
|
+
* writing to mapped memory */
|
247
|
+
if (prot & GIT_PROT_WRITE) {
|
248
|
+
git_error_set(GIT_ERROR_OS, "trying to map %s-writeable",
|
249
|
+
((flags & GIT_MAP_TYPE) == GIT_MAP_SHARED) ? "shared": "private");
|
250
|
+
return -1;
|
251
|
+
}
|
244
252
|
|
245
|
-
if ((
|
246
|
-
|
253
|
+
if (!git__is_ssizet(len)) {
|
254
|
+
errno = EINVAL;
|
247
255
|
return -1;
|
248
256
|
}
|
249
257
|
|
258
|
+
out->len = 0;
|
250
259
|
out->data = git__malloc(len);
|
251
260
|
GIT_ERROR_CHECK_ALLOC(out->data);
|
252
261
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
262
|
+
remaining_len = len;
|
263
|
+
ptr = (const char *)out->data;
|
264
|
+
while (remaining_len > 0) {
|
265
|
+
ssize_t nb;
|
266
|
+
HANDLE_EINTR(nb, p_pread(fd, (void *)ptr, remaining_len, offset));
|
267
|
+
if (nb <= 0) {
|
268
|
+
git_error_set(GIT_ERROR_OS, "mmap emulation failed");
|
269
|
+
git__free(out->data);
|
270
|
+
out->data = NULL;
|
271
|
+
return -1;
|
272
|
+
}
|
273
|
+
|
274
|
+
ptr += nb;
|
275
|
+
offset += nb;
|
276
|
+
remaining_len -= nb;
|
258
277
|
}
|
259
278
|
|
260
279
|
out->len = len;
|
@@ -266,6 +285,10 @@ int p_munmap(git_map *map)
|
|
266
285
|
assert(map != NULL);
|
267
286
|
git__free(map->data);
|
268
287
|
|
288
|
+
/* Initializing will help debug use-after-free */
|
289
|
+
map->len = 0;
|
290
|
+
map->data = NULL;
|
291
|
+
|
269
292
|
return 0;
|
270
293
|
}
|
271
294
|
|