[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
- [PATCH: hurd x6], Damien Zammit, 2021/03/07
- [PATCH 2/6] pci-arbiter: Introduce machdev into this server, Damien Zammit, 2021/03/07
- [PATCH 3/6] libnetfs: Hacks to allow pci to run with no cred, Damien Zammit, 2021/03/07
- [PATCH 4/6] rumpdisk: Don't pretend to be the arbiter anymore, Damien Zammit, 2021/03/07
- [PATCH 1/6] pci-arbiter: Fix brokenness,
Damien Zammit <=
- [PATCH 6/6] pci-arbiter: Close correctly, Damien Zammit, 2021/03/07
- [PATCH 5/6] machdev,pci,rump: fix shutdown dosync, Damien Zammit, 2021/03/07
- Re: [PATCH: hurd x6], Samuel Thibault, 2021/03/07