From 49935f9b4f55bfad77098bf6e2652c8163760bd6 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Tue, 7 Aug 2012 00:22:34 +0200 Subject: [PATCH] nfs4: Check if user is allowed to use open state --- .../kernel/file_systems/nfs4/Inode.cpp | 13 +++++++--- src/add-ons/kernel/file_systems/nfs4/Inode.h | 2 ++ .../kernel/file_systems/nfs4/InodeRegular.cpp | 26 ++++++++++++------- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index 1121a6e765..c86d104c2d 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -805,13 +805,20 @@ Inode::ReturnDelegation(bool truncate) MutexLocker stateLocker(fStateLock); fOpenState->fDelegation = NULL; + ReleaseOpenState(); + + delete fDelegation; + fDelegation = NULL; +} + + +void +Inode::ReleaseOpenState() +{ if (fOpenState->ReleaseReference() == 1) { fFileSystem->RemoveOpenFile(fOpenState); fOpenState = NULL; } - - delete fDelegation; - fDelegation = NULL; } diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.h b/src/add-ons/kernel/file_systems/nfs4/Inode.h index 6dce7ba4cf..b30f33f1a9 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.h +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.h @@ -93,6 +93,8 @@ public: protected: Inode(); + void ReleaseOpenState(); + status_t CreateState(const char* name, int mode, int perms, OpenState* state, OpenDelegationData* data); diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp index a4dcd76d96..a4f69678c3 100644 --- a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp @@ -130,13 +130,24 @@ Inode::Open(int mode, OpenFileCookie* cookie) status_t result = OpenFile(fOpenState, O_RDWR, &data); if (result != B_OK) { locker.Lock(); - if (fOpenState->ReleaseReference() == 1) { - fFileSystem->RemoveOpenFile(fOpenState); - fOpenState = NULL; - } + ReleaseOpenState(); return result; } fOpenState->fMode = O_RDWR; + } else { + int newMode = mode & O_RWMASK; + uint32 allowed = 0; + if (newMode == O_RDWR || newMode == O_RDONLY) + allowed |= R_OK; + if (newMode == O_RDWR || newMode == O_WRONLY) + allowed |= W_OK; + + status_t result = Access(allowed); + if (result != B_OK) { + locker.Lock(); + ReleaseOpenState(); + return result; + } } } @@ -173,12 +184,7 @@ Inode::Close(OpenFileCookie* cookie) SyncAndCommit(); MutexLocker _(fStateLock); - if (cookie->fOpenState != NULL) { - if (cookie->fOpenState->ReleaseReference() == 1) { - fFileSystem->RemoveOpenFile(fOpenState); - fOpenState = NULL; - } - } + ReleaseOpenState(); return B_OK; }