[LIBC] Fix incorrect handling of `pthread_join(tid, nullptr)`
authorNoah Goldstein <goldstein.w.n@gmail.com>
Thu, 20 Apr 2023 19:50:00 +0000 (14:50 -0500)
committerNoah Goldstein <goldstein.w.n@gmail.com>
Thu, 20 Apr 2023 19:53:37 +0000 (14:53 -0500)
Previously unconditionally stored to the return value. This is
incorrect, we should only return if user value is non-null.

Reviewed By: sivachandra

Differential Revision: https://reviews.llvm.org/D148293

libc/src/__support/threads/thread.h
libc/test/integration/src/pthread/CMakeLists.txt
libc/test/integration/src/pthread/pthread_join_test.cpp [new file with mode: 0644]

index 9197d0f3873a90bbbfdf406107102998638315f0..e0b644d963872182f6b39fa08cb1033352e386c5 100644 (file)
@@ -157,7 +157,8 @@ struct Thread {
     int status = join(retval);
     if (status != 0)
       return status;
-    *val = retval.stdc_retval;
+    if (val != nullptr)
+      *val = retval.stdc_retval;
     return 0;
   }
 
@@ -166,7 +167,8 @@ struct Thread {
     int status = join(retval);
     if (status != 0)
       return status;
-    *val = retval.posix_retval;
+    if (val != nullptr)
+      *val = retval.posix_retval;
     return 0;
   }
 
index 106cac8e4d802f3b558dac492bfef9e5113187ef..9158fc9143a675e33ffa9f8d8fca193829dfd71a 100644 (file)
@@ -116,3 +116,17 @@ add_integration_test(
     libc.src.pthread.pthread_join
     libc.src.__support.CPP.atomic
 )
+
+add_integration_test(
+  pthread_join_test
+  SUITE
+    libc-pthread-integration-tests
+  SRCS
+    pthread_join_test.cpp
+  DEPENDS
+    libc.include.pthread
+    libc.include.errno
+    libc.include.stdio
+    libc.src.pthread.pthread_create
+    libc.src.pthread.pthread_join
+)
diff --git a/libc/test/integration/src/pthread/pthread_join_test.cpp b/libc/test/integration/src/pthread/pthread_join_test.cpp
new file mode 100644 (file)
index 0000000..7397fa8
--- /dev/null
@@ -0,0 +1,30 @@
+//===-- Tests for pthread_join-- ------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/pthread/pthread_create.h"
+#include "src/pthread/pthread_join.h"
+
+#include "src/errno/libc_errno.h"
+
+#include "test/IntegrationTest/test.h"
+#include <pthread.h>
+
+static void *simpleFunc(void *) { return nullptr; }
+static void nullJoinTest() {
+  pthread_t Tid;
+  ASSERT_EQ(__llvm_libc::pthread_create(&Tid, nullptr, simpleFunc, nullptr), 0);
+  ASSERT_EQ(libc_errno, 0);
+  ASSERT_EQ(__llvm_libc::pthread_join(Tid, nullptr), 0);
+  ASSERT_EQ(libc_errno, 0);
+}
+
+TEST_MAIN() {
+  libc_errno = 0;
+  nullJoinTest();
+  return 0;
+}