Browse Source
* mm/mkstemps-mode-for-packfiles: Use git_mkstemp_mode instead of plain mkstemp to create object files git_mkstemps_mode: don't set errno to EINVAL on exit. Use git_mkstemp_mode and xmkstemp_mode in odb_mkstemp, not chmod later. git_mkstemp_mode, xmkstemp_mode: variants of gitmkstemps with mode argument. Move gitmkstemps to path.c Add a testcase for ACL with restrictive umask.maint
Junio C Hamano
15 years ago
8 changed files with 172 additions and 93 deletions
@ -1,70 +0,0 @@
@@ -1,70 +0,0 @@
|
||||
#include "../git-compat-util.h" |
||||
|
||||
/* Adapted from libiberty's mkstemp.c. */ |
||||
|
||||
#undef TMP_MAX |
||||
#define TMP_MAX 16384 |
||||
|
||||
int gitmkstemps(char *pattern, int suffix_len) |
||||
{ |
||||
static const char letters[] = |
||||
"abcdefghijklmnopqrstuvwxyz" |
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
||||
"0123456789"; |
||||
static const int num_letters = 62; |
||||
uint64_t value; |
||||
struct timeval tv; |
||||
char *template; |
||||
size_t len; |
||||
int fd, count; |
||||
|
||||
len = strlen(pattern); |
||||
|
||||
if (len < 6 + suffix_len) { |
||||
errno = EINVAL; |
||||
return -1; |
||||
} |
||||
|
||||
if (strncmp(&pattern[len - 6 - suffix_len], "XXXXXX", 6)) { |
||||
errno = EINVAL; |
||||
return -1; |
||||
} |
||||
|
||||
/* |
||||
* Replace pattern's XXXXXX characters with randomness. |
||||
* Try TMP_MAX different filenames. |
||||
*/ |
||||
gettimeofday(&tv, NULL); |
||||
value = ((size_t)(tv.tv_usec << 16)) ^ tv.tv_sec ^ getpid(); |
||||
template = &pattern[len - 6 - suffix_len]; |
||||
for (count = 0; count < TMP_MAX; ++count) { |
||||
uint64_t v = value; |
||||
/* Fill in the random bits. */ |
||||
template[0] = letters[v % num_letters]; v /= num_letters; |
||||
template[1] = letters[v % num_letters]; v /= num_letters; |
||||
template[2] = letters[v % num_letters]; v /= num_letters; |
||||
template[3] = letters[v % num_letters]; v /= num_letters; |
||||
template[4] = letters[v % num_letters]; v /= num_letters; |
||||
template[5] = letters[v % num_letters]; v /= num_letters; |
||||
|
||||
fd = open(pattern, O_CREAT | O_EXCL | O_RDWR, 0600); |
||||
if (fd > 0) |
||||
return fd; |
||||
/* |
||||
* Fatal error (EPERM, ENOSPC etc). |
||||
* It doesn't make sense to loop. |
||||
*/ |
||||
if (errno != EEXIST) |
||||
break; |
||||
/* |
||||
* This is a random value. It is only necessary that |
||||
* the next TMP_MAX values generated by adding 7777 to |
||||
* VALUE are different with (module 2^32). |
||||
*/ |
||||
value += 7777; |
||||
} |
||||
/* We return the null string if we can't find a unique file name. */ |
||||
pattern[0] = '\0'; |
||||
errno = EINVAL; |
||||
return -1; |
||||
} |
@ -0,0 +1,67 @@
@@ -0,0 +1,67 @@
|
||||
#!/bin/sh |
||||
# |
||||
# Copyright (c) 2010 Matthieu Moy |
||||
# |
||||
|
||||
test_description='Test repository with default ACL' |
||||
|
||||
# Create the test repo with restrictive umask |
||||
# => this must come before . ./test-lib.sh |
||||
umask 077 |
||||
|
||||
. ./test-lib.sh |
||||
|
||||
# We need an arbitrary other user give permission to using ACLs. root |
||||
# is a good candidate: exists on all unices, and it has permission |
||||
# anyway, so we don't create a security hole running the testsuite. |
||||
|
||||
if ! setfacl -m u:root:rwx .; then |
||||
say "Skipping ACL tests: unable to use setfacl" |
||||
test_done |
||||
fi |
||||
|
||||
modebits () { |
||||
ls -l "$1" | sed -e 's|^\(..........\).*|\1|' |
||||
} |
||||
|
||||
check_perms_and_acl () { |
||||
actual=$(modebits "$1") && |
||||
case "$actual" in |
||||
-r--r-----*) |
||||
: happy |
||||
;; |
||||
*) |
||||
echo "Got permission '$actual', expected '-r--r-----'" |
||||
false |
||||
;; |
||||
esac && |
||||
getfacl "$1" > actual && |
||||
grep -q "user:root:rwx" actual && |
||||
grep -q "user:${LOGNAME}:rwx" actual && |
||||
grep -q "mask::r--" actual && |
||||
grep -q "group::---" actual || false |
||||
} |
||||
|
||||
dirs_to_set="./ .git/ .git/objects/ .git/objects/pack/" |
||||
|
||||
test_expect_success 'Setup test repo' ' |
||||
setfacl -m u:root:rwx $dirs_to_set && |
||||
setfacl -d -m u:"$LOGNAME":rwx $dirs_to_set && |
||||
setfacl -d -m u:root:rwx $dirs_to_set && |
||||
|
||||
touch file.txt && |
||||
git add file.txt && |
||||
git commit -m "init" |
||||
' |
||||
|
||||
test_expect_success 'Objects creation does not break ACLs with restrictive umask' ' |
||||
# SHA1 for empty blob |
||||
check_perms_and_acl .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 |
||||
' |
||||
|
||||
test_expect_success 'git gc does not break ACLs with restrictive umask' ' |
||||
git gc && |
||||
check_perms_and_acl .git/objects/pack/*.pack |
||||
' |
||||
|
||||
test_done |
Loading…
Reference in new issue