From 47c4ae37512708eb7cd2e8c05ad60e196e7764ad Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Wed, 20 Jun 2012 19:20:49 +0200 Subject: [PATCH] nfs4: Fix ReadDir() bug when skipping inodes --- src/add-ons/kernel/file_systems/nfs4/Inode.cpp | 9 ++++++--- .../kernel/file_systems/nfs4/ReplyInterpreter.cpp | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index 4149599b0b..d49d143da3 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -801,6 +801,7 @@ Inode::ReadDir(void* _buffer, uint32 size, uint32* _count, uint64* cookie) cookie[1]--; } + bool overflow = false; while (count < *_count && !eof) { this_count = *_count - count; DirEntry* dirents; @@ -809,7 +810,7 @@ Inode::ReadDir(void* _buffer, uint32 size, uint32* _count, uint64* cookie) if (result != B_OK) return result; - uint32 i; + uint32 i, entries = 0; for (i = 0; i < min_c(this_count, *_count - count); i++) { struct dirent* de = reinterpret_cast(buffer + pos); @@ -828,16 +829,18 @@ Inode::ReadDir(void* _buffer, uint32 size, uint32* _count, uint64* cookie) const char* name = dirents[i].fName; if (_FillDirEntry(de, id, name, pos, size) == B_BUFFER_OVERFLOW) { eof = true; + overflow = true; break; } pos += de->d_reclen; + entries++; } delete[] dirents; - count += i; + count += entries; } - if (count == 0 && this_count > 0) + if (count == 0 && overflow) return B_BUFFER_OVERFLOW; *_count = count; diff --git a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp index 5a1fb56977..092b2ff01d 100644 --- a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp @@ -345,7 +345,8 @@ ReplyInterpreter::_DecodeAttrs(XDR::ReadStream& str, AttrValue** attrs, fsid.fMajor = stream.GetUHyper(); fsid.fMinor = stream.GetUHyper(); - values[current].fData.fPointer = new FilesystemId(fsid); + values[current].fData.fPointer = malloc(sizeof(fsid)); + memcpy(values[current].fData.fPointer, &fsid, sizeof(fsid)); current++; }