bug-hurd
[Top][All Lists]
Advanced

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

[PATCH 1/6] pci-arbiter: Fix brokenness


From: Damien Zammit
Subject: [PATCH 1/6] pci-arbiter: Fix brokenness
Date: Sun, 7 Mar 2021 17:39:05 +1100

---
 pci-arbiter/netfs_impl.c | 42 ++++++++++++++++++++++++++--------------
 pci-arbiter/pci-ops.c    |  6 +++---
 pci-arbiter/pcifs.c      | 18 +++++++++++------
 3 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c
index b987a0bc..e977dce3 100644
--- a/pci-arbiter/netfs_impl.c
+++ b/pci-arbiter/netfs_impl.c
@@ -59,25 +59,19 @@ 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;
-    }
-
-  size =
-    (count * DIRENTS_CHUNK_SIZE) >
-    max_data_len ? max_data_len : count * DIRENTS_CHUNK_SIZE;
+  count = nentries - first_entry;
+  if (max_entries > 0 && count > max_entries)
+    count = max_entries;
+  size = count * DIRENTS_CHUNK_SIZE;
 
   *data = mmap (0, size, PROT_READ | PROT_WRITE, MAP_ANON, 0, 0);
   err = ((void *) *data == (void *) -1) ? errno : 0;
@@ -234,8 +228,8 @@ 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);
+      err = get_dirents (dir->nn->ln, first_entry, -1,
+                        data, data_len, 0, data_entries);
     }
   else
     err = ENOTDIR;
@@ -257,6 +251,24 @@ 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)
+    {
+      while (*last)
+        last++;
+      last--;
+      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 +304,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 3346e55a..07228fbe 100644
--- a/pci-arbiter/pci-ops.c
+++ b/pci-arbiter/pci-ops.c
@@ -39,12 +39,12 @@ check_permissions (struct protid *master, int flags)
   node = master->po->np;
   e = node->nn->ln;
 
-  /* Check wheter the user has permissions to access this node */
-  err = entry_check_perms (master->user, e, flags);
+  /* Check whether the user has permissions to access this node */
+  err = netfs_check_open_permissions (master->user, node, flags, 0);
   if (err)
     return err;
 
-  /* Check wheter the request has been sent to the proper node */
+  /* Check whether the request has been sent to the proper node */
   if (e->domain != 0           /* Only domain 0 can be accessed by I/O ports */
       || e->bus < 0 || e->dev < 0 || e->func < 0)
     err = EINVAL;
diff --git a/pci-arbiter/pcifs.c b/pci-arbiter/pcifs.c
index 0535779e..e09bdd13 100644
--- a/pci-arbiter/pcifs.c
+++ b/pci-arbiter/pcifs.c
@@ -31,6 +31,9 @@
 #include "ncache.h"
 #include "func_files.h"
 
+/* Empty status for root node when bootstrapping */
+static io_statbuf_t underlying_stat;
+
 static error_t
 create_dir_entry (int32_t domain, int16_t bus, int16_t dev,
                  int16_t func, int32_t device_class, char *name,
@@ -93,17 +96,20 @@ init_file_system (file_t underlying_node, struct pcifs * fs)
 {
   error_t err;
   struct node *np;
-  io_statbuf_t underlying_node_stat;
+  io_statbuf_t *underlying_node_stat = &underlying_stat;
 
-  /* Initialize status from underlying node.  */
-  err = io_stat (underlying_node, &underlying_node_stat);
-  if (err)
-    return err;
+  if (underlying_node)
+    {
+      /* Initialize status from underlying node.  */
+      err = io_stat (underlying_node, underlying_node_stat);
+      if (err)
+        return err;
+    }
 
   np = netfs_make_node_alloc (sizeof (struct netnode));
   if (!np)
     return ENOMEM;
-  np->nn_stat = underlying_node_stat;
+  np->nn_stat = *underlying_node_stat;
   np->nn_stat.st_fsid = getpid ();
   np->nn_stat.st_mode =
     S_IFDIR | S_IROOT | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH |
-- 
2.30.1




reply via email to

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