threads / patch / 37437

patch, 2 partsfast-import: fix segfault and tests

Subject: [PATCH 0/2] fast-import: fix segfault and tests

## tl;dr

7 messages between Aug 28, 2014 and Aug 29, 2014. Diffs are folded; open one to read it.

replies: 6people: 2as markdown or json

Maxim Bublis· Aug 28, 2014, 14:54 UTC · lore

Removing root tree with filedelete command would lead to segmentation fault in store_tree(). First patch from patch series adds test to show incorrect behaviour and second one fixes bug by sanity check and load_tree() usage.

Maxim Bublis (2):
  t9300: test filedelete root
  fast-import: fix segfault in store_tree()
 fast-import.c          |  6 +++++-
 t/t9300-fast-import.sh | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)
-- 
1.8.5.2 (Apple Git-48)
Maxim Bublis· Aug 28, 2014, 14:54 UTC · re: Maxim Bublis · lore

[PATCH 1/2] t9300: test filedelete root

Add new fast-import test series for filedelete command.
Signed-off-by: Maxim Bublis <satori@yandex-team.ru>
---
 t/t9300-fast-import.sh | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)
Show changes to t/t9300-fast-import.sh +46 −0
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index 5fc9ef2..3d557b3 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -3017,4 +3017,50 @@ test_expect_success 'T: empty reset doesnt delete branch' '
 	git rev-parse --verify refs/heads/not-to-delete
 '
 
+###
+### series U (filedelete)
+###
+
+cat >input <<INPUT_END
+commit refs/heads/U
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+data <<COMMIT
+test setup
+COMMIT
+M 100644 inline hello.c
+data <<BLOB
+blob 1
+BLOB
+
+INPUT_END
+
+test_expect_success 'U: initialize for U tests' '
+	git fast-import <input
+'
+
+cat >input <<INPUT_END
+commit refs/heads/U
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+data <<COMMIT
+must succeed
+COMMIT
+from refs/heads/U^0
+D ""
+
+INPUT_END
+
+test_expect_success 'U: filedelete root succeeds' '
+    git fast-import <input
+'
+
+cat >expect <<EOF
+:100644 000000 c18147dc648481eeb65dc5e66628429a64843327 0000000000000000000000000000000000000000 D	hello.c
+EOF
+
+git diff-tree -M -r U^1 U >actual
+
+test_expect_success 'U: validate filedelete result' '
+	compare_diff_raw expect actual
+'
+
 test_done
-- 
1.8.5.2 (Apple Git-48)
Junio C Hamano· Aug 28, 2014, 22:30 UTC · re: Maxim Bublis · lore

Re: [PATCH 1/2] t9300: test filedelete root

Maxim Bublis <satori@yandex-team.ru> writes:
> Add new fast-import test series for filedelete command.
>
> Signed-off-by: Maxim Bublis <satori@yandex-team.ru>
> ---

You may have been concentrating on the "delete root" case, but as long as you claim "We add a series to test filedelete command", it would be sensible to test more typical cases of deleting files, not the entire tree as well, no? Perhaps add three paths in the initial commit e.g. hello.c, good/night.txt and good/bye.txt, first remove good/night.txt and validate the result, then remove good/ directory and validate the result, and finally remove the whole thing and validate the result, or something like that?

In a patch series that introduces a demonstration of existing breakage and then fixes the breakage in a separate patch, mark the test that shows the known breakage with test_expect_failure and then turn that line into test_expect_success in the later patch that fixes the breakage.

What the test checks and the fix in 2/2 both looked sensible from a cursory read.

Thanks.
Show 58 quoted lines
>  t/t9300-fast-import.sh | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 46 insertions(+)
>
> diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
> index 5fc9ef2..3d557b3 100755
> --- a/t/t9300-fast-import.sh
> +++ b/t/t9300-fast-import.sh
> @@ -3017,4 +3017,50 @@ test_expect_success 'T: empty reset doesnt delete branch' '
>  	git rev-parse --verify refs/heads/not-to-delete
>  '
>  
> +###
> +### series U (filedelete)
> +###
> +
> +cat >input <<INPUT_END
> +commit refs/heads/U
> +committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
> +data <<COMMIT
> +test setup
> +COMMIT
> +M 100644 inline hello.c
> +data <<BLOB
> +blob 1
> +BLOB
> +
> +INPUT_END
> +
> +test_expect_success 'U: initialize for U tests' '
> +	git fast-import <input
> +'
> +
> +cat >input <<INPUT_END
> +commit refs/heads/U
> +committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
> +data <<COMMIT
> +must succeed
> +COMMIT
> +from refs/heads/U^0
> +D ""
> +
> +INPUT_END
> +
> +test_expect_success 'U: filedelete root succeeds' '
> +    git fast-import <input
> +'
> +
> +cat >expect <<EOF
> +:100644 000000 c18147dc648481eeb65dc5e66628429a64843327 0000000000000000000000000000000000000000 D	hello.c
> +EOF
> +
> +git diff-tree -M -r U^1 U >actual
> +
> +test_expect_success 'U: validate filedelete result' '
> +	compare_diff_raw expect actual
> +'
> +
>  test_done
Maxim Bublis· Aug 29, 2014, 11:37 UTC · re: Junio C Hamano · lore

Re: [PATCH 1/2] t9300: test filedelete root

On 29 авг. 2014 г., at 2:30, Junio C Hamano <gitster@pobox.com> wrote:
Show 8 quoted lines
> You may have been concentrating on the "delete root" case, but as
> long as you claim "We add a series to test filedelete command", it
> would be sensible to test more typical cases of deleting files, not
> the entire tree as well, no?  Perhaps add three paths in the initial
> commit e.g. hello.c, good/night.txt and good/bye.txt, first remove
> good/night.txt and validate the result, then remove good/ directory
> and validate the result, and finally remove the whole thing and
> validate the result, or something like that?
Sure, I’ll add more tests for filedelete command.
Show 5 quoted lines
> In a patch series that introduces a demonstration of existing
> breakage and then fixes the breakage in a separate patch, mark the
> test that shows the known breakage with test_expect_failure and then
> turn that line into test_expect_success in the later patch that
> fixes the breakage.
Ok, thanks.
Maxim Bublis· Aug 28, 2014, 14:54 UTC · re: Maxim Bublis · lore

[PATCH 2/2] fast-import: fix segfault in store_tree()

Branch tree is NULLified by filedelete command if we are trying to delete root tree. Add sanity check and use load_tree() in that case.

Signed-off-by: Maxim Bublis <satori@yandex-team.ru>
---
 fast-import.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
Show changes to fast-import.c +5 −1
diff --git a/fast-import.c b/fast-import.c
index d73f58c..b77f12c 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -1419,7 +1419,7 @@ static void mktree(struct tree_content *t, int v, struct strbuf *b)
 
 static void store_tree(struct tree_entry *root)
 {
-	struct tree_content *t = root->tree;
+	struct tree_content *t;
 	unsigned int i, j, del;
 	struct last_object lo = { STRBUF_INIT, 0, 0, /* no_swap */ 1 };
 	struct object_entry *le = NULL;
@@ -1427,6 +1427,10 @@ static void store_tree(struct tree_entry *root)
 	if (!is_null_sha1(root->versions[1].sha1))
 		return;
 
+	if (!root->tree)
+		load_tree(root)
+	t = root->tree;
+
 	for (i = 0; i < t->entry_count; i++) {
 		if (t->entries[i]->tree)
 			store_tree(t->entries[i]);
-- 
1.8.5.2 (Apple Git-48)
Junio C Hamano· Aug 28, 2014, 23:16 UTC · re: Maxim Bublis · lore

Re: [PATCH 2/2] fast-import: fix segfault in store_tree()

Maxim Bublis <satori@yandex-team.ru> writes:
Show 27 quoted lines
> Branch tree is NULLified by filedelete command if we are trying
> to delete root tree. Add sanity check and use load_tree() in that case.
>
> Signed-off-by: Maxim Bublis <satori@yandex-team.ru>
> ---
>  fast-import.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/fast-import.c b/fast-import.c
> index d73f58c..b77f12c 100644
> --- a/fast-import.c
> +++ b/fast-import.c
> @@ -1419,7 +1419,7 @@ static void mktree(struct tree_content *t, int v, struct strbuf *b)
>  
>  static void store_tree(struct tree_entry *root)
>  {
> -	struct tree_content *t = root->tree;
> +	struct tree_content *t;
>  	unsigned int i, j, del;
>  	struct last_object lo = { STRBUF_INIT, 0, 0, /* no_swap */ 1 };
>  	struct object_entry *le = NULL;
> @@ -1427,6 +1427,10 @@ static void store_tree(struct tree_entry *root)
>  	if (!is_null_sha1(root->versions[1].sha1))
>  		return;
>  
> +	if (!root->tree)
> +		load_tree(root)
Missing ';'
Show 5 quoted lines
> +	t = root->tree;
> +
>  	for (i = 0; i < t->entry_count; i++) {
>  		if (t->entries[i]->tree)
>  			store_tree(t->entries[i]);
Maxim Bublis· Aug 29, 2014, 11:40 UTC · re: Junio C Hamano · lore

Re: [PATCH 2/2] fast-import: fix segfault in store_tree()

On 29 авг. 2014 г., at 3:16, Junio C Hamano <gitster@pobox.com> wrote:
> Missing ‘;'
Thanks, I’ll fix it. What a stupid mistype, I was writing some amount of Go code recently and it doesn’t use semicolons.

← back to recent threads