From: "Lidong Yan via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Lidong Yan <502024330056@smail.nju.edu.cn>,
Lidong Yan <502024330056@smail.nju.edu.cn>
Subject: [PATCH] pack-bitmap: add loading corrupt bitmap_index test
Date: Sat, 17 May 2025 14:26:22 +0000 [thread overview]
Message-ID: <pull.1967.git.git.1747491983066.gitgitgadget@gmail.com> (raw)
From: Lidong Yan <502024330056@smail.nju.edu.cn>
This patch add a test function `test_bitmap_load_corrupt` in patch-bitmap.c
, a `load corrupt bitmap` test case in t5310-pack-bitmaps.sh and
a new command `load-corrupt` for `test-tool` in t/helper/test-bitmap.c.
To make sure we are loading a corrupt bitmap, we need enable bitmap table
lookup so that `prepare_bitmap()` won't call `load_bitmap_entries_v1()`.
So to test corrupt bitmap_index, we first call `prepare_bitmap()` to set
everything up but `bitmap_index->bitmaps` for us. Then we do any
corruption we want to the bitmap_index. Finally we can test loading
corrupt bitmap by calling `load_bitmap_entries_v1()`.
Signed-off-by: Lidong Yan <502024330056@smail.nju.edu.cn>
---
pack-bitmap: add loading corrupt bitmap_index test
This patch add a test function test_bitmap_load_corrupt in
patch-bitmap.c , a load corrupt bitmap test case in
t5310-pack-bitmaps.sh and a new command load-corrupt for test-tool in
t/helper/test-bitmap.c.
To make sure we are loading a corrupt bitmap, we need enable bitmap
table lookup so that prepare_bitmap() won't call
load_bitmap_entries_v1(). So to test corrupt bitmap_index, we first
prepare_bitmap() to set everything up but bitmap_index->bitmaps for us.
Then we do any corruption we want to the bitmap_index. Finally we call
load_bitmap_entries_v1() to test loading corrupt bitmap.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1967%2Fbrandb97%2Fcorrupt-bitmap-test-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1967/brandb97/corrupt-bitmap-test-v1
Pull-Request: https://github.com/git/git/pull/1967
pack-bitmap.c | 65 +++++++++++++++++++++++++++++++++++++++++
pack-bitmap.h | 1 +
t/helper/test-bitmap.c | 8 +++++
t/t5310-pack-bitmaps.sh | 15 ++++++++++
4 files changed, 89 insertions(+)
diff --git a/pack-bitmap.c b/pack-bitmap.c
index b9f1d866046..9642a06b3fe 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -3022,6 +3022,71 @@ cleanup:
return ret;
}
+typedef void(corrupt_fn)(struct bitmap_index *);
+
+static int bitmap_corrupt_then_load(struct repository *r, corrupt_fn *do_corrupt)
+{
+ struct bitmap_index *bitmap_git;
+ unsigned char *map;
+
+ if (!(bitmap_git = prepare_bitmap_git(r)))
+ die(_("failed to prepare bitmap indexes"));
+ /*
+ * If the table lookup extension is not used,
+ * prepare_bitmap_git has already called load_bitmap_entries_v1(),
+ * making it impossible to corrupt the bitmap.
+ */
+ if (!bitmap_git->table_lookup)
+ return 0;
+
+ /*
+ * bitmap_git->map is read-only;
+ * to corrupt it, we need a writable memory block.
+ */
+ map = bitmap_git->map;
+ bitmap_git->map = xmalloc(bitmap_git->map_size);
+ if (!bitmap_git->map)
+ return 0;
+ memcpy(bitmap_git->map, map, bitmap_git->map_size);
+
+ do_corrupt(bitmap_git);
+ if (!load_bitmap_entries_v1(bitmap_git))
+ die(_("load corrupt bitmap successfully"));
+
+ free(bitmap_git->map);
+ bitmap_git->map = map;
+ free_bitmap_index(bitmap_git);
+
+ return 0;
+}
+
+static void do_corrupt_commit_pos(struct bitmap_index *bitmap_git)
+{
+ uint32_t *commit_pos_ptr;
+
+ commit_pos_ptr = (uint32_t *)(bitmap_git->map + bitmap_git->map_pos);
+ *commit_pos_ptr = (uint32_t)-1;
+}
+
+static void do_corrupt_xor_offset(struct bitmap_index *bitmap_git)
+{
+ uint8_t *xor_offset_ptr;
+
+ xor_offset_ptr = (uint8_t *)(bitmap_git->map + bitmap_git->map_pos +
+ sizeof(uint32_t));
+ *xor_offset_ptr = MAX_XOR_OFFSET + 1;
+}
+
+int test_bitmap_load_corrupt(struct repository *r)
+{
+ int res = 0;
+ if ((res = bitmap_corrupt_then_load(r, do_corrupt_commit_pos)))
+ return res;
+ if ((res = bitmap_corrupt_then_load(r, do_corrupt_xor_offset)))
+ return res;
+ return res;
+}
+
int rebuild_bitmap(const uint32_t *reposition,
struct ewah_bitmap *source,
struct bitmap *dest)
diff --git a/pack-bitmap.h b/pack-bitmap.h
index 382d39499af..7770abe6bff 100644
--- a/pack-bitmap.h
+++ b/pack-bitmap.h
@@ -85,6 +85,7 @@ int test_bitmap_hashes(struct repository *r);
int test_bitmap_pseudo_merges(struct repository *r);
int test_bitmap_pseudo_merge_commits(struct repository *r, uint32_t n);
int test_bitmap_pseudo_merge_objects(struct repository *r, uint32_t n);
+int test_bitmap_load_corrupt(struct repository *r);
struct list_objects_filter_options;
diff --git a/t/helper/test-bitmap.c b/t/helper/test-bitmap.c
index 3f23f210726..7aabcfed2f9 100644
--- a/t/helper/test-bitmap.c
+++ b/t/helper/test-bitmap.c
@@ -20,6 +20,11 @@ static int bitmap_dump_pseudo_merges(void)
return test_bitmap_pseudo_merges(the_repository);
}
+static int bitmap_load_corrupt(void)
+{
+ return test_bitmap_load_corrupt(the_repository);
+}
+
static int bitmap_dump_pseudo_merge_commits(uint32_t n)
{
return test_bitmap_pseudo_merge_commits(the_repository, n);
@@ -40,6 +45,8 @@ int cmd__bitmap(int argc, const char **argv)
return bitmap_dump_hashes();
if (argc == 2 && !strcmp(argv[1], "dump-pseudo-merges"))
return bitmap_dump_pseudo_merges();
+ if (argc == 2 && !strcmp(argv[1], "load-corrupt"))
+ return bitmap_load_corrupt();
if (argc == 3 && !strcmp(argv[1], "dump-pseudo-merge-commits"))
return bitmap_dump_pseudo_merge_commits(atoi(argv[2]));
if (argc == 3 && !strcmp(argv[1], "dump-pseudo-merge-objects"))
@@ -48,6 +55,7 @@ int cmd__bitmap(int argc, const char **argv)
usage("\ttest-tool bitmap list-commits\n"
"\ttest-tool bitmap dump-hashes\n"
"\ttest-tool bitmap dump-pseudo-merges\n"
+ "\ttest-tool bitmap load-corrupt\n"
"\ttest-tool bitmap dump-pseudo-merge-commits <n>\n"
"\ttest-tool bitmap dump-pseudo-merge-objects <n>");
diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh
index a62b463eaf0..042f62f16ea 100755
--- a/t/t5310-pack-bitmaps.sh
+++ b/t/t5310-pack-bitmaps.sh
@@ -486,6 +486,21 @@ test_bitmap_cases () {
grep "ignoring extra bitmap" trace2.txt
)
'
+
+ test_expect_success 'load corrupt bitmap' '
+ git init repo &&
+ test_when_finished "rm -fr repo" && (
+ cd repo &&
+ git config pack.writeBitmapLookupTable '"$writeLookupTable"' &&
+
+ echo "Hello world" > hello_world.txt &&
+ git add hello_world.txt &&
+ git commit -am "add hello_world.txt" &&
+
+ git repack -adb &&
+ test-tool bitmap load-corrupt
+ )
+ '
}
test_bitmap_cases
base-commit: 6f84262c44a89851c3ae5a6e4c1a9d06b2068d75
--
gitgitgadget
next reply other threads:[~2025-05-17 14:26 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-17 14:26 Lidong Yan via GitGitGadget [this message]
2025-05-19 6:02 ` [PATCH] pack-bitmap: add loading corrupt bitmap_index test Patrick Steinhardt
2025-05-19 6:44 ` lidongyan
2025-05-19 7:27 ` Patrick Steinhardt
2025-05-19 7:37 ` lidongyan
2025-05-19 7:39 ` Jeff King
2025-05-19 7:58 ` lidongyan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1967.git.git.1747491983066.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=502024330056@smail.nju.edu.cn \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.