hrev45385 adds 8 changesets to branch 'master' old head: 246c199c405c382ff1260fc30c8ab48b992a2a5c new head: ca8ad1dc1a9a5798b402e171814c903e019c185e overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=ca8ad1d+%5E246c199 ---------------------------------------------------------------------------- 2723b9e: nfs4: Fix CID 991506: memory leak in case of error 4fa87bf: nfs4: check for presence of FATTR4_CHANGE is not required This fixes CID 991501. 55ca54c: nfs4: Take advantage of strlcpy() 80f9419: nfs4: Fix error handling issues in Inode::Open() and Inode::Create() This fixes CID 991498. 83b1304: nfs4: Remove RequestBuilder::ReadDir() count argument The argument is ignored anyway. This fixes CID 991593. b302859: nfs4: Fix memory leaks in case of errors while reading a directory This fixes CID 991497. 5bdf33b: nfs4: Remove check for presence of mandatory attributes This fixes CID 991495. ca8ad1d: nfs4: Fix CID 991752: remove unnecessary return [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 9 files changed, 34 insertions(+), 22 deletions(-) src/add-ons/kernel/file_systems/nfs4/Inode.cpp | 2 +- src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp | 15 +++++++++++---- src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp | 13 ++++++++----- src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp | 1 - .../kernel/file_systems/nfs4/ReplyInterpreter.cpp | 7 ++++++- .../kernel/file_systems/nfs4/RequestBuilder.cpp | 6 ++---- src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h | 5 ++--- src/add-ons/kernel/file_systems/nfs4/RootInode.cpp | 3 +-- .../kernel/file_systems/nfs4/kernel_interface.cpp | 4 +++- ############################################################################ Commit: 2723b9eba4016848365fb45f5d2121ecb2d96078 URL: http://cgit.haiku-os.org/haiku/commit/?id=2723b9e Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Mar 19 01:22:14 2013 UTC nfs4: Fix CID 991506: memory leak in case of error ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp index bb80315..5c4c832 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -233,8 +233,10 @@ nfs4_get_vnode(fs_volume* volume, ino_t id, fs_vnode* vnode, int* _type, Inode* inode; status_t result = fs->GetInode(id, &inode); - if (result != B_OK) + if (result != B_OK) { + delete vnodeToInode; return result; + } vnodeToInode->Replace(inode); vnode->ops = &gNFSv4VnodeOps; ############################################################################ Commit: 4fa87bf1529b857a28528fef8e62100a3bcb2f42 URL: http://cgit.haiku-os.org/haiku/commit/?id=4fa87bf Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Mar 19 01:30:17 2013 UTC nfs4: check for presence of FATTR4_CHANGE is not required This fixes CID 991501. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp index 56c226b..97f9a10 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp @@ -45,7 +45,7 @@ NFS4Inode::GetChangeInfo(uint64* change, bool attrDir) AttrValue* values; uint32 count; result = reply.GetAttr(&values, &count); - if (result != B_OK || count < 1) + if (result != B_OK) return result; // FATTR4_CHANGE is mandatory ############################################################################ Commit: 55ca54ccf590ee28d39fedcb2f78bb76eb2bd835 URL: http://cgit.haiku-os.org/haiku/commit/?id=55ca54c Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Mar 19 01:32:05 2013 UTC nfs4: Take advantage of strlcpy() ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/RootInode.cpp b/src/add-ons/kernel/file_systems/nfs4/RootInode.cpp index 5278cf8..e79f832 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RootInode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RootInode.cpp @@ -135,8 +135,7 @@ RootInode::_UpdateInfo(bool force) || fFileSystem->GetConfiguration().fEmulateNamedAttrs) fInfoCache.flags |= B_FS_HAS_MIME | B_FS_HAS_ATTR; - strncpy(fInfoCache.volume_name, fName, sizeof(fInfoCache.volume_name)); - fInfoCache.volume_name[sizeof(fInfoCache.volume_name) - 1] = '\0'; + strlcpy(fInfoCache.volume_name, fName, sizeof(fInfoCache.volume_name)); fInfoCacheExpire = time(NULL) + MetadataCache::kExpirationTime; ############################################################################ Commit: 80f94193c43c146ed235405c3bb8ae20082c76f4 URL: http://cgit.haiku-os.org/haiku/commit/?id=80f9419 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Mar 19 01:37:44 2013 UTC nfs4: Fix error handling issues in Inode::Open() and Inode::Create() This fixes CID 991498. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp index 9748274..4eb1d49 100644 --- a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp @@ -74,10 +74,15 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie, cookie->fMode = mode; cookie->fLocks = NULL; - OpenState* state = new OpenState; + OpenState* state = new(std::nothrow) OpenState; + if (state == NULL) + return B_NO_MEMORY; + status_t result = CreateState(name, mode, perms, state, data); - if (result != B_OK) + if (result != B_OK) { + delete state; return result; + } cookie->fOpenState = state; cookie->fFileSystem = fFileSystem; @@ -105,7 +110,7 @@ Inode::Open(int mode, OpenFileCookie* cookie) if (fOpenState == NULL) { RevalidateFileCache(); - OpenState* state = new OpenState; + OpenState* state = new(std::nothrow) OpenState; if (state == NULL) return B_NO_MEMORY; @@ -113,8 +118,10 @@ Inode::Open(int mode, OpenFileCookie* cookie) state->fFileSystem = fFileSystem; state->fMode = mode & O_RWMASK; status_t result = OpenFile(state, mode, &data); - if (result != B_OK) + if (result != B_OK) { + delete state; return result; + } fFileSystem->AddOpenFile(state); fOpenState = state; ############################################################################ Commit: 83b13040c8004685d4d1128bd83baa5f4ac012ff URL: http://cgit.haiku-os.org/haiku/commit/?id=83b1304 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Mar 19 01:43:22 2013 UTC nfs4: Remove RequestBuilder::ReadDir() count argument The argument is ignored anyway. This fixes CID 991593. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp index 97f9a10..2e0aee4 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp @@ -966,7 +966,7 @@ NFS4Inode::ReadDirOnce(DirEntry** dirents, uint32* count, OpenDirCookie* cookie, req.GetAttr(dirAttr, sizeof(dirAttr) / sizeof(Attribute)); Attribute attr[] = { FATTR4_FSID, FATTR4_FILEID }; - req.ReadDir(*count, *dirCookie, *dirCookieVerf, attr, + req.ReadDir(*dirCookie, *dirCookieVerf, attr, sizeof(attr) / sizeof(Attribute)); req.GetAttr(dirAttr, sizeof(dirAttr) / sizeof(Attribute)); diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp index 83ff3b4..f900b84 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.cpp @@ -516,11 +516,9 @@ RequestBuilder::Read(const uint32* id, uint32 stateSeq, uint64 pos, uint32 len) status_t -RequestBuilder::ReadDir(uint32 count, uint64 cookie, uint64 cookieVerf, - Attribute* attrs, uint32 attrCount) +RequestBuilder::ReadDir(uint64 cookie, uint64 cookieVerf, Attribute* attrs, + uint32 attrCount) { - (void)count; - if (fProcedure != ProcCompound) return B_BAD_VALUE; if (fRequest == NULL) diff --git a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h index 6bf7524..00b0d07 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h +++ b/src/add-ons/kernel/file_systems/nfs4/RequestBuilder.h @@ -63,9 +63,8 @@ public: status_t PutRootFH(); status_t Read(const uint32* id, uint32 stateSeq, uint64 pos, uint32 len); - status_t ReadDir(uint32 count, uint64 cookie, - uint64 cookieVerf, Attribute* attrs, - uint32 attrCount); + status_t ReadDir(uint64 cookie, uint64 cookieVerf, + Attribute* attrs, uint32 attrCount); status_t ReadLink(); status_t Remove(const char* file); status_t Rename(const char* from, const char* to); ############################################################################ Commit: b302859608dd492877a0c5b492cf7d81953f0c8b URL: http://cgit.haiku-os.org/haiku/commit/?id=b302859 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Mar 19 01:52:39 2013 UTC nfs4: Fix memory leaks in case of errors while reading a directory This fixes CID 991497. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.cpp index 2e0aee4..3dfdd61 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 <AutoDeleter.h> + #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<AttrValue> beforeDeleter(before); result = reply.ReadDir(dirCookie, dirCookieVerf, dirents, count, eof); if (result != B_OK) { delete[] before; return result; } + ArrayDeleter<DirEntry> 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<AttrValue> 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 e13808c..d078e4b 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; } ############################################################################ Commit: 5bdf33bc7a55acae20d715fb7527b676ca77fd49 URL: http://cgit.haiku-os.org/haiku/commit/?id=5bdf33b Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Mar 19 01:55:31 2013 UTC nfs4: Remove check for presence of mandatory attributes This fixes CID 991495. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index abebe6f..48ad7f0 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -86,7 +86,7 @@ Inode::CreateInode(FileSystem* fs, const FileInfo& fi, Inode** _inode) AttrValue* values; uint32 count; result = reply.GetAttr(&values, &count); - if (result != B_OK || count < 4) + if (result != B_OK) return result; if (fi.fFileId == 0) { ############################################################################ Revision: hrev45385 Commit: ca8ad1dc1a9a5798b402e171814c903e019c185e URL: http://cgit.haiku-os.org/haiku/commit/?id=ca8ad1d Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Mar 19 01:57:18 2013 UTC nfs4: Fix CID 991752: remove unnecessary return ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp index 830935f..21411cc 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp @@ -366,7 +366,6 @@ NFS4Server::CallbackGetAttr(RequestInterpreter* request, ReplyBuilder* reply) status_t result = request->GetAttr(&handle, &mask); if (result != B_OK) return result; - return B_OK; MutexLocker locker(fFSLock);