git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] fsck: check skiplist for object in fsck_blob()

From
Ramsay Jones <ramsay@ramsayjones.plus.com>
Date
Jul 13, 2018, 19:37 UTC
Message-ID
<6b323eff-a0a6-d8d3-1e40-70af8299db5f@ramsayjones.plus.com>
In-Reply-To
<2ad1b00c-70ff-c4b2-8cbc-9ef55c174221@ramsayjones.plus.com>
On 11/07/18 20:31, Ramsay Jones wrote:
> On 07/07/18 02:32, Jeff King wrote:
[snip]
Show 37 quoted lines
>> Hmm, we seem to have "info" these days, so maybe that would do what I
>> want. I.e., I wonder if the patch below does everything we'd want. It's
>> late here and I probably won't get back to this until Monday, but you
>> may want to play with it in the meantime.
> 
> Sorry, I've been busy with other things and have not had the
> time to try the patch below (still trying to catch up with
> the mailing-list emails!).
> 
>> diff --git a/fsck.c b/fsck.c
>> index 48e7e36869..0b0003055e 100644
>> --- a/fsck.c
>> +++ b/fsck.c
>> @@ -61,7 +61,6 @@ static struct oidset gitmodules_done = OIDSET_INIT;
>>  	FUNC(ZERO_PADDED_DATE, ERROR) \
>>  	FUNC(GITMODULES_MISSING, ERROR) \
>>  	FUNC(GITMODULES_BLOB, ERROR) \
>> -	FUNC(GITMODULES_PARSE, ERROR) \
>>  	FUNC(GITMODULES_NAME, ERROR) \
>>  	FUNC(GITMODULES_SYMLINK, ERROR) \
>>  	/* warnings */ \
>> @@ -76,6 +75,7 @@ static struct oidset gitmodules_done = OIDSET_INIT;
>>  	FUNC(NUL_IN_COMMIT, WARN) \
>>  	/* infos (reported as warnings, but ignored by default) */ \
>>  	FUNC(BAD_TAG_NAME, INFO) \
>> +	FUNC(GITMODULES_PARSE, INFO) \
>>  	FUNC(MISSING_TAGGER_ENTRY, INFO)
>>  
>>  #define MSG_ID(id, msg_type) FSCK_MSG_##id,
>>
> 
> So, just squinting at this in my email client, if this allowed
> a push/fetch to succeed (along with an 'info' message), while
> providing an admin the means to configure it to loudly deny
> the push/fetch - then I think we have a winner! ;-)
> 
> Sorry for not testing the patch.

OK, so I found some time to test this tonight. It is not good news (assuming that I haven't messed up the testing, of course). :(

On top of 'pu' (@9026cfc855), I reverted commit d4c5675233 ("fsck: silence stderr when parsing .gitmodules", 2018-06-28) and added the patch given below.

Unfortunately, the final test fails, thus:
  $ cd t
  $ ./t7415-submodule-names.sh
  ok 1 - check names
  ok 2 - create innocent subrepo
  ok 3 - submodule add refuses invalid names
  ok 4 - add evil submodule
  ok 5 - add other submodule
  ok 6 - clone evil superproject
  ok 7 - fsck detects evil superproject
  ok 8 - transfer.fsckObjects detects evil superproject (unpack)
  ok 9 - transfer.fsckObjects detects evil superproject (index)
  ok 10 - create oddly ordered pack
  ok 11 - transfer.fsckObjects handles odd pack (unpack)
  ok 12 - transfer.fsckObjects handles odd pack (index)
  ok 13 - index-pack --strict works for non-repo pack
  ok 14 - fsck detects symlinked .gitmodules file
  ok 15 - fsck detects non-blob .gitmodules
  ok 16 - fsck detects corrupt .gitmodules
  ok 17 - push warns about corrupt .gitmodules
  not ok 18 - push rejects corrupt .gitmodules (policy)
  #	
  #		rm -rf dst.git &&
  #		git init --bare dst.git &&
  #		git -C dst.git config transfer.fsckObjects true &&
  #		git -C dst.git config fsck.gitmodulesParse error &&
  #		test_must_fail git -C corrupt push ../dst.git HEAD 2>output &&
  #		grep gitmodulesParse output &&
  #		test_i18ngrep ! "bad config" output
  #	
  # failed 1 among 18 test(s)
  1..18
  $ 
i.e. the test_must_fail doesn't! ;-)

I have to go out now, but I will hopefully take a look at this again tomorrow. (Do the test additions look OK?)

ATB, Ramsay Jones

-- >8 --
Subject: [PATCH] WIP: try jeff's last patch
Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com>
---
 fsck.c                     |  2 +-
 t/t7415-submodule-names.sh | 26 ++++++++++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/fsck.c b/fsck.c
index 17b3a51fa..b74856cee 100644
--- a/fsck.c
+++ b/fsck.c
@@ -64,7 +64,6 @@ static struct oidset gitmodules_done = OIDSET_INIT;
 	FUNC(ZERO_PADDED_DATE, ERROR) \
 	FUNC(GITMODULES_MISSING, ERROR) \
 	FUNC(GITMODULES_BLOB, ERROR) \
-	FUNC(GITMODULES_PARSE, ERROR) \
 	FUNC(GITMODULES_NAME, ERROR) \
 	FUNC(GITMODULES_SYMLINK, ERROR) \
 	/* warnings */ \
@@ -79,6 +78,7 @@ static struct oidset gitmodules_done = OIDSET_INIT;
 	FUNC(NUL_IN_COMMIT, WARN) \
 	/* infos (reported as warnings, but ignored by default) */ \
 	FUNC(BAD_TAG_NAME, INFO) \
+	FUNC(GITMODULES_PARSE, INFO) \
 	FUNC(MISSING_TAGGER_ENTRY, INFO)
 
 #define MSG_ID(id, msg_type) FSCK_MSG_##id,
diff --git a/t/t7415-submodule-names.sh b/t/t7415-submodule-names.sh
index ba8af785a..ef9535a44 100755
--- a/t/t7415-submodule-names.sh
+++ b/t/t7415-submodule-names.sh
@@ -185,10 +185,36 @@ test_expect_success 'fsck detects corrupt .gitmodules' '
 		git add .gitmodules &&
 		git commit -m "broken gitmodules" &&
 
+		# issues an "info" warning, but does not fail
+		git fsck 2>output &&
+		grep gitmodulesParse output &&
+		test_i18ngrep ! "bad config" output &&
+
+		# up-rate gitmodulesParse to error
+		git config fsck.gitmodulesParse error &&
 		test_must_fail git fsck 2>output &&
 		grep gitmodulesParse output &&
 		test_i18ngrep ! "bad config" output
 	)
 '
 
+test_expect_success 'push warns about corrupt .gitmodules' '
+	rm -rf dst.git &&
+	git init --bare dst.git &&
+	git -C dst.git config transfer.fsckObjects true &&
+	git -C corrupt push ../dst.git HEAD 2>output &&
+	grep gitmodulesParse output &&
+	test_i18ngrep ! "bad config" output
+'
+
+test_expect_success 'push rejects corrupt .gitmodules (policy)' '
+	rm -rf dst.git &&
+	git init --bare dst.git &&
+	git -C dst.git config transfer.fsckObjects true &&
+	git -C dst.git config fsck.gitmodulesParse error &&
+	test_must_fail git -C corrupt push ../dst.git HEAD 2>output &&
+	grep gitmodulesParse output &&
+	test_i18ngrep ! "bad config" output
+'
+
 test_done
-- 
2.18.0
Previous: Ramsay JonesNext: Jeff King
Message 21 of 31 in “fsck: check skiplist for object in fsck_blob()”
  1. fsck: check skiplist for object in fsck_blob()Ramsay Jones, Jun 27, 2018
  2. Jeff KingJun 28, 2018
  3. Junio C HamanoJun 28, 2018
  4. Jeff KingJun 28, 2018
  5. Ramsay JonesJun 28, 2018
  6. Junio C HamanoJun 28, 2018
  7. Jeff KingJun 28, 2018
  8. Ramsay JonesJun 28, 2018
  9. Jeff KingJun 28, 2018
  10. 1/4 config: turn die_on_error into caller-facing enumJeff King, Jun 28, 2018
  11. 2/4 config: add CONFIG_ERROR_SILENT handlerJeff King, Jun 28, 2018
  12. 3/4 config: add options parameter to git_config_from_memJeff King, Jun 28, 2018
  13. 4/4 fsck: silence stderr when parsing .gitmodulesJeff King, Jun 28, 2018
  14. Jeff KingJun 28, 2018
  15. Ramsay JonesJun 29, 2018
  16. Ramsay JonesJun 29, 2018
  17. Jeff KingJul 3, 2018
  18. Ramsay JonesJul 4, 2018
  19. Jeff KingJul 7, 2018
  20. Ramsay JonesJul 11, 2018
  21. Ramsay JonesJul 13, 2018
  22. Jeff KingJul 13, 2018
  23. Jeff KingJul 13, 2018
  24. Ramsay JonesJul 13, 2018
  25. Jeff KingJul 13, 2018
  26. 1/2 fsck: split ".gitmodules too large" error from parse failureJeff King, Jul 13, 2018
  27. 2/2 fsck: downgrade gitmodulesParse default to "info"Jeff King, Jul 13, 2018
  28. Stefan BellerJul 13, 2018
  29. Junio C HamanoJul 16, 2018
  30. Jeff KingJul 16, 2018
  31. Junio C HamanoJul 16, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.