Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -3392,7 +3392,7 @@ int is_valid_win32_path(const char *path, int allow_literal_nul)
const char *p = path;
int preceding_space_or_period = 0, i = 0, periods = 0;

if (!protect_ntfs)
if (!repo_protect_ntfs(the_repository))
return 1;

skip_dos_drive_prefix((char **)&path);
Expand Down
22 changes: 18 additions & 4 deletions environment.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,10 @@ unsigned long pack_size_limit_cfg;
#ifndef PROTECT_HFS_DEFAULT
#define PROTECT_HFS_DEFAULT 0
#endif
int protect_hfs = PROTECT_HFS_DEFAULT;

#ifndef PROTECT_NTFS_DEFAULT
#define PROTECT_NTFS_DEFAULT 1
#endif
int protect_ntfs = PROTECT_NTFS_DEFAULT;

/*
* The character that begins a commented line in user-editable file
Expand Down Expand Up @@ -142,6 +140,20 @@ int is_bare_repository(void)
return is_bare_repository_cfg && !repo_get_work_tree(the_repository);
}

int repo_protect_ntfs(struct repository *repo)
{
return repo->gitdir ?
repo_config_values(repo)->protect_ntfs :
PROTECT_NTFS_DEFAULT;
}

int repo_protect_hfs(struct repository *repo)
{
return repo->gitdir ?
repo_config_values(repo)->protect_hfs :
PROTECT_HFS_DEFAULT;
}

int have_git_dir(void)
{
return startup_info->have_repository
Expand Down Expand Up @@ -541,12 +553,12 @@ int git_default_core_config(const char *var, const char *value,
}

if (!strcmp(var, "core.protecthfs")) {
protect_hfs = git_config_bool(var, value);
cfg->protect_hfs = git_config_bool(var, value);
return 0;
}

if (!strcmp(var, "core.protectntfs")) {
protect_ntfs = git_config_bool(var, value);
cfg->protect_ntfs = git_config_bool(var, value);
return 0;
}

Expand Down Expand Up @@ -720,5 +732,7 @@ void repo_config_values_init(struct repo_config_values *cfg)
{
cfg->attributes_file = NULL;
cfg->apply_sparse_checkout = 0;
cfg->protect_hfs = PROTECT_HFS_DEFAULT;
cfg->protect_ntfs = PROTECT_NTFS_DEFAULT;
cfg->branch_track = BRANCH_TRACK_REMOTE;
}
12 changes: 10 additions & 2 deletions environment.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ struct repo_config_values {
/* section "core" config values */
char *attributes_file;
int apply_sparse_checkout;
int protect_hfs;
int protect_ntfs;

/* section "branch" config values */
enum branch_track branch_track;
Expand Down Expand Up @@ -123,6 +125,14 @@ int git_default_config(const char *, const char *,
int git_default_core_config(const char *var, const char *value,
const struct config_context *ctx, void *cb);

/*
* Getters for the `protect_hfs` and `protect_ntfs` fields of `struct repo_config_values`.
* They check `repo->gitdir` to prevent calling repo_config_values()
* before the configuration is loaded or in bare environments.
*/
int repo_protect_hfs(struct repository *repo);
int repo_protect_ntfs(struct repository *repo);

void repo_config_values_init(struct repo_config_values *cfg);

/*
Expand Down Expand Up @@ -173,8 +183,6 @@ extern int pack_compression_level;
extern unsigned long pack_size_limit_cfg;

extern int precomposed_unicode;
extern int protect_hfs;
extern int protect_ntfs;

extern int core_sparse_checkout_cone;
extern int sparse_expect_files_outside_of_patterns;
Expand Down
7 changes: 4 additions & 3 deletions read-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -1002,7 +1002,7 @@ static enum verify_path_result verify_path_internal(const char *path,
return PATH_OK;
if (is_dir_sep(c)) {
inside:
if (protect_hfs) {
if (repo_protect_hfs(the_repository)) {

if (is_hfs_dotgit(path))
return PATH_INVALID;
Expand All @@ -1011,7 +1011,7 @@ static enum verify_path_result verify_path_internal(const char *path,
return PATH_INVALID;
}
}
if (protect_ntfs) {
if (repo_protect_ntfs(the_repository)) {
#if defined GIT_WINDOWS_NATIVE || defined __CYGWIN__
if (c == '\\')
return PATH_INVALID;
Expand All @@ -1035,7 +1035,8 @@ static enum verify_path_result verify_path_internal(const char *path,
if (c == '\0')
return S_ISDIR(mode) ? PATH_DIR_WITH_SEP :
PATH_INVALID;
} else if (c == '\\' && protect_ntfs) {
} else if (c == '\\' &&
repo_protect_ntfs(the_repository)) {
if (is_ntfs_dotgit(path))
return PATH_INVALID;
if (S_ISLNK(mode)) {
Expand Down
24 changes: 15 additions & 9 deletions t/helper/test-path-utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ static int protect_ntfs_hfs_benchmark(int argc, const char **argv)
double m[3][2], v[3][2];
uint64_t cumul;
double cumul2;
int ntfs, hfs;

if (argc > 1 && !strcmp(argv[1], "--with-symlink-mode")) {
file_mode = 0120000;
Expand All @@ -276,27 +277,32 @@ static int protect_ntfs_hfs_benchmark(int argc, const char **argv)
names[i][--len] = (char)(' ' + (my_random() % ('\x7f' - ' ')));
}

for (protect_ntfs = 0; protect_ntfs < 2; protect_ntfs++)
for (protect_hfs = 0; protect_hfs < 2; protect_hfs++) {
if (!the_repository->gitdir)
the_repository->gitdir = xstrdup(".git");

for (ntfs = 0; ntfs < 2; ntfs++)
for (hfs = 0; hfs < 2; hfs++) {
repo_config_values(the_repository)->protect_ntfs = ntfs;
repo_config_values(the_repository)->protect_hfs = hfs;
cumul = 0;
cumul2 = 0;
for (i = 0; i < repetitions; i++) {
begin = getnanotime();
for (j = 0; j < nr; j++)
verify_path(names[j], file_mode);
end = getnanotime();
printf("protect_ntfs = %d, protect_hfs = %d: %lfms\n", protect_ntfs, protect_hfs, (end-begin) / (double)1e6);
printf("protect_ntfs = %d, protect_hfs = %d: %lfms\n", ntfs, hfs, (end-begin) / (double)1e6);
cumul += end - begin;
cumul2 += (end - begin) * (end - begin);
}
m[protect_ntfs][protect_hfs] = cumul / (double)repetitions;
v[protect_ntfs][protect_hfs] = my_sqrt(cumul2 / (double)repetitions - m[protect_ntfs][protect_hfs] * m[protect_ntfs][protect_hfs]);
printf("mean: %lfms, stddev: %lfms\n", m[protect_ntfs][protect_hfs] / (double)1e6, v[protect_ntfs][protect_hfs] / (double)1e6);
m[ntfs][hfs] = cumul / (double)repetitions;
v[ntfs][hfs] = my_sqrt(cumul2 / (double)repetitions - m[ntfs][hfs] * m[ntfs][hfs]);
printf("mean: %lfms, stddev: %lfms\n", m[ntfs][hfs] / (double)1e6, v[ntfs][hfs] / (double)1e6);
}

for (protect_ntfs = 0; protect_ntfs < 2; protect_ntfs++)
for (protect_hfs = 0; protect_hfs < 2; protect_hfs++)
printf("ntfs=%d/hfs=%d: %lf%% slower\n", protect_ntfs, protect_hfs, (m[protect_ntfs][protect_hfs] - m[0][0]) * 100 / m[0][0]);
for (ntfs = 0; ntfs < 2; ntfs++)
for (hfs = 0; hfs < 2; hfs++)
printf("ntfs=%d/hfs=%d: %lf%% slower\n", ntfs, hfs, (m[ntfs][hfs] - m[0][0]) * 100 / m[0][0]);

return 0;
}
Expand Down
Loading