From bddb122eb4b4023e3f7dfceef513cf4ef002582e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 18 Jan 2021 20:54:47 +0100 Subject: [PATCH] kernel/xsi_msg: if MessageQueueID() is -1, the message queue doesn't exist fix #16757 Change-Id: I7c381e18c468b8c209fb275ef5e899c49aa26ffd Reviewed-on: https://review.haiku-os.org/c/haiku/+/3643 Reviewed-by: Adrien Destugues Reviewed-by: waddlesplash --- src/system/kernel/posix/xsi_message_queue.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/system/kernel/posix/xsi_message_queue.cpp b/src/system/kernel/posix/xsi_message_queue.cpp index b2807ab156..4037d38a1a 100644 --- a/src/system/kernel/posix/xsi_message_queue.cpp +++ b/src/system/kernel/posix/xsi_message_queue.cpp @@ -660,19 +660,21 @@ _user_xsi_msgget(key_t key, int flags) // Check if key already exist, if it does it already has a message // queue associated with it ipcKey = sIpcHashTable.Lookup(key); - if (ipcKey == NULL) { + if (ipcKey == NULL || ipcKey->MessageQueueID() == -1) { if (!(flags & IPC_CREAT)) { TRACE_ERROR(("xsi_msgget: key %d does not exist, but the " "caller did not ask for creation\n", (int)key)); return ENOENT; } - ipcKey = new(std::nothrow) Ipc(key); if (ipcKey == NULL) { - TRACE_ERROR(("xsi_msgget: failed to create new Ipc object " - "for key %d\n", (int)key)); - return ENOMEM; + ipcKey = new(std::nothrow) Ipc(key); + if (ipcKey == NULL) { + TRACE_ERROR(("xsi_msgget: failed to create new Ipc object " + "for key %d\n", (int)key)); + return ENOMEM; + } + sIpcHashTable.Insert(ipcKey); } - sIpcHashTable.Insert(ipcKey); } else { // The IPC key exist and it already has a message queue if ((flags & IPC_CREAT) && (flags & IPC_EXCL)) {