[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/2] pci-arbiter: Fix brokenness
From: |
Damien Zammit |
Subject: |
[PATCH 1/2] pci-arbiter: Fix brokenness |
Date: |
Mon, 8 Mar 2021 13:15:06 +1100 |
* 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