Skip to content

Commit

Permalink
t0060: test ntfs/hfs-obscured dotfiles
Browse files Browse the repository at this point in the history
We have tests that cover various filesystem-specific spellings of
".gitmodules", because we need to reliably identify that path for some
security checks. These are from dc2d9ba (is_{hfs,ntfs}_dotgitmodules:
add tests, 2018-05-12), with the actual code coming from e7cb0b4
(is_ntfs_dotgit: match other .git files, 2018-05-11) and 0fc333b
(is_hfs_dotgit: match other .git files, 2018-05-02).

Those latter two commits also added similar matching functions for
.gitattributes and .gitignore. These ended up not being used in the
final series, and are currently dead code. But in preparation for them
being used in some fsck checks, let's make sure they actually work by
throwing a few basic tests at them. Likewise, let's cover .mailmap
(which does need matching code added).

I didn't bother with the whole battery of tests that we cover for
.gitmodules. These functions are all based on the same generic matcher,
so it's sufficient to test most of the corner cases just once.

Note that the ntfs magic prefix names in the tests come from the
algorithm described in e7cb0b4 (and are different for each file).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
peff authored and gitster committed May 4, 2021
1 parent 1cb12f3 commit 801ed01
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 13 deletions.
1 change: 1 addition & 0 deletions cache.h
Expand Up @@ -1271,6 +1271,7 @@ int is_ntfs_dotgit(const char *name);
int is_ntfs_dotgitmodules(const char *name);
int is_ntfs_dotgitignore(const char *name);
int is_ntfs_dotgitattributes(const char *name);
int is_ntfs_dotmailmap(const char *name);

/*
* Returns true iff "str" could be confused as a command-line option when
Expand Down
5 changes: 5 additions & 0 deletions path.c
Expand Up @@ -1493,6 +1493,11 @@ int is_ntfs_dotgitattributes(const char *name)
return is_ntfs_dot_str(name, "gitattributes", "gi7d29");
}

int is_ntfs_dotmailmap(const char *name)
{
return is_ntfs_dot_str(name, "mailmap", "maba30");
}

int looks_like_command_line_option(const char *str)
{
return str && str[0] == '-';
Expand Down
46 changes: 33 additions & 13 deletions t/helper/test-path-utils.c
Expand Up @@ -172,9 +172,22 @@ static struct test_data dirname_data[] = {
{ NULL, NULL }
};

static int is_dotgitmodules(const char *path)
static int check_dotfile(const char *x, const char **argv,
int (*is_hfs)(const char *),
int (*is_ntfs)(const char *))
{
return is_hfs_dotgitmodules(path) || is_ntfs_dotgitmodules(path);
int res = 0, expect = 1;
for (; *argv; argv++) {
if (!strcmp("--not", *argv))
expect = !expect;
else if (expect != (is_hfs(*argv) || is_ntfs(*argv)))
res = error("'%s' is %s.git%s", *argv,
expect ? "not " : "", x);
else
fprintf(stderr, "ok: '%s' is %s.git%s\n",
*argv, expect ? "" : "not ", x);
}
return !!res;
}

static int cmp_by_st_size(const void *a, const void *b)
Expand Down Expand Up @@ -382,17 +395,24 @@ int cmd__path_utils(int argc, const char **argv)
return test_function(dirname_data, posix_dirname, argv[1]);

if (argc > 2 && !strcmp(argv[1], "is_dotgitmodules")) {
int res = 0, expect = 1, i;
for (i = 2; i < argc; i++)
if (!strcmp("--not", argv[i]))
expect = !expect;
else if (expect != is_dotgitmodules(argv[i]))
res = error("'%s' is %s.gitmodules", argv[i],
expect ? "not " : "");
else
fprintf(stderr, "ok: '%s' is %s.gitmodules\n",
argv[i], expect ? "" : "not ");
return !!res;
return check_dotfile("modules", argv + 2,
is_hfs_dotgitmodules,
is_ntfs_dotgitmodules);
}
if (argc > 2 && !strcmp(argv[1], "is_dotgitignore")) {
return check_dotfile("ignore", argv + 2,
is_hfs_dotgitignore,
is_ntfs_dotgitignore);
}
if (argc > 2 && !strcmp(argv[1], "is_dotgitattributes")) {
return check_dotfile("attributes", argv + 2,
is_hfs_dotgitattributes,
is_ntfs_dotgitattributes);
}
if (argc > 2 && !strcmp(argv[1], "is_dotmailmap")) {
return check_dotfile("mailmap", argv + 2,
is_hfs_dotmailmap,
is_ntfs_dotmailmap);
}

if (argc > 2 && !strcmp(argv[1], "file-size")) {
Expand Down
30 changes: 30 additions & 0 deletions t/t0060-path-utils.sh
Expand Up @@ -468,6 +468,36 @@ test_expect_success 'match .gitmodules' '
.gitmodules,:\$DATA
'

test_expect_success 'match .gitattributes' '
test-tool path-utils is_dotgitattributes \
.gitattributes \
.git${u200c}attributes \
.Gitattributes \
.gitattributeS \
GITATT~1 \
GI7D29~1
'

test_expect_success 'match .gitignore' '
test-tool path-utils is_dotgitignore \
.gitignore \
.git${u200c}ignore \
.Gitignore \
.gitignorE \
GITIGN~1 \
GI250A~1
'

test_expect_success 'match .mailmap' '
test-tool path-utils is_dotmailmap \
.mailmap \
.mail${u200c}map \
.Mailmap \
.mailmaP \
MAILMA~1 \
MABA30~1
'

test_expect_success MINGW 'is_valid_path() on Windows' '
test-tool path-utils is_valid_path \
win32 \
Expand Down
5 changes: 5 additions & 0 deletions utf8.c
Expand Up @@ -777,6 +777,11 @@ int is_hfs_dotgitattributes(const char *path)
return is_hfs_dot_str(path, "gitattributes");
}

int is_hfs_dotmailmap(const char *path)
{
return is_hfs_dot_str(path, "mailmap");
}

const char utf8_bom[] = "\357\273\277";

int skip_utf8_bom(char **text, size_t len)
Expand Down
1 change: 1 addition & 0 deletions utf8.h
Expand Up @@ -61,6 +61,7 @@ int is_hfs_dotgit(const char *path);
int is_hfs_dotgitmodules(const char *path);
int is_hfs_dotgitignore(const char *path);
int is_hfs_dotgitattributes(const char *path);
int is_hfs_dotmailmap(const char *path);

typedef enum {
ALIGN_LEFT,
Expand Down

0 comments on commit 801ed01

Please sign in to comment.