bug-hurd
[Top][All Lists]
Advanced

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

[PATCH] acpi: Fix brokenness


From: Damien Zammit
Subject: [PATCH] acpi: Fix brokenness
Date: Mon, 8 Mar 2021 16:05:48 +1100

Fix count and size

---
 acpi/netfs_impl.c | 41 +++++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 12 deletions(-)

diff --git a/acpi/netfs_impl.c b/acpi/netfs_impl.c
index 84f52c89..d9853a08 100644
--- a/acpi/netfs_impl.c
+++ b/acpi/netfs_impl.c
@@ -58,25 +58,26 @@ get_dirents (struct acpifs_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;
@@ -251,11 +252,27 @@ netfs_get_dirents (struct iouser * cred, struct node * 
dir,
    (*NODE, if found, should be locked, this call should unlock DIR no matter
    what.) */
 error_t
-netfs_attempt_lookup (struct iouser *user, struct node *dir,
-                      char *name, struct node **node)
+netfs_attempt_lookup (struct iouser * user, struct node * dir,
+                     char *name, struct node ** node)
 {
   error_t err = 0;
   struct acpifs_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
-- 
2.30.1




reply via email to

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