diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp index 2e0aee45ac..3dfdd61d80 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp @@ -7,6 +7,8 @@ */ +#include + #include "IdMap.h" #include "Inode.h" #include "NFS4Inode.h" @@ -989,12 +991,14 @@ NFS4Inode::ReadDirOnce(DirEntry** dirents, uint32* count, OpenDirCookie* cookie, if (result != B_OK) return result; } + ArrayDeleter beforeDeleter(before); result = reply.ReadDir(dirCookie, dirCookieVerf, dirents, count, eof); if (result != B_OK) { delete[] before; return result; } + ArrayDeleter entriesDeleter(*dirents); AttrValue* after; result = reply.GetAttr(&after, &attrCount); @@ -1002,6 +1006,7 @@ NFS4Inode::ReadDirOnce(DirEntry** dirents, uint32* count, OpenDirCookie* cookie, delete[] before; return result; } + ArrayDeleter afterDeleter(after); if ((*change == 0 && before[0].fData.fValue64 == after[0].fData.fValue64) @@ -1010,9 +1015,7 @@ NFS4Inode::ReadDirOnce(DirEntry** dirents, uint32* count, OpenDirCookie* cookie, else return B_ERROR; - delete[] before; - delete[] after; - + entriesDeleter.Detach(); return B_OK; } while (true); } diff --git a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp index e13808cbff..d078e4bc18 100644 --- a/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/ReplyInterpreter.cpp @@ -427,7 +427,12 @@ ReplyInterpreter::ReadDir(uint64* cookie, uint64* cookieVerf, *_count = count; *dirents = entries; - return fReply->Stream().IsEOF() ? B_BAD_VALUE : B_OK; + if (fReply->Stream().IsEOF()) { + delete[] entries; + return B_BAD_VALUE; + } + + return B_OK; }