Skip to content

Commit

Permalink
set_shared_perm(): sometimes we know what the final mode bits should …
Browse files Browse the repository at this point in the history
…look like

adjust_shared_perm() first obtains the mode bits from lstat(2), expecting
to find what the result of applying user's umask is, and then tweaks it
as necessary.  When the file to be adjusted is created with mkstemp(3),
however, the mode thusly obtained does not have anything to do with user's
umask, and we would need to start from 0444 in such a case and there is no
point running lstat(2) for such a path.

This introduces a new API set_shared_perm() to bypass the lstat(2) and
instead force setting the mode bits to the desired value directly.
adjust_shared_perm() becomes a thin wrapper to the function.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Mar 28, 2009
1 parent 3be1f18 commit 17e61b8
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 11 deletions.
3 changes: 2 additions & 1 deletion cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,8 @@ enum sharedrepo {
PERM_EVERYBODY = 0664,
};
int git_config_perm(const char *var, const char *value);
int adjust_shared_perm(const char *path);
int set_shared_perm(const char *path, int mode);
#define adjust_shared_perm(path) set_shared_perm((path), 0)
int safe_create_leading_directories(char *path);
int safe_create_leading_directories_const(const char *path);
char *enter_repo(char *path, int strict);
Expand Down
25 changes: 16 additions & 9 deletions path.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,16 +311,23 @@ char *enter_repo(char *path, int strict)
return NULL;
}

int adjust_shared_perm(const char *path)
int set_shared_perm(const char *path, int mode)
{
struct stat st;
int mode, tweak, shared;
int tweak, shared, orig_mode;

if (!shared_repository)
if (!shared_repository) {
if (mode)
return chmod(path, mode & ~S_IFMT);
return 0;
if (lstat(path, &st) < 0)
return -1;
mode = st.st_mode;
}
if (!mode) {
if (lstat(path, &st) < 0)
return -1;
mode = st.st_mode;
orig_mode = mode;
} else
orig_mode = 0;
if (shared_repository < 0)
shared = -shared_repository;
else
Expand All @@ -344,9 +351,9 @@ int adjust_shared_perm(const char *path)
}

if (((shared_repository < 0
? (st.st_mode & (FORCE_DIR_SET_GID | 0777))
: (st.st_mode & mode)) != mode) &&
chmod(path, mode) < 0)
? (orig_mode & (FORCE_DIR_SET_GID | 0777))
: (orig_mode & mode)) != mode) &&
chmod(path, (mode & ~S_IFMT)) < 0)
return -2;
return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -2280,7 +2280,7 @@ int move_temp_to_file(const char *tmpfile, const char *filename)
}

out:
if (chmod(filename, 0444) || adjust_shared_perm(filename))
if (set_shared_perm(filename, (S_IFREG|0444)))
return error("unable to set permission to '%s'", filename);
return 0;
}
Expand Down

0 comments on commit 17e61b8

Please sign in to comment.