From a15e8fcfbe194df5cac40bea7bfb1f8750aeadd2 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Thu, 16 Aug 2012 03:06:36 +0200 Subject: [PATCH] nfs4: Check for semaphore creation errors in ConnectionBase classes --- .../file_systems/nfs4/CacheRevalidator.cpp | 6 +++-- .../kernel/file_systems/nfs4/Connection.cpp | 25 ++++++++++++++++++- .../kernel/file_systems/nfs4/NFS4Object.cpp | 14 ++++++++--- .../kernel/file_systems/nfs4/NFS4Server.cpp | 3 ++- .../kernel/file_systems/nfs4/RPCServer.cpp | 2 +- 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/CacheRevalidator.cpp b/src/add-ons/kernel/file_systems/nfs4/CacheRevalidator.cpp index 6c5e05dadc..749d6f8d57 100644 --- a/src/add-ons/kernel/file_systems/nfs4/CacheRevalidator.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/CacheRevalidator.cpp @@ -79,7 +79,8 @@ CacheRevalidator::_DirectoryCacheRevalidator() B_RELATIVE_TIMEOUT, DirectoryCache::kExpirationTime); if (result != B_TIMED_OUT) { - release_sem(fWaitCancel); + if (result == B_OK) + release_sem(fWaitCancel); return; } continue; @@ -95,7 +96,8 @@ CacheRevalidator::_DirectoryCacheRevalidator() status_t result = acquire_sem_etc(fWaitCancel, 1, B_ABSOLUTE_TIMEOUT, current->ExpireTime()); if (result != B_TIMED_OUT) { - release_sem(fWaitCancel); + if (result == B_OK) + release_sem(fWaitCancel); return; } diff --git a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp index 34d370d94e..22f08f27e1 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp @@ -476,7 +476,14 @@ Connection::Connect(Connection **_connection, const PeerAddress& address) if (conn == NULL) return B_NO_MEMORY; - status_t result = conn->Connect(); + status_t result; + if (conn->fWaitCancel < B_OK) { + result = conn->fWaitCancel; + delete conn; + return result; + } + + result = conn->Connect(); if (result != B_OK) { delete conn; return result; @@ -495,6 +502,14 @@ Connection::SetTo(Connection **_connection, int socket, Connection* conn = CreateObject(address); if (conn == NULL) return B_NO_MEMORY; + + status_t result; + if (conn->fWaitCancel < B_OK) { + result = conn->fWaitCancel; + delete conn; + return result; + } + conn->fSocket = socket; *_connection = conn; @@ -642,6 +657,14 @@ ConnectionListener::Listen(ConnectionListener** listener, uint16 port) return B_NO_MEMORY; } + status_t result; + if ((*listener)->fWaitCancel < B_OK) { + result = (*listener)->fWaitCancel; + close(sock); + delete *listener; + return result; + } + (*listener)->fSocket = sock; return B_OK; diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp index e29379d825..0e089acd2f 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp @@ -41,7 +41,9 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv, *sequence = fFileSystem->OpenOwnerSequenceLock(); return true; - } else if ((cookie->fMode & O_NONBLOCK) == 0) { + } + + if ((cookie->fMode & O_NONBLOCK) == 0) { status_t result = acquire_sem_etc(cookie->fSnoozeCancel, 1, B_RELATIVE_TIMEOUT, sSecToBigTime(5)); @@ -49,7 +51,8 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv, *sequence = fFileSystem->OpenOwnerSequenceLock(); if (result != B_TIMED_OUT) { - release_sem(cookie->fSnoozeCancel); + if (result == B_OK) + release_sem(cookie->fSnoozeCancel); return false; } return true; @@ -71,7 +74,9 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv, if (sequence != NULL) *sequence = fFileSystem->OpenOwnerSequenceLock(); return true; - } else if ((cookie->fMode & O_NONBLOCK) == 0) { + } + + if ((cookie->fMode & O_NONBLOCK) == 0) { status_t result = acquire_sem_etc(cookie->fSnoozeCancel, 1, B_RELATIVE_TIMEOUT, sSecToBigTime(leaseTime) / 3); @@ -79,7 +84,8 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv, *sequence = fFileSystem->OpenOwnerSequenceLock(); if (result != B_TIMED_OUT) { - release_sem(cookie->fSnoozeCancel); + if (result == B_OK) + release_sem(cookie->fSnoozeCancel); return false; } return true; diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp index 173e527596..60a6ee0d13 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp @@ -231,7 +231,8 @@ NFS4Server::_Renewal() status_t result = acquire_sem_etc(fWaitCancel, 1, B_RELATIVE_TIMEOUT, sSecToBigTime(fLeaseTime - 2)); if (result != B_TIMED_OUT) { - release_sem(fWaitCancel); + if (result == B_OK) + release_sem(fWaitCancel); return B_OK; } diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp index c07b20e21e..4095d4111a 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp @@ -112,7 +112,7 @@ Server::_StartListening() fThreadCancel = false; fThreadError = B_OK; fThread = spawn_kernel_thread(&Server::_ListenerThreadStart, - "NFSv4 Listener", B_NORMAL_PRIORITY, this); + "NFSv4 Listener", B_NORMAL_PRIORITY, this); if (fThread < B_OK) return fThread;