diff --git a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp index 70eb4fe20d..7191a8d1b7 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp @@ -372,6 +372,9 @@ ConnectionStream::Receive(void** _buffer, uint32* _size) object[1].events = B_EVENT_READ; do { + object[0].events = B_EVENT_ACQUIRE_SEMAPHORE; + object[1].events = B_EVENT_READ; + result = wait_for_objects(object, 2); if (result < B_OK || (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) { @@ -383,7 +386,7 @@ ConnectionStream::Receive(void** _buffer, uint32* _size) // There is only one listener thread per connection. No need to lock. uint32 received = 0; do { - result = recv(fSocket, &record_size + received, + result = recv(fSocket, ((uint8*)&record_size) + received, sizeof(record_size) - received, 0); received += result; } while (result > 0 && received < sizeof(record_size)); @@ -397,6 +400,8 @@ ConnectionStream::Receive(void** _buffer, uint32* _size) } record_size = ntohl(record_size); + ASSERT(record_size > 0); + last_one = static_cast(record_size) < 0; record_size &= LAST_FRAGMENT - 1; @@ -417,6 +422,9 @@ ConnectionStream::Receive(void** _buffer, uint32* _size) result = errno; free(buffer); return result; + } else if (result == 0) { + free(buffer); + return ECONNABORTED; } size += record_size; @@ -453,6 +461,9 @@ ConnectionPacket::Receive(void** _buffer, uint32* _size) object[1].events = B_EVENT_READ; do { + object[0].events = B_EVENT_ACQUIRE_SEMAPHORE; + object[1].events = B_EVENT_READ; + result = wait_for_objects(object, 2); if (result < B_OK || (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) { @@ -719,6 +730,9 @@ ConnectionListener::AcceptConnection(Connection** connection) object[1].events = B_EVENT_READ; do { + object[0].events = B_EVENT_ACQUIRE_SEMAPHORE; + object[1].events = B_EVENT_READ; + status_t result = wait_for_objects(object, 2); if (result < B_OK || (object[0].events & B_EVENT_ACQUIRE_SEMAPHORE) != 0) { diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp index de2faf589a..a8ae352370 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp @@ -265,7 +265,7 @@ Server::_Listener() { status_t result; uint32 size; - void* buffer; + void* buffer = NULL; while (!fThreadCancel) { result = fConnection->Receive(&buffer, &size); @@ -275,7 +275,8 @@ Server::_Listener() fThreadError = result; return result; } - + + ASSERT(buffer != NULL && size > 0); Reply* reply = new(std::nothrow) Reply(buffer, size); if (reply == NULL) { free(buffer); diff --git a/src/add-ons/kernel/file_systems/nfs4/WorkQueue.cpp b/src/add-ons/kernel/file_systems/nfs4/WorkQueue.cpp index 8806436351..0e00775451 100644 --- a/src/add-ons/kernel/file_systems/nfs4/WorkQueue.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/WorkQueue.cpp @@ -115,8 +115,8 @@ void WorkQueue::DequeueJob() { MutexLocker locker(fQueueLock); - WorkQueueEntry* entry = fQueue.RemoveHead(); + locker.Unlock(); ASSERT(entry != NULL); void* args = entry->fArguments;