projects
/
git.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
git-init-db: initialize shared repositories with --shared
[git.git]
/
sha1_file.c
diff --git
a/sha1_file.c
b/sha1_file.c
index
fa22e9c
..
8bebbb2
100644
(file)
--- a/
sha1_file.c
+++ b/
sha1_file.c
@@
-48,6
+48,29
@@
int get_sha1_hex(const char *hex, unsigned char *sha1)
return 0;
}
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;
int safe_create_leading_directories(char *path)
{
char *pos = path;
@@
-59,11
+82,16
@@
int safe_create_leading_directories(char *path)
if (!pos)
break;
*pos = 0;
if (!pos)
break;
*pos = 0;
- if (mkdir(path, 0777) < 0)
+ if (mkdir(path, 0777) < 0)
{
if (errno != EEXIST) {
*pos = '/';
return -1;
}
if (errno != EEXIST) {
*pos = '/';
return -1;
}
+ }
+ else if (adjust_shared_perm(path)) {
+ *pos = '/';
+ return -2;
+ }
*pos++ = '/';
}
return 0;
*pos++ = '/';
}
return 0;
@@
-81,6
+109,8
@@
char * sha1_to_hex(const unsigned char *sha1)
*buf++ = hex[val >> 4];
*buf++ = hex[val & 0xf];
}
*buf++ = hex[val >> 4];
*buf++ = hex[val & 0xf];
}
+ *buf = '\0';
+
return buffer;
}
return buffer;
}
@@
-319,12
+349,16
@@
struct packed_git *packed_git;
static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
void **idx_map_)
{
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;
void *idx_map;
unsigned int *index;
unsigned long idx_size;
int nr, i;
- int fd
= open(path, O_RDONLY)
;
+ int fd;
struct stat st;
struct stat st;
+
+ fd = open(path, O_RDONLY);
if (fd < 0)
return -1;
if (fstat(fd, &st)) {
if (fd < 0)
return -1;
if (fstat(fd, &st)) {
@@
-362,6
+396,16
@@
static int check_packed_git_idx(const char *path, unsigned long *idx_size_,
if (idx_size != 4*256 + nr * 24 + 20 + 20)
return error("wrong index file size");
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;
}
return 0;
}
@@
-464,7
+508,7
@@
struct packed_git *add_packed_git(char *path, int path_len, int local)
p->pack_last_used = 0;
p->pack_use_cnt = 0;
p->pack_local = local;
p->pack_last_used = 0;
p->pack_use_cnt = 0;
p->pack_local = local;
- if (
!get_sha1_hex(path + path_len - 40 -
4, sha1))
+ if (
(path_len > 44) && !get_sha1_hex(path + path_len - 4
4, sha1))
memcpy(p->sha1, sha1, 20);
return p;
}
memcpy(p->sha1, sha1, 20);
return p;
}
@@
-1239,6
+1283,8
@@
static int link_temp_to_file(const char *tmpfile, char *filename)
if (dir) {
*dir = 0;
mkdir(filename, 0777);
if (dir) {
*dir = 0;
mkdir(filename, 0777);
+ if (adjust_shared_perm(filename))
+ return -2;
*dir = '/';
if (!link(tmpfile, filename))
return 0;
*dir = '/';
if (!link(tmpfile, filename))
return 0;
@@
-1274,7
+1320,7
@@
int move_temp_to_file(const char *tmpfile, char *filename)
unlink(tmpfile);
if (ret) {
if (ret != EEXIST) {
unlink(tmpfile);
if (ret) {
if (ret != EEXIST) {
- fprintf(stderr, "unable to write sha1 filename %s: %s", filename, strerror(ret));
+ fprintf(stderr, "unable to write sha1 filename %s: %s
\n
", filename, strerror(ret));
return -1;
}
/* FIXME!!! Collision check here ? */
return -1;
}
/* FIXME!!! Collision check here ? */
@@
-1313,7
+1359,7
@@
int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned cha
}
if (errno != ENOENT) {
}
if (errno != ENOENT) {
- fprintf(stderr, "sha1 file %s: %s", filename, strerror(errno));
+ fprintf(stderr, "sha1 file %s: %s
\n
", filename, strerror(errno));
return -1;
}
return -1;
}
@@
-1321,7
+1367,7
@@
int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned cha
fd = mkstemp(tmpfile);
if (fd < 0) {
fd = mkstemp(tmpfile);
if (fd < 0) {
- fprintf(stderr, "unable to create temporary sha1 filename %s: %s", tmpfile, strerror(errno));
+ fprintf(stderr, "unable to create temporary sha1 filename %s: %s
\n
", tmpfile, strerror(errno));
return -1;
}
return -1;
}
@@
-1410,7
+1456,7
@@
int write_sha1_to_fd(int fd, const unsigned char *sha1)
size = write(fd, buf + posn, objsize - posn);
if (size <= 0) {
if (!size) {
size = write(fd, buf + posn, objsize - posn);
if (size <= 0) {
if (!size) {
- fprintf(stderr, "write closed");
+ fprintf(stderr, "write closed
\n
");
} else {
perror("write ");
}
} else {
perror("write ");
}