From: Junio C Hamano Date: Fri, 20 Jan 2006 03:56:27 +0000 (-0800) Subject: GIT 1.1.4 X-Git-Tag: v1.1.4^0 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/c4e804bbf0c16aa0c2234ea733fba73de28bddaa?ds=inline;hp=-c GIT 1.1.4 --- c4e804bbf0c16aa0c2234ea733fba73de28bddaa diff --combined sha1_file.c index 8bebbb255f,d451a94efe..20f6419bde --- a/sha1_file.c +++ b/sha1_file.c @@@ -48,29 -48,6 +48,29 @@@ int get_sha1_hex(const char *hex, unsig return 0; } +int adjust_shared_perm(const char *path) +{ + struct stat st; + int mode; + + if (!shared_repository) + return 0; + if (lstat(path, &st) < 0) + return -1; + mode = st.st_mode; + if (mode & S_IRUSR) + mode |= S_IRGRP; + if (mode & S_IWUSR) + mode |= S_IWGRP; + if (mode & S_IXUSR) + mode |= S_IXGRP; + if (S_ISDIR(mode)) + mode |= S_ISGID; + if (chmod(path, mode) < 0) + return -2; + return 0; +} + int safe_create_leading_directories(char *path) { char *pos = path; @@@ -82,16 -59,11 +82,16 @@@ if (!pos) break; *pos = 0; - if (mkdir(path, 0777) < 0) + if (mkdir(path, 0777) < 0) { if (errno != EEXIST) { *pos = '/'; return -1; } + } + else if (adjust_shared_perm(path)) { + *pos = '/'; + return -2; + } *pos++ = '/'; } return 0; @@@ -349,16 -321,12 +349,12 @@@ struct packed_git *packed_git static int check_packed_git_idx(const char *path, unsigned long *idx_size_, void **idx_map_) { - SHA_CTX ctx; - unsigned char sha1[20]; void *idx_map; unsigned int *index; unsigned long idx_size; int nr, i; - int fd; + int fd = open(path, O_RDONLY); struct stat st; - - fd = open(path, O_RDONLY); if (fd < 0) return -1; if (fstat(fd, &st)) { @@@ -396,16 -364,6 +392,6 @@@ if (idx_size != 4*256 + nr * 24 + 20 + 20) return error("wrong index file size"); - /* - * File checksum. - */ - SHA1_Init(&ctx); - SHA1_Update(&ctx, idx_map, idx_size-20); - SHA1_Final(sha1, &ctx); - - if (memcmp(sha1, idx_map + idx_size - 20, 20)) - return error("index checksum mismatch"); - return 0; } @@@ -1283,8 -1241,6 +1269,8 @@@ static int link_temp_to_file(const cha if (dir) { *dir = 0; mkdir(filename, 0777); + if (adjust_shared_perm(filename)) + return -2; *dir = '/'; if (!link(tmpfile, filename)) return 0;