summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xt/t9011-svn-da.sh5
-rw-r--r--vcs-svn/svndiff.c7
2 files changed, 10 insertions, 2 deletions
diff --git a/t/t9011-svn-da.sh b/t/t9011-svn-da.sh
index 26a4a36..d9acd0c 100755
--- a/t/t9011-svn-da.sh
+++ b/t/t9011-svn-da.sh
@@ -133,4 +133,9 @@ test_expect_success 'reject truncated inline data' '
test_must_fail test-svn-fe -d preimage inline.trunc 10
'
+test_expect_success 'reject truncated inline data (after instruction section)' '
+ printf "SVNQ%b%b%s" "QQ\001\001\003" "\0201" "b" | q_to_nul >insn.trunc &&
+ test_must_fail test-svn-fe -d preimage insn.trunc 11
+'
+
test_done
diff --git a/vcs-svn/svndiff.c b/vcs-svn/svndiff.c
index 175168f..8968fdb 100644
--- a/vcs-svn/svndiff.c
+++ b/vcs-svn/svndiff.c
@@ -25,13 +25,15 @@
#define VLI_BITS_PER_DIGIT 7
struct window {
+ struct strbuf instructions;
struct strbuf data;
};
-#define WINDOW_INIT { STRBUF_INIT }
+#define WINDOW_INIT { STRBUF_INIT, STRBUF_INIT }
static void window_release(struct window *ctx)
{
+ strbuf_release(&ctx->instructions);
strbuf_release(&ctx->data);
}
@@ -124,7 +126,8 @@ static int apply_one_window(struct line_buffer *delta, off_t *delta_len)
/* "source view" offset and length already handled; */
if (read_length(delta, &out_len, delta_len) ||
read_length(delta, &instructions_len, delta_len) ||
- read_length(delta, &data_len, delta_len))
+ read_length(delta, &data_len, delta_len) ||
+ read_chunk(delta, delta_len, &ctx.instructions, instructions_len))
goto error_out;
if (instructions_len) {
error("What do you think I am? A delta applier?");