* pci-arbiter/netfs_impl.c (get_dirents): Fix count and size detection (netfs_attempt_lookup): Strip trailing slashes and leading dot slashes * pci-arbiter/pci-ops.c (check_permissions): Use the overridable method instead
--- pci-arbiter/netfs_impl.c | 41 ++++++++++++++++++++++++++++------------ pci-arbiter/pci-ops.c | 2 +- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c index b987a0bc..15ca1d08 100644 --- a/pci-arbiter/netfs_impl.c +++ b/pci-arbiter/netfs_impl.c @@ -59,25 +59,26 @@ get_dirents (struct pcifs_dirent *dir, int i, count; size_t size; char *p; + int nentries = (int)dir->dir->num_entries; - if (first_entry >= dir->dir->num_entries) + if (first_entry >= nentries) { *data_len = 0; *data_entries = 0; return 0; } - if (max_entries < 0) - count = dir->dir->num_entries; - else + count = nentries - first_entry; + if (max_entries >= 0 && count > max_entries) + count = max_entries; + if (max_data_len) { - count = ((first_entry + max_entries) >= dir->dir->num_entries ? - dir->dir->num_entries : max_entries) - first_entry; + size = + ((count * DIRENTS_CHUNK_SIZE) > max_data_len) ? + max_data_len : count * DIRENTS_CHUNK_SIZE; } - - size = - (count * DIRENTS_CHUNK_SIZE) > - max_data_len ? max_data_len : count * DIRENTS_CHUNK_SIZE; + else + size = count * DIRENTS_CHUNK_SIZE; *data = mmap (0, size, PROT_READ | PROT_WRITE, MAP_ANON, 0, 0); err = ((void *) *data == (void *) -1) ? errno : 0; @@ -235,7 +236,7 @@ netfs_get_dirents (struct iouser * cred, struct node * dir, if (dir->nn->ln->dir) { err = get_dirents (dir->nn->ln, first_entry, max_entries, - data, data_len, max_entries, data_entries); + data, data_len, max_data_len, data_entries); } else err = ENOTDIR; @@ -257,6 +258,22 @@ netfs_attempt_lookup (struct iouser * user, struct node * dir, { error_t err = 0; struct pcifs_dirent *entry; + char *last = name; + + /* Strip trailing slashes */ + if (*last) + { + last += strlen(name) - 1; + while (*last == '/' && last >= name) + { + *last = '\0'; + last--; + } + } + + /* Skip leading dot slashes */ + while (*name == '.' && *(name+1) == '/') + name += 2; if (*name == '\0' || strcmp (name, ".") == 0) /* Current directory -- just add an additional reference to DIR's node @@ -292,7 +309,7 @@ netfs_attempt_lookup (struct iouser * user, struct node * dir, /* `dir' is a directory */ /* Check dir permissions */ - err = entry_check_perms (user, dir->nn->ln, O_READ | O_EXEC); + err = netfs_check_open_permissions (user, dir, O_READ | O_EXEC, 0); if (!err) { entry = lookup (dir, name); diff --git a/pci-arbiter/pci-ops.c b/pci-arbiter/pci-ops.c index 72720832..07228fbe 100644 --- a/pci-arbiter/pci-ops.c +++ b/pci-arbiter/pci-ops.c @@ -40,7 +40,7 @@ check_permissions (struct protid *master, int flags) e = node->nn->ln; /* Check whether the user has permissions to access this node */ - err = entry_check_perms (master->user, e, flags); + err = netfs_check_open_permissions (master->user, node, flags, 0); if (err) return err; -- 2.30.1