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