From e360230ecdc236e9bc17e790bf0f689566f688c0 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 26 Oct 2008 12:36:24 +0000 Subject: [PATCH] _user_xsi_msgrcv(): * Fixed some places that set an error return value but didn't actually return. * Fixed success case return value. The number of bytes received must be returned, not B_OK. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28335 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/posix/xsi_message_queue.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/system/kernel/posix/xsi_message_queue.cpp b/src/system/kernel/posix/xsi_message_queue.cpp index 955e169abf..baabfb3148 100644 --- a/src/system/kernel/posix/xsi_message_queue.cpp +++ b/src/system/kernel/posix/xsi_message_queue.cpp @@ -76,7 +76,7 @@ struct queued_message : DoublyLinkedListLinkImpl { free(message); } - status_t copy_to_user_buffer(void *_message, ssize_t _length) + ssize_t copy_to_user_buffer(void *_message, ssize_t _length) { if (_length > length) _length = length; @@ -85,7 +85,7 @@ struct queued_message : DoublyLinkedListLinkImpl { || user_memcpy((void *)((char *)_message + sizeof(long)), message, _length) != B_OK) return B_ERROR; - return B_OK; + return _length; } bool initOK; @@ -753,8 +753,7 @@ _user_xsi_msgrcv(int messageQueueID, void *messagePointer, } queued_message *message = NULL; - bool notReceived = true; - while (notReceived) { + while (true) { message = messageQueue->Remove(messageType); if (message == NULL && !(messageFlags & IPC_NOWAIT)) { @@ -776,15 +775,13 @@ _user_xsi_msgrcv(int messageQueueID, void *messagePointer, && sequenceNumber != messageQueue->SequenceNumber())) { TRACE_ERROR(("xsi_msgrcv: message queue id %d (sequence = %ld) " "got destroyed\n", messageQueueID, sequenceNumber)); - notReceived = false; - result = EIDRM; + return EIDRM; } else if (result == B_INTERRUPTED) { TRACE_ERROR(("xsi_msgrcv: thread %d got interrupted while " "waiting on message queue %d\n",(int)thread->id, messageQueueID)); messageQueue->Deque(&queueEntry, /* waitForMessage */ true); - notReceived = false; - result = EINTR; + return EINTR; } else { messageQueueLocker.Lock(); messageQueueHashLocker.Unlock(); @@ -805,16 +802,16 @@ _user_xsi_msgrcv(int messageQueueID, void *messagePointer, return E2BIG; } - status_t result + ssize_t result = message->copy_to_user_buffer(messagePointer, messageSize); - if (result != B_OK) { + if (result < 0) { messageQueue->Insert(message); return B_BAD_ADDRESS; } delete message; TRACE(("xsi_msgrcv: message received correctly\n")); - notReceived = false; + return result; } }