From 11d67b754d47967642570f796601e8850f001d73 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Wed, 10 Dec 2014 19:12:16 -0500 Subject: [PATCH] checkout: disallow bad paths on HFS HFS filesystems ignore some characters like U+200C. When these characters are included in a path, they will be ignored for the purposes of comparison with other paths. Thus, if you have a ".git" folder, a folder of ".git" will also match. Protect our ".git" folder by ensuring that ".git" and friends do not match it. --- src/path.c | 93 ++++++++++++++++++ src/path.h | 5 + tests/checkout/nasty.c | 42 ++++++++ tests/path/core.c | 31 +++++- .../04/fab819d8388295cbe3496310e4e53ef8f4a115 | Bin 0 -> 49 bytes .../0b/8206dd72a3b3b932fb562f92d29199b9398390 | Bin 0 -> 50 bytes .../10/cb44a89d1a9e8bf74de3f11a2a61ee833f13b1 | Bin 0 -> 50 bytes .../11/9f6cd3535de0e2a15654947a7b1a5affbf1406 | Bin 0 -> 50 bytes .../15/f7d9f9514eeb65b9588c49b10b1da145a729a2 | Bin 0 -> 137 bytes .../16/35c47d80914f0abfa43dd4234a948db5bdb107 | Bin 0 -> 137 bytes .../2b/4b774d8c5441b22786531f34ffc77800cda8cf | Bin 0 -> 50 bytes .../2d/23d51590ec2f53fe4b5bb3e5ca62e35e4ef85a | Bin 0 -> 49 bytes .../35/ae236308929a536fb4e852278a9b98c42babb3 | Bin 0 -> 137 bytes .../38/0b9e58872ccf1d858be4b0fc612514a080bc40 | Bin 0 -> 49 bytes .../3b/24e5c751ee9c7c89df32a0d959748aa3d0112c | Bin 0 -> 136 bytes .../44/2894787eddb1e84a952f17a027590e2c6c02cd | Bin 0 -> 137 bytes .../46/fe10fa23259b089ab050788b06df979cd7d054 | Bin 0 -> 137 bytes .../6b/7d8a5a48a3c753b75a8fe5196f9c8704ac64ad | Bin 0 -> 50 bytes .../71/2ceb8eb3e57072447715bc4057c57aa50f629a | Bin 0 -> 138 bytes .../7a/0538bc4e20aecb36ef221f2077eb30ebe0bcb2 | Bin 0 -> 136 bytes .../7a/e174dda8f105a582c593b52d74545a3565819d | Bin 0 -> 51 bytes .../80/24458e7ee49c456fd8c45d3591e9936bf613b3 | Bin 0 -> 50 bytes .../81/e2b84864f16ebd285b34a2b1e87ebb41f4c230 | Bin 0 -> 49 bytes .../88/6c0f5f71057d846f71f05a05fdffad332bc070 | Bin 0 -> 50 bytes .../96/156716851c0afb4702b0d2c4ac8c496a730e29 | Bin 0 -> 137 bytes .../9a/b85e507899c19dca57778c9b6e5f1ec799b911 | Bin 0 -> 135 bytes .../9e/24726d64589ba02430da8cebb5712dad35593d | Bin 0 -> 136 bytes .../a5/76a98d3279989226992610372035b76a01a3e9 | Bin 0 -> 136 bytes .../b1/1df9aee97a65817e8904a74f5e6a1c62c7a275 | Bin 0 -> 50 bytes .../bb/29ec85546d29b0bcc314242660d7772b0a3803 | Bin 0 -> 50 bytes .../c2/a2ddd339574e5cbfd9228be840eb1bf496de4e | Bin 0 -> 137 bytes .../c3/a70f8a376f17adccfb52b48e2831bfef2a2172 | Bin 0 -> 136 bytes .../c8/f98a1762ec016c30f0d73512df399dedefc3fd | Bin 0 -> 136 bytes .../ce/22b3cd9a01efafc370879c1938e0c32fb6f195 | Bin 0 -> 136 bytes .../e7/3a04f71f11ab9d7dde72ff793882757a03f16e | Bin 0 -> 50 bytes .../eb/82bf596b66f90e25f881ce9b92cb55bab4fdf5 | Bin 0 -> 50 bytes .../f2/c059dab35f6534b3f16d90b2f1de308615320c | Bin 0 -> 50 bytes .../.gitted/refs/heads/dotgit_hfs_ignorable_1 | Bin 0 -> 41 bytes .../refs/heads/dotgit_hfs_ignorable_10 | Bin 0 -> 41 bytes .../refs/heads/dotgit_hfs_ignorable_11 | Bin 0 -> 41 bytes .../refs/heads/dotgit_hfs_ignorable_12 | Bin 0 -> 41 bytes .../refs/heads/dotgit_hfs_ignorable_13 | Bin 0 -> 41 bytes .../refs/heads/dotgit_hfs_ignorable_14 | Bin 0 -> 41 bytes .../refs/heads/dotgit_hfs_ignorable_15 | Bin 0 -> 41 bytes .../refs/heads/dotgit_hfs_ignorable_16 | Bin 0 -> 41 bytes .../.gitted/refs/heads/dotgit_hfs_ignorable_2 | Bin 0 -> 41 bytes .../.gitted/refs/heads/dotgit_hfs_ignorable_3 | Bin 0 -> 41 bytes .../.gitted/refs/heads/dotgit_hfs_ignorable_4 | Bin 0 -> 41 bytes .../.gitted/refs/heads/dotgit_hfs_ignorable_5 | Bin 0 -> 41 bytes .../.gitted/refs/heads/dotgit_hfs_ignorable_6 | Bin 0 -> 41 bytes .../.gitted/refs/heads/dotgit_hfs_ignorable_7 | Bin 0 -> 41 bytes .../.gitted/refs/heads/dotgit_hfs_ignorable_8 | Bin 0 -> 41 bytes .../.gitted/refs/heads/dotgit_hfs_ignorable_9 | Bin 0 -> 41 bytes 53 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 tests/resources/nasty/.gitted/objects/04/fab819d8388295cbe3496310e4e53ef8f4a115 create mode 100644 tests/resources/nasty/.gitted/objects/0b/8206dd72a3b3b932fb562f92d29199b9398390 create mode 100644 tests/resources/nasty/.gitted/objects/10/cb44a89d1a9e8bf74de3f11a2a61ee833f13b1 create mode 100644 tests/resources/nasty/.gitted/objects/11/9f6cd3535de0e2a15654947a7b1a5affbf1406 create mode 100644 tests/resources/nasty/.gitted/objects/15/f7d9f9514eeb65b9588c49b10b1da145a729a2 create mode 100644 tests/resources/nasty/.gitted/objects/16/35c47d80914f0abfa43dd4234a948db5bdb107 create mode 100644 tests/resources/nasty/.gitted/objects/2b/4b774d8c5441b22786531f34ffc77800cda8cf create mode 100644 tests/resources/nasty/.gitted/objects/2d/23d51590ec2f53fe4b5bb3e5ca62e35e4ef85a create mode 100644 tests/resources/nasty/.gitted/objects/35/ae236308929a536fb4e852278a9b98c42babb3 create mode 100644 tests/resources/nasty/.gitted/objects/38/0b9e58872ccf1d858be4b0fc612514a080bc40 create mode 100644 tests/resources/nasty/.gitted/objects/3b/24e5c751ee9c7c89df32a0d959748aa3d0112c create mode 100644 tests/resources/nasty/.gitted/objects/44/2894787eddb1e84a952f17a027590e2c6c02cd create mode 100644 tests/resources/nasty/.gitted/objects/46/fe10fa23259b089ab050788b06df979cd7d054 create mode 100644 tests/resources/nasty/.gitted/objects/6b/7d8a5a48a3c753b75a8fe5196f9c8704ac64ad create mode 100644 tests/resources/nasty/.gitted/objects/71/2ceb8eb3e57072447715bc4057c57aa50f629a create mode 100644 tests/resources/nasty/.gitted/objects/7a/0538bc4e20aecb36ef221f2077eb30ebe0bcb2 create mode 100644 tests/resources/nasty/.gitted/objects/7a/e174dda8f105a582c593b52d74545a3565819d create mode 100644 tests/resources/nasty/.gitted/objects/80/24458e7ee49c456fd8c45d3591e9936bf613b3 create mode 100644 tests/resources/nasty/.gitted/objects/81/e2b84864f16ebd285b34a2b1e87ebb41f4c230 create mode 100644 tests/resources/nasty/.gitted/objects/88/6c0f5f71057d846f71f05a05fdffad332bc070 create mode 100644 tests/resources/nasty/.gitted/objects/96/156716851c0afb4702b0d2c4ac8c496a730e29 create mode 100644 tests/resources/nasty/.gitted/objects/9a/b85e507899c19dca57778c9b6e5f1ec799b911 create mode 100644 tests/resources/nasty/.gitted/objects/9e/24726d64589ba02430da8cebb5712dad35593d create mode 100644 tests/resources/nasty/.gitted/objects/a5/76a98d3279989226992610372035b76a01a3e9 create mode 100644 tests/resources/nasty/.gitted/objects/b1/1df9aee97a65817e8904a74f5e6a1c62c7a275 create mode 100644 tests/resources/nasty/.gitted/objects/bb/29ec85546d29b0bcc314242660d7772b0a3803 create mode 100644 tests/resources/nasty/.gitted/objects/c2/a2ddd339574e5cbfd9228be840eb1bf496de4e create mode 100644 tests/resources/nasty/.gitted/objects/c3/a70f8a376f17adccfb52b48e2831bfef2a2172 create mode 100644 tests/resources/nasty/.gitted/objects/c8/f98a1762ec016c30f0d73512df399dedefc3fd create mode 100644 tests/resources/nasty/.gitted/objects/ce/22b3cd9a01efafc370879c1938e0c32fb6f195 create mode 100644 tests/resources/nasty/.gitted/objects/e7/3a04f71f11ab9d7dde72ff793882757a03f16e create mode 100644 tests/resources/nasty/.gitted/objects/eb/82bf596b66f90e25f881ce9b92cb55bab4fdf5 create mode 100644 tests/resources/nasty/.gitted/objects/f2/c059dab35f6534b3f16d90b2f1de308615320c create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_1 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_10 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_11 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_12 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_13 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_14 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_15 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_16 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_2 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_3 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_4 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_5 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_6 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_7 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_8 create mode 100644 tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_9 diff --git a/src/path.c b/src/path.c index dbe193acb..724d9ede2 100644 --- a/src/path.c +++ b/src/path.c @@ -1282,6 +1282,95 @@ GIT_INLINE(bool) verify_dospath( component[last] != ':'); } +GIT_INLINE(bool) verify_dotgit_hfs(const char *component, size_t len) +{ + const unsigned char *c; + int git = 0, ign = 0; + unsigned char one, two; + + while (len) { + switch (*(c = (const unsigned char *)component++)) { + case '.': + if (ign || git++ != 0) + return true; + break; + case 'g': + case 'G': + if (ign || git++ != 1) + return true; + break; + case 'i': + case 'I': + if (ign || git++ != 2) + return true; + break; + case 't': + case 'T': + if (ign || git++ != 3) + return true; + break; + + case 0xe2: + case 0xef: + if (ign++ != 0) + return true; + one = *c; + break; + + case 0x80: + case 0x81: + if (ign++ != 1 || one != 0xe2) + return true; + two = *c; + break; + + case 0xbb: + if (ign++ != 1 || one != 0xef) + return true; + two = *c; + break; + + case 0x8c: + case 0x8d: + case 0x8e: + case 0x8f: + if (ign != 2 || two != 0x80) + return true; + ign = 0; + break; + + case 0xaa: + case 0xab: + case 0xac: + case 0xad: + case 0xae: + if (ign != 2 || (two != 0x80 && two != 0x81)) + return true; + ign = 0; + break; + + case 0xaf: + if (ign != 2 || two != 0x81) + return true; + ign = 0; + break; + + case 0xbf: + if (ign != 2 || two != 0xbb) + return true; + ign = 0; + break; + + default: + return true; + } + + len--; + } + + return (ign || git != 4); +} + GIT_INLINE(bool) verify_char(unsigned char c, unsigned int flags) { if ((flags & GIT_PATH_REJECT_BACKSLASH) && c == '\\') @@ -1362,6 +1451,10 @@ static bool verify_component( return false; } + if (flags & GIT_PATH_REJECT_DOT_GIT_HFS && + !verify_dotgit_hfs(component, len)) + return false; + return true; } diff --git a/src/path.h b/src/path.h index a97668a98..4e25d9378 100644 --- a/src/path.h +++ b/src/path.h @@ -472,6 +472,7 @@ extern int git_path_from_url_or_path(git_buf *local_path_out, const char *url_or #define GIT_PATH_REJECT_DOS_GIT_SHORTNAME (1 << 6) #define GIT_PATH_REJECT_DOS_PATHS (1 << 7) #define GIT_PATH_REJECT_NT_CHARS (1 << 8) +#define GIT_PATH_REJECT_DOT_GIT_HFS (1 << 9) #ifdef GIT_WIN32 # define GIT_PATH_REJECT_DEFAULTS \ @@ -483,6 +484,10 @@ extern int git_path_from_url_or_path(git_buf *local_path_out, const char *url_or GIT_PATH_REJECT_DOS_GIT_SHORTNAME | \ GIT_PATH_REJECT_DOS_PATHS | \ GIT_PATH_REJECT_NT_CHARS +#elif __APPLE__ +# define GIT_PATH_REJECT_DEFAULTS \ + GIT_PATH_REJECT_TRAVERSAL | \ + GIT_PATH_REJECT_DOT_GIT_HFS #else # define GIT_PATH_REJECT_DEFAULTS GIT_PATH_REJECT_TRAVERSAL #endif diff --git a/tests/checkout/nasty.c b/tests/checkout/nasty.c index 8bc98f3d6..a667dcd8f 100644 --- a/tests/checkout/nasty.c +++ b/tests/checkout/nasty.c @@ -249,3 +249,45 @@ void test_checkout_nasty__dot_git_colon_stuff(void) #endif } +/* Trees that contains entries with a tree ".git" that contain + * byte sequences: + * { 0xe2, 0x80, 0x8c } + * { 0xe2, 0x80, 0x8d } + * { 0xe2, 0x80, 0x8e } + * { 0xe2, 0x80, 0x8f } + * { 0xe2, 0x80, 0xaa } + * { 0xe2, 0x80, 0xab } + * { 0xe2, 0x80, 0xac } + * { 0xe2, 0x80, 0xad } + * { 0xe2, 0x81, 0xae } + * { 0xe2, 0x81, 0xaa } + * { 0xe2, 0x81, 0xab } + * { 0xe2, 0x81, 0xac } + * { 0xe2, 0x81, 0xad } + * { 0xe2, 0x81, 0xae } + * { 0xe2, 0x81, 0xaf } + * { 0xef, 0xbb, 0xbf } + * Because these map to characters that HFS filesystems "ignore". Thus + * ".git" will map to ".git". + */ +void test_checkout_nasty__dot_git_hfs_ignorable(void) +{ +#ifdef __APPLE__ + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_1", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_2", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_3", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_4", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_5", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_6", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_7", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_8", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_9", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_10", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_11", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_12", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_13", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_14", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_15", ".git/foobar"); + test_checkout_fails("refs/heads/dotgit_hfs_ignorable_16", ".git/foobar"); +#endif +} diff --git a/tests/path/core.c b/tests/path/core.c index 7cc111800..528108bea 100644 --- a/tests/path/core.c +++ b/tests/path/core.c @@ -223,7 +223,7 @@ void test_path_core__isvalid_dos_paths_withnum(void) cl_assert_equal_b(true, git_path_isvalid(NULL, "com1\\foo", GIT_PATH_REJECT_DOS_PATHS)); } -void test_core_path__isvalid_nt_chars(void) +void test_path_core__isvalid_nt_chars(void) { cl_assert_equal_b(true, git_path_isvalid(NULL, "asdf\001foo", 0)); cl_assert_equal_b(true, git_path_isvalid(NULL, "asdf\037bar", 0)); @@ -245,3 +245,32 @@ void test_core_path__isvalid_nt_chars(void) cl_assert_equal_b(false, git_path_isvalid(NULL, "asdf?bar", GIT_PATH_REJECT_NT_CHARS)); cl_assert_equal_b(false, git_path_isvalid(NULL, "asdf*bar", GIT_PATH_REJECT_NT_CHARS)); } + +void test_path_core__isvalid_dotgit_with_hfs_ignorables(void) +{ + cl_assert_equal_b(false, git_path_isvalid(NULL, ".git", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(false, git_path_isvalid(NULL, ".git\xe2\x80\x8c", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(false, git_path_isvalid(NULL, ".gi\xe2\x80\x8dT", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(false, git_path_isvalid(NULL, ".g\xe2\x80\x8eIt", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(false, git_path_isvalid(NULL, ".\xe2\x80\x8fgIt", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(false, git_path_isvalid(NULL, "\xe2\x80\xaa.gIt", GIT_PATH_REJECT_DOT_GIT_HFS)); + + cl_assert_equal_b(false, git_path_isvalid(NULL, "\xe2\x80\xab.\xe2\x80\xacG\xe2\x80\xadI\xe2\x80\xaet", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(false, git_path_isvalid(NULL, "\xe2\x81\xab.\xe2\x80\xaaG\xe2\x81\xabI\xe2\x80\xact", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(false, git_path_isvalid(NULL, "\xe2\x81\xad.\xe2\x80\xaeG\xef\xbb\xbfIT", GIT_PATH_REJECT_DOT_GIT_HFS)); + + cl_assert_equal_b(true, git_path_isvalid(NULL, ".", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".g", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".gi", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, " .git", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, "..git\xe2\x80\x8c", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".gi\xe2\x80\x8dT.", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".g\xe2\x80It", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".\xe2gIt", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, "\xe2\x80\xaa.gi", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".gi\x80\x8dT", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".gi\x8dT", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".g\xe2i\x80T\x8e", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".git\xe2\x80\xbf", GIT_PATH_REJECT_DOT_GIT_HFS)); + cl_assert_equal_b(true, git_path_isvalid(NULL, ".git\xe2\xab\x81", GIT_PATH_REJECT_DOT_GIT_HFS)); +} diff --git a/tests/resources/nasty/.gitted/objects/04/fab819d8388295cbe3496310e4e53ef8f4a115 b/tests/resources/nasty/.gitted/objects/04/fab819d8388295cbe3496310e4e53ef8f4a115 new file mode 100644 index 0000000000000000000000000000000000000000..688b970c28cbaf7a997e903e8127fe0c43f9952c GIT binary patch literal 49 zcmV-10M7q-0V^p=O;s>9VK6ZO0)mv^%jMCzfVjzIZaa)Z1y1Pq6fJCI+8g G!5{$3{1Zk1 literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/10/cb44a89d1a9e8bf74de3f11a2a61ee833f13b1 b/tests/resources/nasty/.gitted/objects/10/cb44a89d1a9e8bf74de3f11a2a61ee833f13b1 new file mode 100644 index 0000000000000000000000000000000000000000..9d14298d58eda98f267e3b01afc4cbfc480eb067 GIT binary patch literal 50 zcmbmv^%jMCzfVjzIZaa)Z1y1Pq6fJCI+7# G!5{#;84|_- literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/11/9f6cd3535de0e2a15654947a7b1a5affbf1406 b/tests/resources/nasty/.gitted/objects/11/9f6cd3535de0e2a15654947a7b1a5affbf1406 new file mode 100644 index 0000000000000000000000000000000000000000..fb03b26b09f8bc42651d6ce3c201985d1e5a4873 GIT binary patch literal 50 zcmbmv^%jMCzfVjzIZaa)Z1y1Pq6fJCI+A7 Gg24dHYZGDs literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/15/f7d9f9514eeb65b9588c49b10b1da145a729a2 b/tests/resources/nasty/.gitted/objects/15/f7d9f9514eeb65b9588c49b10b1da145a729a2 new file mode 100644 index 0000000000000000000000000000000000000000..a7f3683e4180c40009ce319435a8c8f745c83f77 GIT binary patch literal 137 zcmV;40CxX)0iBI84#F@DMVWI7??@W@ahX10} zx+=I}ciNbN(UToBy6ha?L&B68hnz9^Wf^cnvOc?+4ZXBTgG+i-OK>YvH+jI3yZxT(~L`iz3rGTdsq4Y2Xm!OKTs*cleByR7#2VCP>4aA literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/16/35c47d80914f0abfa43dd4234a948db5bdb107 b/tests/resources/nasty/.gitted/objects/16/35c47d80914f0abfa43dd4234a948db5bdb107 new file mode 100644 index 0000000000000000000000000000000000000000..f82b82be76ad8404e82dc9bf529479a0b16d83ff GIT binary patch literal 137 zcmV;40CxX)0iBIK4gw(%g{?Wo^d<(DpM}I28(S+cz`~H-0%rqbjJFrB;A`H?S9~u~ zts8?1^1uxdyqt`&9%n=olCiF2KPqb*6o#PPQk>F@7V*U^HMr$>Y#AOa)lN@19VK6ZO0)wE{~u20cAVbOF)t~b<7xQC)dh7d3_?o0 F@c^M25!Cjm?>F1-XnT6^wL!-T+*9rg4-&k$penL+aI0F q7OOO2Jwz!d7)Cp}*@p%8*k`)zzncFqm@75?K%odv()9}jV?X4hi9g5y literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/44/2894787eddb1e84a952f17a027590e2c6c02cd b/tests/resources/nasty/.gitted/objects/44/2894787eddb1e84a952f17a027590e2c6c02cd new file mode 100644 index 0000000000000000000000000000000000000000..c81b0e67a804d4238448248721e1fedf7ddeed73 GIT binary patch literal 137 zcmV;40CxX)0iBI84#F@DMVWI7??|W(O-Lk!SXi03K%6>i2jeO+LfoEk1>W@ahX1lK zuL@%vc3O#mFjy=udi1`;fvhVbjF}=vo6$K;IF-3LlU}+=h1>j2b%w_x+~f&o>h`y; ryyhxRiXO7?1x9|Le*AIv>9{Q##7ThiqVj{!isi~&HO literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/46/fe10fa23259b089ab050788b06df979cd7d054 b/tests/resources/nasty/.gitted/objects/46/fe10fa23259b089ab050788b06df979cd7d054 new file mode 100644 index 0000000000000000000000000000000000000000..6d1f52df992216f0467f813474b75c38bacbee96 GIT binary patch literal 137 zcmV;40CxX)0iBI84gw(%MXfo-^d<&a*ku!AY;3K(01Obez}dhU)fIdvx?5TkW7#nXQiz&UJe0`6#m798r!$}9KW3YUl4cS`2*D>?4HXP=OaI?ZS+B= literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/6b/7d8a5a48a3c753b75a8fe5196f9c8704ac64ad b/tests/resources/nasty/.gitted/objects/6b/7d8a5a48a3c753b75a8fe5196f9c8704ac64ad new file mode 100644 index 0000000000000000000000000000000000000000..121277fdfa40ef6654c518f0248e45a62a46d468 GIT binary patch literal 50 zcmb2o)b_2 literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/71/2ceb8eb3e57072447715bc4057c57aa50f629a b/tests/resources/nasty/.gitted/objects/71/2ceb8eb3e57072447715bc4057c57aa50f629a new file mode 100644 index 0000000000000000000000000000000000000000..9ed35d78a66fde762c8053efd176070c80ff55be GIT binary patch literal 138 zcmV;50CoR(0iBI84gw(%MXfo-^d<(_*@aDvv9Y!C0_*_UEpRq4#&~=23cl*+75@>J zvI&@3AEc%PcEQCtjGjhBvsml=G!7;Ym@_%&wWb(6Wffksa)n!bhZ^Cra%ud8bL#fD su4SXjjkBDH%LR-baGac<;ix;R%ifjr|AV@RCLbt)U=Ol>0p*!Lx}!Hl2mk;8 literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/7a/0538bc4e20aecb36ef221f2077eb30ebe0bcb2 b/tests/resources/nasty/.gitted/objects/7a/0538bc4e20aecb36ef221f2077eb30ebe0bcb2 new file mode 100644 index 0000000000000000000000000000000000000000..0c3ea2694d815d6dfc8e8624c50513508fa1003d GIT binary patch literal 136 zcmV;30C)d*0iBI84gw(%MXfo-^d<%tSRpaS#@5OU%)*e}0>{7@h#n~E7j=ZH3ibG?(!k4Vv;F{mqGTc|LogZ+bVSnpV qx74_EkwfBo1~Xab=VOSl*8?@==nDP+pl;aZ0~HfIQPwZg9VK6ZO0tG$yM-9E6Aq-UyOYW}t$hx%Y=;W=sB_UC!sf}|1 HJ}nT^s!tQb literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/88/6c0f5f71057d846f71f05a05fdffad332bc070 b/tests/resources/nasty/.gitted/objects/88/6c0f5f71057d846f71f05a05fdffad332bc070 new file mode 100644 index 0000000000000000000000000000000000000000..432eea2832e9673db3690e6717f2fefd357436e0 GIT binary patch literal 50 zcmbTux5O&BX?J2jPAtv5eDP#-skhT2pJ3_dObkA^ G1w#Sdi4+(B literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/96/156716851c0afb4702b0d2c4ac8c496a730e29 b/tests/resources/nasty/.gitted/objects/96/156716851c0afb4702b0d2c4ac8c496a730e29 new file mode 100644 index 0000000000000000000000000000000000000000..57419bc77d78b535c6c4714f6812706ae31e68ad GIT binary patch literal 137 zcmV;40CxX)0iBII4#F@H1*vn2?U7LY*$_(z(a=(HfwjF>QkX@~BE;=6S755ADc&Th zbyYB7+-YM5o2|=eFpQjRL08yEjL|VBnk+kH&t*m$=%tG^xaK#t4EIIqCJ#7qx4(6% rYihDd(L<7Y24kJa={N`2kDZ~*-c|npVYtzzAE=bzNxFOiT;xD+RYXG% literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/9a/b85e507899c19dca57778c9b6e5f1ec799b911 b/tests/resources/nasty/.gitted/objects/9a/b85e507899c19dca57778c9b6e5f1ec799b911 new file mode 100644 index 0000000000000000000000000000000000000000..aa24a8fc775557b43d1e6191cf88eb2299a74ada GIT binary patch literal 135 zcmV;20C@j+0iBIK3IZ_@My+#-=>^#}{~%&xYvl!ICkeYn97#sR+Z(Uot3F=wJ>pt7 zfjLe)X*q*id3~CvLe{rP_*Yx&1!M#!&^ng>I_O~u= qi=74)K16C~P#PCwkE?^doQNrBm-GJ*;^qf`p!o<-&-DxF4?m=Olsw)5 literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/a5/76a98d3279989226992610372035b76a01a3e9 b/tests/resources/nasty/.gitted/objects/a5/76a98d3279989226992610372035b76a01a3e9 new file mode 100644 index 0000000000000000000000000000000000000000..75fa458e758747804440cef38d59518a5fa7853c GIT binary patch literal 136 zcmV;30C)d*0iBI84#F@H1gZUs>yc0{Hi<1EL_^C literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/b1/1df9aee97a65817e8904a74f5e6a1c62c7a275 b/tests/resources/nasty/.gitted/objects/b1/1df9aee97a65817e8904a74f5e6a1c62c7a275 new file mode 100644 index 0000000000000000000000000000000000000000..b2e0eda1a44a425399be1040d97a2512a840234f GIT binary patch literal 50 zcmV-20L}k+0V^p=O;s>9VK6ZO0)_Xx_v@u+mM~O3EV;YlBkR(pqm#GlmV`u^rZ&z6 I09FMNtPGzO{Qv*} literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/bb/29ec85546d29b0bcc314242660d7772b0a3803 b/tests/resources/nasty/.gitted/objects/bb/29ec85546d29b0bcc314242660d7772b0a3803 new file mode 100644 index 0000000000000000000000000000000000000000..00ab02c217ff63114b4cde9edddc3d0977df798a GIT binary patch literal 50 zcmbmv^%jMCzfVjzIZaa)Z1y1Pq6fJCI+7( G!9W1IsuHRI literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/c2/a2ddd339574e5cbfd9228be840eb1bf496de4e b/tests/resources/nasty/.gitted/objects/c2/a2ddd339574e5cbfd9228be840eb1bf496de4e new file mode 100644 index 0000000000000000000000000000000000000000..939cf5576fea46a5ec60504a8b96ce4a23068110 GIT binary patch literal 137 zcmV;40CxX)0iBII4gxU@1*vli_edz-&4)+`(a=(H0dGFqErL;Egt$H73QYAh#hb{r zZUPwePFl`@7>bK&wzExH=ZVldYl89Q7bHuiECr2rie9pEgKK(IOK@Mgc7DJq5Bpn} ry2ZwwiyR`?GvG8E>-;gmUJuleqbvFU2X&(^AE*@JNwR(c0CPXvT;M*; literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/c3/a70f8a376f17adccfb52b48e2831bfef2a2172 b/tests/resources/nasty/.gitted/objects/c3/a70f8a376f17adccfb52b48e2831bfef2a2172 new file mode 100644 index 0000000000000000000000000000000000000000..b43d3f165dfb0f6d7d613a9feeef603d512807ee GIT binary patch literal 136 zcmV;30C)d*0iDe~3IZ_@1z_tv#q@$?CvG+aA~v>GULe0@i#U>uh_^Rh!B;)L;=RDN zZUQr@owSrdd5g-#xT4cud(xQwVlWd%q?u?4SxstkFDcyM8sDx(xEHRSA8<-Tf9+DY q(71D!L*ROb8TD~7t0ma0k!j%gmGu9@baP!kP+fqhlkx?f0zWaBmO(%O literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/c8/f98a1762ec016c30f0d73512df399dedefc3fd b/tests/resources/nasty/.gitted/objects/c8/f98a1762ec016c30f0d73512df399dedefc3fd new file mode 100644 index 0000000000000000000000000000000000000000..85ddc7f9be833e62d5c6e92bdee4171a6d45fe8b GIT binary patch literal 136 zcmV;30C)d*0iBIK3IZ_@My+#-=>^%u%^!%^*jjmkF_|S>#95LN@%F|m_^OXrd@pgW ztALKvP8tzBw9ZRJqUh1tpgn~+&FJUFl0%)GNgj>23SUyV!8O0JWw;lvou6=`VSnpV q*VMT4B8SBF4B8xL>wJi?p9X5k(G~jtLEW&+2P!7mP|6n>D?joaGDVmG literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/ce/22b3cd9a01efafc370879c1938e0c32fb6f195 b/tests/resources/nasty/.gitted/objects/ce/22b3cd9a01efafc370879c1938e0c32fb6f195 new file mode 100644 index 0000000000000000000000000000000000000000..eb5acc34b96cc77c7a96274b64c053cf6dea98c6 GIT binary patch literal 136 zcmV;30C)d*0iBII3PLduMXlc|rWYjt4~W>7)#ViTAoad7 z$S8I^YK5FttQf2{uBezrM%2Tux5O&BX?J2jPAtv5eDP#-skhT2pJ3_dObkB7 Gf`I_k4HIkt literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/objects/eb/82bf596b66f90e25f881ce9b92cb55bab4fdf5 b/tests/resources/nasty/.gitted/objects/eb/82bf596b66f90e25f881ce9b92cb55bab4fdf5 new file mode 100644 index 0000000000000000000000000000000000000000..b886096ce8c30aae71f0eebf9d3f4c851fbea785 GIT binary patch literal 50 zcmbTux5O&BX?J2jPAtv5eDP#-skhT2pJ3_dObk8| Gf&l=+yAsd< literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_1 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_1 new file mode 100644 index 0000000000000000000000000000000000000000..dc48bd6fcd3c26f1768d142b6e5b9c4b7f75cadd GIT binary patch literal 41 ucmV~$NdW*L2n4{tX;$Qn10ww+IKw(`W0DR@6g;vZF!zG?gvD)Z2(J(0%L=6c literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_10 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_10 new file mode 100644 index 0000000000000000000000000000000000000000..b3a972629e36ff250cd5a8d2c8a2d420a49348c0 GIT binary patch literal 41 tcmV~$u>k-e2m`R)YwUof=Rn2(PcTt+#>8eyhOR3}rqyTSVN9t7tPktQ3i$v4 literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_11 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_11 new file mode 100644 index 0000000000000000000000000000000000000000..edf27988a1526d088de167b6debfb2a6a3c13500 GIT binary patch literal 41 vcmV~$!4Uu;2m`Rc(^!s*9S21BAHf8C(Rw2M-dZei@8c@WLMNOVrnK<^>e&j` literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_12 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_12 new file mode 100644 index 0000000000000000000000000000000000000000..c4e682e103a30973ce5f78b31f41cca235ffce76 GIT binary patch literal 41 ucmV~$K>+|D2m`>sX=JFQ4xsBF!Mpb4RHXCBn73QCQ7az8t@MP15#s~;sSASu literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_13 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_13 new file mode 100644 index 0000000000000000000000000000000000000000..76a155c208f17d62ba8cb04aaf31e28c9531e7ad GIT binary patch literal 41 ucmV~$K>+|D2m`>sX%tW)jpmBWqz6-Ik3d4T>b#x1L7};miYynfzzE1c_F@g>g9@4e literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_15 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_15 new file mode 100644 index 0000000000000000000000000000000000000000..3fdeecea69b7fd8a140b1627f0c8477b660bc345 GIT binary patch literal 41 ucmV~$Nf7`r2n4Wy)o>21917IGgeH2$);pYc(b0){Dn$cFSXSu}v-J7z7z+OY literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_16 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_16 new file mode 100644 index 0000000000000000000000000000000000000000..2739555f7a914b3dd47eb80ae39b80cd4d0b923f GIT binary patch literal 41 vcmV~$#}NQ92m`QxrlDLYqVra?T6gKGZ~x=XOZ8DTtBuhmJKj*QmCXrg@6m0Ta#LJDU9 literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_4 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_4 new file mode 100644 index 0000000000000000000000000000000000000000..754b55edd5d935cbc124e1faade824d6a8475a59 GIT binary patch literal 41 tcmV~$!4Uu;2m`Rc)6}BkI+UyXk6@C89ap_flv{E9$oYs&D_|LFaeVU~3!DG| literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_5 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_5 new file mode 100644 index 0000000000000000000000000000000000000000..161ebc43b517cb055e02c42e6fa4ad04efcf2ba2 GIT binary patch literal 41 ucmV~$!4Uu;2m`Rc(|}Zgaljt?k6@zL&Vw@~6(iMCFcRBPiC~{*tN8ll4+`%9 literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_6 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_6 new file mode 100644 index 0000000000000000000000000000000000000000..f8a5fa3f7eabf1f1213d244914092feb4701bb4f GIT binary patch literal 41 tcmV~$NdW*L2n4{tX^@*Z;L^W>GqtS24p+;XCRQPIzMZkSjE0z%;C$gl3d{fi literal 0 HcmV?d00001 diff --git a/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_7 b/tests/resources/nasty/.gitted/refs/heads/dotgit_hfs_ignorable_7 new file mode 100644 index 0000000000000000000000000000000000000000..ad5ad1d70b89635af31e352fa5e57f32e275a515 GIT binary patch literal 41 vcmV~$!4Uu;2m`Rc(*QjM#=#2vk6^+!yWq