rugged 0.23.2 → 0.23.3

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 (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
  }