Merge pull request #6303 from zawata/legacy_buffer_stream_segfault filter: Fix Segfault
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
diff --git a/src/libgit2/filter.c b/src/libgit2/filter.c
index 20b2157..80a3cae 100644
--- a/src/libgit2/filter.c
+++ b/src/libgit2/filter.c
@@ -893,6 +893,17 @@ static int buffered_stream_write(
return git_str_put(&buffered_stream->input, buffer, len);
}
+#ifndef GIT_DEPRECATE_HARD
+# define BUF_TO_STRUCT(b, s) \
+ (b)->ptr = (s)->ptr; \
+ (b)->size = (s)->size; \
+ (b)->reserved = (s)->asize;
+# define STRUCT_TO_BUF(s, b) \
+ (s)->ptr = (b)->ptr; \
+ (s)->size = (b)->size; \
+ (s)->asize = (b)->reserved;
+#endif
+
static int buffered_stream_close(git_writestream *s)
{
struct buffered_stream *buffered_stream = (struct buffered_stream *)s;
@@ -902,6 +913,25 @@ static int buffered_stream_close(git_writestream *s)
GIT_ASSERT_ARG(buffered_stream);
+#ifndef GIT_DEPRECATE_HARD
+ if (buffered_stream->write_fn == NULL) {
+ git_buf legacy_output = GIT_BUF_INIT,
+ legacy_input = GIT_BUF_INIT;
+
+ BUF_TO_STRUCT(&legacy_output, buffered_stream->output);
+ BUF_TO_STRUCT(&legacy_input, &buffered_stream->input);
+
+ error = buffered_stream->legacy_write_fn(
+ buffered_stream->filter,
+ buffered_stream->payload,
+ &legacy_output,
+ &legacy_input,
+ buffered_stream->source);
+
+ STRUCT_TO_BUF(buffered_stream->output, &legacy_output);
+ STRUCT_TO_BUF(&buffered_stream->input, &legacy_input);
+ } else
+#endif
error = buffered_stream->write_fn(
buffered_stream->filter,
buffered_stream->payload,