rugged 0.23.2 → 0.23.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rugged/version.rb +1 -1
  3. data/vendor/libgit2/CMakeLists.txt +12 -3
  4. data/vendor/libgit2/COPYING +46 -0
  5. data/vendor/libgit2/include/git2/config.h +4 -2
  6. data/vendor/libgit2/include/git2/cred_helpers.h +1 -1
  7. data/vendor/libgit2/include/git2/diff.h +0 -19
  8. data/vendor/libgit2/include/git2/errors.h +12 -0
  9. data/vendor/libgit2/include/git2/sys/filter.h +1 -4
  10. data/vendor/libgit2/include/git2/sys/refdb_backend.h +2 -3
  11. data/vendor/libgit2/include/git2/transport.h +21 -14
  12. data/vendor/libgit2/include/git2/version.h +2 -2
  13. data/vendor/libgit2/src/blame.c +1 -1
  14. data/vendor/libgit2/src/blame_git.c +27 -7
  15. data/vendor/libgit2/src/blame_git.h +1 -1
  16. data/vendor/libgit2/src/branch.c +12 -1
  17. data/vendor/libgit2/src/checkout.c +2 -1
  18. data/vendor/libgit2/src/clone.c +2 -2
  19. data/vendor/libgit2/src/common.h +13 -13
  20. data/vendor/libgit2/src/curl_stream.c +8 -7
  21. data/vendor/libgit2/src/diff.c +0 -25
  22. data/vendor/libgit2/src/diff_driver.c +6 -7
  23. data/vendor/libgit2/src/diff_patch.c +4 -0
  24. data/vendor/libgit2/src/diff_xdiff.c +7 -0
  25. data/vendor/libgit2/src/diff_xdiff.h +5 -0
  26. data/vendor/libgit2/src/errors.c +40 -75
  27. data/vendor/libgit2/src/filter.c +2 -5
  28. data/vendor/libgit2/src/global.c +9 -25
  29. data/vendor/libgit2/src/global.h +0 -1
  30. data/vendor/libgit2/src/index.c +3 -3
  31. data/vendor/libgit2/src/iterator.c +2 -2
  32. data/vendor/libgit2/src/merge.c +0 -56
  33. data/vendor/libgit2/src/merge_file.c +76 -22
  34. data/vendor/libgit2/src/openssl_stream.c +2 -3
  35. data/vendor/libgit2/src/path.c +0 -16
  36. data/vendor/libgit2/src/path.h +0 -5
  37. data/vendor/libgit2/src/refdb_fs.c +0 -7
  38. data/vendor/libgit2/src/remote.c +9 -18
  39. data/vendor/libgit2/src/stransport_stream.c +1 -1
  40. data/vendor/libgit2/src/submodule.c +7 -3
  41. data/vendor/libgit2/src/sysdir.c +8 -22
  42. data/vendor/libgit2/src/transports/http.c +9 -1
  43. data/vendor/libgit2/src/transports/smart_protocol.c +1 -1
  44. data/vendor/libgit2/src/transports/ssh.c +2 -2
  45. data/vendor/libgit2/src/transports/winhttp.c +1 -1
  46. data/vendor/libgit2/src/util.c +0 -48
  47. data/vendor/libgit2/src/util.h +5 -13
  48. data/vendor/libgit2/src/win32/posix_w32.c +0 -2
  49. data/vendor/libgit2/src/xdiff/xdiff.h +5 -3
  50. data/vendor/libgit2/src/xdiff/xdiffi.c +8 -4
  51. data/vendor/libgit2/src/xdiff/xhistogram.c +4 -2
  52. data/vendor/libgit2/src/xdiff/xmerge.c +98 -44
  53. metadata +76 -81
  54. data/vendor/libgit2/src/merge_file.h +0 -14
  55. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.c +0 -343
  56. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -93
  57. data/vendor/libgit2/src/win32/w32_stack.c +0 -192
  58. data/vendor/libgit2/src/win32/w32_stack.h +0 -138
@@ -29,14 +29,7 @@ static int git_sysdir_guess_global_dirs(git_buf *out)
29
29
  #ifdef GIT_WIN32
30
30
  return git_win32__find_global_dirs(out);
31
31
  #else
32
- int error = git__getenv(out, "HOME");
33
-
34
- if (error == GIT_ENOTFOUND) {
35
- giterr_clear();
36
- error = 0;
37
- }
38
-
39
- return error;
32
+ return git_buf_sets(out, getenv("HOME"));
40
33
  #endif
41
34
  }
42
35
 
@@ -45,22 +38,15 @@ static int git_sysdir_guess_xdg_dirs(git_buf *out)
45
38
  #ifdef GIT_WIN32
46
39
  return git_win32__find_xdg_dirs(out);
47
40
  #else
48
- git_buf env = GIT_BUF_INIT;
49
- int error;
50
-
51
- if ((error = git__getenv(&env, "XDG_CONFIG_HOME")) == 0)
52
- error = git_buf_joinpath(out, env.ptr, "git");
41
+ const char *env = NULL;
53
42
 
54
- if (error == GIT_ENOTFOUND && (error = git__getenv(&env, "HOME")) == 0)
55
- error = git_buf_joinpath(out, env.ptr, ".config/git");
43
+ if ((env = getenv("XDG_CONFIG_HOME")) != NULL)
44
+ return git_buf_joinpath(out, env, "git");
45
+ else if ((env = getenv("HOME")) != NULL)
46
+ return git_buf_joinpath(out, env, ".config/git");
56
47
 
57
- if (error == GIT_ENOTFOUND) {
58
- giterr_clear();
59
- error = 0;
60
- }
61
-
62
- git_buf_free(&env);
63
- return error;
48
+ git_buf_clear(out);
49
+ return 0;
64
50
  #endif
65
51
  }
66
52
 
@@ -36,6 +36,8 @@ static const char *post_verb = "POST";
36
36
 
37
37
  #define PARSE_ERROR_GENERIC -1
38
38
  #define PARSE_ERROR_REPLAY -2
39
+ /** Look at the user field */
40
+ #define PARSE_ERROR_EXT -3
39
41
 
40
42
  #define CHUNK_SIZE 4096
41
43
 
@@ -78,6 +80,7 @@ typedef struct {
78
80
  git_vector www_authenticate;
79
81
  enum last_cb last_cb;
80
82
  int parse_error;
83
+ int error;
81
84
  unsigned parse_finished : 1;
82
85
 
83
86
  /* Authentication */
@@ -351,7 +354,8 @@ static int on_headers_complete(http_parser *parser)
351
354
  if (error == GIT_PASSTHROUGH) {
352
355
  no_callback = 1;
353
356
  } else if (error < 0) {
354
- return PARSE_ERROR_GENERIC;
357
+ t->error = error;
358
+ return t->parse_error = PARSE_ERROR_EXT;
355
359
  } else {
356
360
  assert(t->cred);
357
361
 
@@ -712,6 +716,10 @@ replay:
712
716
  goto replay;
713
717
  }
714
718
 
719
+ if (t->parse_error == PARSE_ERROR_EXT) {
720
+ return t->error;
721
+ }
722
+
715
723
  if (t->parse_error < 0)
716
724
  return -1;
717
725
 
@@ -957,7 +957,7 @@ int git_smart__push(git_transport *transport, git_push *push, const git_remote_c
957
957
 
958
958
  packbuilder_payload.pb = push->pb;
959
959
 
960
- if (cbs && cbs->transfer_progress) {
960
+ if (cbs && cbs->push_transfer_progress) {
961
961
  packbuilder_payload.cb = cbs->push_transfer_progress;
962
962
  packbuilder_payload.cb_payload = cbs->payload;
963
963
  }
@@ -527,10 +527,10 @@ static int _git_ssh_setup_conn(
527
527
  goto done;
528
528
 
529
529
  if (t->owner->certificate_check_cb != NULL) {
530
- git_cert_hostkey cert = {{ 0 }}, *cert_ptr;
530
+ git_cert_hostkey cert = { 0 }, *cert_ptr;
531
531
  const char *key;
532
532
 
533
- cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
533
+ cert.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
534
534
 
535
535
  key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
536
536
  if (key != NULL) {
@@ -228,7 +228,7 @@ static int certificate_check(winhttp_stream *s, int valid)
228
228
  }
229
229
 
230
230
  giterr_clear();
231
- cert.parent.cert_type = GIT_CERT_X509;
231
+ cert.cert_type = GIT_CERT_X509;
232
232
  cert.data = cert_ctx->pbCertEncoded;
233
233
  cert.len = cert_ctx->cbCertEncoded;
234
234
  error = t->owner->certificate_check_cb((git_cert *) &cert, valid, t->connection_data.host, t->owner->cred_acquire_payload);
@@ -10,10 +10,6 @@
10
10
  #include <ctype.h>
11
11
  #include "posix.h"
12
12
 
13
- #ifdef GIT_WIN32
14
- # include "win32/w32_buffer.h"
15
- #endif
16
-
17
13
  #ifdef _MSC_VER
18
14
  # include <Shlwapi.h>
19
15
  #endif
@@ -769,47 +765,3 @@ int git__utf8_iterate(const uint8_t *str, int str_len, int32_t *dst)
769
765
  *dst = uc;
770
766
  return length;
771
767
  }
772
-
773
- #ifdef GIT_WIN32
774
- int git__getenv(git_buf *out, const char *name)
775
- {
776
- wchar_t *wide_name = NULL, *wide_value = NULL;
777
- DWORD value_len;
778
- int error = -1;
779
-
780
- git_buf_clear(out);
781
-
782
- if (git__utf8_to_16_alloc(&wide_name, name) < 0)
783
- return -1;
784
-
785
- if ((value_len = GetEnvironmentVariableW(wide_name, NULL, 0)) > 0) {
786
- wide_value = git__malloc(value_len * sizeof(wchar_t));
787
- GITERR_CHECK_ALLOC(wide_value);
788
-
789
- value_len = GetEnvironmentVariableW(wide_name, wide_value, value_len);
790
- }
791
-
792
- if (value_len)
793
- error = git_buf_put_w(out, wide_value, value_len);
794
- else if (GetLastError() == ERROR_ENVVAR_NOT_FOUND)
795
- error = GIT_ENOTFOUND;
796
- else
797
- giterr_set(GITERR_OS, "could not read environment variable '%s'", name);
798
-
799
- git__free(wide_name);
800
- git__free(wide_value);
801
- return error;
802
- }
803
- #else
804
- int git__getenv(git_buf *out, const char *name)
805
- {
806
- const char *val = getenv(name);
807
-
808
- git_buf_clear(out);
809
-
810
- if (!val)
811
- return GIT_ENOTFOUND;
812
-
813
- return git_buf_puts(out, val);
814
- }
815
- #endif
@@ -7,9 +7,6 @@
7
7
  #ifndef INCLUDE_util_h__
8
8
  #define INCLUDE_util_h__
9
9
 
10
- #include "git2/buffer.h"
11
- #include "buffer.h"
12
-
13
10
  #if defined(GIT_MSVC_CRTDBG)
14
11
  /* Enable MSVC CRTDBG memory leak reporting.
15
12
  *
@@ -38,7 +35,6 @@
38
35
  */
39
36
  #include <stdlib.h>
40
37
  #include <crtdbg.h>
41
- #include "win32/w32_crtdbg_stacktrace.h"
42
38
  #endif
43
39
 
44
40
  #include "common.h"
@@ -66,24 +62,23 @@
66
62
  #define CONST_STRLEN(x) ((sizeof(x)/sizeof(x[0])) - 1)
67
63
 
68
64
  #if defined(GIT_MSVC_CRTDBG)
69
-
70
65
  GIT_INLINE(void *) git__crtdbg__malloc(size_t len, const char *file, int line)
71
66
  {
72
- void *ptr = _malloc_dbg(len, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line);
67
+ void *ptr = _malloc_dbg(len, _NORMAL_BLOCK, file, line);
73
68
  if (!ptr) giterr_set_oom();
74
69
  return ptr;
75
70
  }
76
71
 
77
72
  GIT_INLINE(void *) git__crtdbg__calloc(size_t nelem, size_t elsize, const char *file, int line)
78
73
  {
79
- void *ptr = _calloc_dbg(nelem, elsize, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line);
74
+ void *ptr = _calloc_dbg(nelem, elsize, _NORMAL_BLOCK, file, line);
80
75
  if (!ptr) giterr_set_oom();
81
76
  return ptr;
82
77
  }
83
78
 
84
79
  GIT_INLINE(char *) git__crtdbg__strdup(const char *str, const char *file, int line)
85
80
  {
86
- char *ptr = _strdup_dbg(str, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line);
81
+ char *ptr = _strdup_dbg(str, _NORMAL_BLOCK, file, line);
87
82
  if (!ptr) giterr_set_oom();
88
83
  return ptr;
89
84
  }
@@ -123,7 +118,7 @@ GIT_INLINE(char *) git__crtdbg__substrdup(const char *start, size_t n, const cha
123
118
 
124
119
  GIT_INLINE(void *) git__crtdbg__realloc(void *ptr, size_t size, const char *file, int line)
125
120
  {
126
- void *new_ptr = _realloc_dbg(ptr, size, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line);
121
+ void *new_ptr = _realloc_dbg(ptr, size, _NORMAL_BLOCK, file, line);
127
122
  if (!new_ptr) giterr_set_oom();
128
123
  return new_ptr;
129
124
  }
@@ -131,9 +126,8 @@ GIT_INLINE(void *) git__crtdbg__realloc(void *ptr, size_t size, const char *file
131
126
  GIT_INLINE(void *) git__crtdbg__reallocarray(void *ptr, size_t nelem, size_t elsize, const char *file, int line)
132
127
  {
133
128
  size_t newsize;
134
-
135
129
  return GIT_MULTIPLY_SIZET_OVERFLOW(&newsize, nelem, elsize) ?
136
- NULL : _realloc_dbg(ptr, newsize, _NORMAL_BLOCK, git_win32__crtdbg_stacktrace(1,file), line);
130
+ NULL : _realloc_dbg(ptr, newsize, _NORMAL_BLOCK, file, line);
137
131
  }
138
132
 
139
133
  GIT_INLINE(void *) git__crtdbg__mallocarray(size_t nelem, size_t elsize, const char *file, int line)
@@ -602,6 +596,4 @@ GIT_INLINE(double) git__timer(void)
602
596
 
603
597
  #endif
604
598
 
605
- extern int git__getenv(git_buf *out, const char *name);
606
-
607
599
  #endif /* INCLUDE_util_h__ */
@@ -11,8 +11,6 @@
11
11
  #include "utf-conv.h"
12
12
  #include "repository.h"
13
13
  #include "reparse.h"
14
- #include "global.h"
15
- #include "buffer.h"
16
14
  #include <errno.h>
17
15
  #include <io.h>
18
16
  #include <fcntl.h>
@@ -20,6 +20,8 @@
20
20
  *
21
21
  */
22
22
 
23
+ #include "util.h"
24
+
23
25
  #if !defined(XDIFF_H)
24
26
  #define XDIFF_H
25
27
 
@@ -106,9 +108,9 @@ typedef struct s_bdiffparam {
106
108
  } bdiffparam_t;
107
109
 
108
110
 
109
- #define xdl_malloc(x) malloc(x)
110
- #define xdl_free(ptr) free(ptr)
111
- #define xdl_realloc(ptr,x) realloc(ptr,x)
111
+ #define xdl_malloc(x) git__malloc(x)
112
+ #define xdl_free(ptr) git__free(ptr)
113
+ #define xdl_realloc(ptr,x) git__realloc(ptr,x)
112
114
 
113
115
  void *xdl_mmfile_first(mmfile_t *mmf, long *size);
114
116
  long xdl_mmfile_size(mmfile_t *mmf);
@@ -21,7 +21,8 @@
21
21
  */
22
22
 
23
23
  #include "xinclude.h"
24
-
24
+ #include "common.h"
25
+ #include "integer.h"
25
26
 
26
27
 
27
28
  #define XDL_MAX_COST_MIN 256
@@ -323,7 +324,7 @@ int xdl_recs_cmp(diffdata_t *dd1, long off1, long lim1,
323
324
 
324
325
  int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
325
326
  xdfenv_t *xe) {
326
- long ndiags;
327
+ size_t ndiags, allocsize;
327
328
  long *kvd, *kvdf, *kvdb;
328
329
  xdalgoenv_t xenv;
329
330
  diffdata_t dd1, dd2;
@@ -343,9 +344,12 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
343
344
  * Allocate and setup K vectors to be used by the differential algorithm.
344
345
  * One is to store the forward path and one to store the backward path.
345
346
  */
346
- ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3;
347
- if (!(kvd = (long *) xdl_malloc((2 * ndiags + 2) * sizeof(long)))) {
347
+ GITERR_CHECK_ALLOC_ADD3(&ndiags, xe->xdf1.nreff, xe->xdf2.nreff, 3);
348
+ GITERR_CHECK_ALLOC_MULTIPLY(&allocsize, ndiags, 2);
349
+ GITERR_CHECK_ALLOC_ADD(&allocsize, allocsize, 2);
350
+ GITERR_CHECK_ALLOC_MULTIPLY(&allocsize, allocsize, sizeof(long));
348
351
 
352
+ if (!(kvd = (long *) xdl_malloc(allocsize))) {
349
353
  xdl_free_env(xe);
350
354
  return -1;
351
355
  }
@@ -44,6 +44,7 @@
44
44
  #include "xinclude.h"
45
45
  #include "xtypes.h"
46
46
  #include "xdiff.h"
47
+ #include "common.h"
47
48
 
48
49
  #define MAX_PTR UINT_MAX
49
50
  #define MAX_CNT UINT_MAX
@@ -271,7 +272,7 @@ static int histogram_diff(
271
272
  {
272
273
  struct histindex index;
273
274
  struct region lcs;
274
- unsigned int sz;
275
+ size_t sz;
275
276
  int result = -1;
276
277
 
277
278
  if (count1 <= 0 && count2 <= 0)
@@ -302,7 +303,8 @@ static int histogram_diff(
302
303
 
303
304
  index.table_bits = xdl_hashbits(count1);
304
305
  sz = index.records_size = 1 << index.table_bits;
305
- sz *= sizeof(struct record *);
306
+ GITERR_CHECK_ALLOC_MULTIPLY(&sz, sz, sizeof(struct record *));
307
+
306
308
  if (!(index.records = (struct record **) xdl_malloc(sz)))
307
309
  goto cleanup;
308
310
  memset(index.records, 0, sz);
@@ -21,6 +21,7 @@
21
21
  */
22
22
 
23
23
  #include "xinclude.h"
24
+ #include "common.h"
24
25
 
25
26
  typedef struct s_xdmerge {
26
27
  struct s_xdmerge *next;
@@ -109,59 +110,74 @@ static int xdl_merge_cmp_lines(xdfenv_t *xe1, int i1, xdfenv_t *xe2, int i2,
109
110
  return 0;
110
111
  }
111
112
 
112
- static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int add_nl, char *dest)
113
+ static int xdl_recs_copy_0(size_t *out, int use_orig, xdfenv_t *xe, int i, int count, int add_nl, char *dest)
113
114
  {
114
115
  xrecord_t **recs;
115
- int size = 0;
116
+ size_t size = 0;
117
+
118
+ *out = 0;
116
119
 
117
120
  recs = (use_orig ? xe->xdf1.recs : xe->xdf2.recs) + i;
118
121
 
119
122
  if (count < 1)
120
123
  return 0;
121
124
 
122
- for (i = 0; i < count; size += recs[i++]->size)
125
+ for (i = 0; i < count; ) {
123
126
  if (dest)
124
127
  memcpy(dest + size, recs[i]->ptr, recs[i]->size);
128
+
129
+ GITERR_CHECK_ALLOC_ADD(&size, size, recs[i++]->size);
130
+ }
131
+
125
132
  if (add_nl) {
126
133
  i = recs[count - 1]->size;
127
134
  if (i == 0 || recs[count - 1]->ptr[i - 1] != '\n') {
128
135
  if (dest)
129
136
  dest[size] = '\n';
130
- size++;
137
+
138
+ GITERR_CHECK_ALLOC_ADD(&size, size, 1);
131
139
  }
132
140
  }
133
- return size;
141
+
142
+ *out = size;
143
+ return 0;
134
144
  }
135
145
 
136
- static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest)
146
+ static int xdl_recs_copy(size_t *out, xdfenv_t *xe, int i, int count, int add_nl, char *dest)
137
147
  {
138
- return xdl_recs_copy_0(0, xe, i, count, add_nl, dest);
148
+ return xdl_recs_copy_0(out, 0, xe, i, count, add_nl, dest);
139
149
  }
140
150
 
141
- static int xdl_orig_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest)
151
+ static int xdl_orig_copy(size_t *out, xdfenv_t *xe, int i, int count, int add_nl, char *dest)
142
152
  {
143
- return xdl_recs_copy_0(1, xe, i, count, add_nl, dest);
153
+ return xdl_recs_copy_0(out, 1, xe, i, count, add_nl, dest);
144
154
  }
145
155
 
146
- static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
156
+ static int fill_conflict_hunk(size_t *out, xdfenv_t *xe1, const char *name1,
147
157
  xdfenv_t *xe2, const char *name2,
148
158
  const char *name3,
149
- int size, int i, int style,
159
+ size_t size, int i, int style,
150
160
  xdmerge_t *m, char *dest, int marker_size)
151
161
  {
152
162
  int marker1_size = (name1 ? (int)strlen(name1) + 1 : 0);
153
163
  int marker2_size = (name2 ? (int)strlen(name2) + 1 : 0);
154
164
  int marker3_size = (name3 ? (int)strlen(name3) + 1 : 0);
165
+ size_t copied;
166
+
167
+ *out = 0;
155
168
 
156
169
  if (marker_size <= 0)
157
170
  marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
158
171
 
159
172
  /* Before conflicting part */
160
- size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
161
- dest ? dest + size : NULL);
173
+ if (xdl_recs_copy(&copied, xe1, i, m->i1 - i, 0,
174
+ dest ? dest + size : NULL) < 0)
175
+ return -1;
176
+
177
+ GITERR_CHECK_ALLOC_ADD(&size, size, copied);
162
178
 
163
179
  if (!dest) {
164
- size += marker_size + 1 + marker1_size;
180
+ GITERR_CHECK_ALLOC_ADD4(&size, size, marker_size, 1, marker1_size);
165
181
  } else {
166
182
  memset(dest + size, '<', marker_size);
167
183
  size += marker_size;
@@ -174,13 +190,16 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
174
190
  }
175
191
 
176
192
  /* Postimage from side #1 */
177
- size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
178
- dest ? dest + size : NULL);
193
+ if (xdl_recs_copy(&copied, xe1, m->i1, m->chg1, 1,
194
+ dest ? dest + size : NULL) < 0)
195
+ return -1;
196
+
197
+ GITERR_CHECK_ALLOC_ADD(&size, size, copied);
179
198
 
180
199
  if (style == XDL_MERGE_DIFF3) {
181
200
  /* Shared preimage */
182
201
  if (!dest) {
183
- size += marker_size + 1 + marker3_size;
202
+ GITERR_CHECK_ALLOC_ADD4(&size, size, marker_size, 1, marker3_size);
184
203
  } else {
185
204
  memset(dest + size, '|', marker_size);
186
205
  size += marker_size;
@@ -191,12 +210,15 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
191
210
  }
192
211
  dest[size++] = '\n';
193
212
  }
194
- size += xdl_orig_copy(xe1, m->i0, m->chg0, 1,
195
- dest ? dest + size : NULL);
213
+
214
+ if (xdl_orig_copy(&copied, xe1, m->i0, m->chg0, 1,
215
+ dest ? dest + size : NULL) < 0)
216
+ return -1;
217
+ GITERR_CHECK_ALLOC_ADD(&size, size, copied);
196
218
  }
197
219
 
198
220
  if (!dest) {
199
- size += marker_size + 1;
221
+ GITERR_CHECK_ALLOC_ADD3(&size, size, marker_size, 1);
200
222
  } else {
201
223
  memset(dest + size, '=', marker_size);
202
224
  size += marker_size;
@@ -204,10 +226,14 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
204
226
  }
205
227
 
206
228
  /* Postimage from side #2 */
207
- size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
208
- dest ? dest + size : NULL);
229
+
230
+ if (xdl_recs_copy(&copied, xe2, m->i2, m->chg2, 1,
231
+ dest ? dest + size : NULL) < 0)
232
+ return -1;
233
+ GITERR_CHECK_ALLOC_ADD(&size, size, copied);
234
+
209
235
  if (!dest) {
210
- size += marker_size + 1 + marker2_size;
236
+ GITERR_CHECK_ALLOC_ADD4(&size, size, marker_size, 1, marker2_size);
211
237
  } else {
212
238
  memset(dest + size, '>', marker_size);
213
239
  size += marker_size;
@@ -218,46 +244,69 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
218
244
  }
219
245
  dest[size++] = '\n';
220
246
  }
221
- return size;
247
+
248
+ *out = size;
249
+ return 0;
222
250
  }
223
251
 
224
- static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
252
+ static int xdl_fill_merge_buffer(size_t *out,
253
+ xdfenv_t *xe1, const char *name1,
225
254
  xdfenv_t *xe2, const char *name2,
226
255
  const char *ancestor_name,
227
256
  int favor,
228
257
  xdmerge_t *m, char *dest, int style,
229
258
  int marker_size)
230
259
  {
231
- int size, i;
260
+ size_t size, copied;
261
+ int i;
262
+
263
+ *out = 0;
232
264
 
233
265
  for (size = i = 0; m; m = m->next) {
234
266
  if (favor && !m->mode)
235
267
  m->mode = favor;
236
268
 
237
- if (m->mode == 0)
238
- size = fill_conflict_hunk(xe1, name1, xe2, name2,
269
+ if (m->mode == 0) {
270
+ if (fill_conflict_hunk(&size, xe1, name1, xe2, name2,
239
271
  ancestor_name,
240
272
  size, i, style, m, dest,
241
- marker_size);
273
+ marker_size) < 0)
274
+ return -1;
275
+ }
242
276
  else if (m->mode & 3) {
243
277
  /* Before conflicting part */
244
- size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
245
- dest ? dest + size : NULL);
278
+ if (xdl_recs_copy(&copied, xe1, i, m->i1 - i, 0,
279
+ dest ? dest + size : NULL) < 0)
280
+ return -1;
281
+ GITERR_CHECK_ALLOC_ADD(&size, size, copied);
282
+
246
283
  /* Postimage from side #1 */
247
- if (m->mode & 1)
248
- size += xdl_recs_copy(xe1, m->i1, m->chg1, (m->mode & 2),
249
- dest ? dest + size : NULL);
284
+ if (m->mode & 1) {
285
+ if (xdl_recs_copy(&copied, xe1, m->i1, m->chg1, (m->mode & 2),
286
+ dest ? dest + size : NULL) < 0)
287
+ return -1;
288
+ GITERR_CHECK_ALLOC_ADD(&size, size, copied);
289
+ }
290
+
250
291
  /* Postimage from side #2 */
251
- if (m->mode & 2)
252
- size += xdl_recs_copy(xe2, m->i2, m->chg2, 0,
253
- dest ? dest + size : NULL);
292
+ if (m->mode & 2) {
293
+ if (xdl_recs_copy(&copied, xe2, m->i2, m->chg2, 0,
294
+ dest ? dest + size : NULL) < 0)
295
+ return -1;
296
+ GITERR_CHECK_ALLOC_ADD(&size, size, copied);
297
+ }
254
298
  } else
255
299
  continue;
256
300
  i = m->i1 + m->chg1;
257
301
  }
258
- size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0,
259
- dest ? dest + size : NULL);
260
- return size;
302
+
303
+ if (xdl_recs_copy(&copied, xe1, i, xe1->xdf2.nrec - i, 0,
304
+ dest ? dest + size : NULL) < 0)
305
+ return -1;
306
+ GITERR_CHECK_ALLOC_ADD(&size, size, copied);
307
+
308
+ *out = size;
309
+ return 0;
261
310
  }
262
311
 
263
312
  /*
@@ -551,19 +600,24 @@ static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1,
551
600
  /* output */
552
601
  if (result) {
553
602
  int marker_size = xmp->marker_size;
554
- int size = xdl_fill_merge_buffer(xe1, name1, xe2, name2,
603
+ size_t size;
604
+
605
+ if (xdl_fill_merge_buffer(&size, xe1, name1, xe2, name2,
555
606
  ancestor_name,
556
607
  favor, changes, NULL, style,
557
- marker_size);
608
+ marker_size) < 0)
609
+ return -1;
610
+
558
611
  result->ptr = xdl_malloc(size);
559
612
  if (!result->ptr) {
560
613
  xdl_cleanup_merge(changes);
561
614
  return -1;
562
615
  }
563
616
  result->size = size;
564
- xdl_fill_merge_buffer(xe1, name1, xe2, name2,
617
+ if (xdl_fill_merge_buffer(&size, xe1, name1, xe2, name2,
565
618
  ancestor_name, favor, changes,
566
- result->ptr, style, marker_size);
619
+ result->ptr, style, marker_size) < 0)
620
+ return -1;
567
621
  }
568
622
  return xdl_cleanup_merge(changes);
569
623
  }