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.
This commit is contained in:
parent
d5a72fd622
commit
42ea9cb286
22
fsck-cache.c
22
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",
|
||||
|
6
tree.c
6
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;
|
||||
|
Loading…
Reference in New Issue
Block a user