bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/4] pci-arbiter: Fix brokenness


From: Damien Zammit
Subject: [PATCH 2/4] pci-arbiter: Fix brokenness
Date: Tue, 9 Mar 2021 00:04:55 +1100

---
 pci-arbiter/netfs_impl.c | 39 ++++++++++++++++++++++++++-------------
 pci-arbiter/pci-ops.c    |  2 +-
 2 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c
index b987a0bc..2748c382 100644
--- a/pci-arbiter/netfs_impl.c
+++ b/pci-arbiter/netfs_impl.c
@@ -59,25 +59,22 @@ 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 = ((first_entry + max_entries) >= dir->dir->num_entries ?
-              dir->dir->num_entries : max_entries) - first_entry;
-    }
+  count = nentries - first_entry;
+  if (max_entries >= 0 && count > max_entries)
+    count = max_entries;
 
-  size =
-    (count * DIRENTS_CHUNK_SIZE) >
-    max_data_len ? max_data_len : count * DIRENTS_CHUNK_SIZE;
+  size = count * DIRENTS_CHUNK_SIZE;
+  if (max_data_len && size > max_data_len)
+    size = max_data_len;
 
   *data = mmap (0, size, PROT_READ | PROT_WRITE, MAP_ANON, 0, 0);
   err = ((void *) *data == (void *) -1) ? errno : 0;
@@ -235,7 +232,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 +254,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 +305,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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]