Skip to content

Commit

Permalink
[LIBC] Fix incorrect handling of pthread_join(tid, nullptr)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
goldsteinn committed Apr 20, 2023
1 parent 8d2bae9 commit ef09498
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 2 deletions.
6 changes: 4 additions & 2 deletions libc/src/__support/threads/thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand Down
14 changes: 14 additions & 0 deletions libc/test/integration/src/pthread/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
30 changes: 30 additions & 0 deletions libc/test/integration/src/pthread/pthread_join_test.cpp
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit ef09498

Please sign in to comment.