Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-06 03:18:48 +0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-06 03:18:48 +0400
commit42ea9cb286423c949d42ad33823a5221182f84bf (patch)
tree599757cc3e6a2bf3ab29d22246662460c1537393
parentd5a72fd622ecedaea272cd6292abb7138a49e460 (diff)
Be more careful about tree entry modes.
The tree object parsing used to get the executable bit wrong, and didn't know about symlinks. Also, fsck really wants the full mode value so that it can verify the other bits for sanity, so save it all in struct tree_entry.
-rw-r--r--fsck-cache.c22
-rw-r--r--tree.c6
-rw-r--r--tree.h2
3 files changed, 28 insertions, 2 deletions
diff --git a/fsck-cache.c b/fsck-cache.c
index 301cc67b76..abdec92ffc 100644
--- a/fsck-cache.c
+++ b/fsck-cache.c
@@ -100,6 +100,28 @@ static int fsck_tree(struct tree *item)
if (strchr(entry->name, '/'))
has_full_path = 1;
+ switch (entry->mode) {
+ /*
+ * Standard modes..
+ */
+ case S_IFREG | 0755:
+ case S_IFREG | 0644:
+ case S_IFLNK:
+ case S_IFDIR:
+ break;
+ /*
+ * This is nonstandard, but we had a few of these
+ * early on when we honored the full set of mode
+ * bits..
+ */
+ case S_IFREG | 0664:
+ break;
+ default:
+ printf("tree %s has entry %o %s\n",
+ sha1_to_hex(item->object.sha1),
+ entry->mode, entry->name);
+ }
+
if (last) {
if (verify_ordered(last, entry) < 0) {
fprintf(stderr, "tree %s not ordered\n",
diff --git a/tree.c b/tree.c
index 4a26603f6e..468f99e494 100644
--- a/tree.c
+++ b/tree.c
@@ -122,8 +122,10 @@ int parse_tree(struct tree *item)
entry = xmalloc(sizeof(struct tree_entry_list));
entry->name = strdup(path + 1);
- entry->directory = S_ISDIR(mode);
- entry->executable = mode & S_IXUSR;
+ entry->directory = S_ISDIR(mode) != 0;
+ entry->executable = (mode & S_IXUSR) != 0;
+ entry->symlink = S_ISLNK(mode) != 0;
+ entry->mode = mode;
entry->next = NULL;
bufptr += len + 20;
diff --git a/tree.h b/tree.h
index 96cf4291d1..e1c94c090c 100644
--- a/tree.h
+++ b/tree.h
@@ -9,6 +9,8 @@ struct tree_entry_list {
struct tree_entry_list *next;
unsigned directory : 1;
unsigned executable : 1;
+ unsigned symlink : 1;
+ unsigned int mode;
char *name;
union {
struct tree *tree;