[LTP] [PATCH] clone10.c: avoid using the libc thread memory model in touch_tls_in_child()
Changwei Zou
changwei.zou@canonical.com
Thu Feb 26 11:35:02 CET 2026
The thread touch_tls_in_child(), which is created using clone(),
is not fully initialized as a standard libc-managed thread.
Consequently, it is not in a proper state to invoke many libc functions safely.
Signed-off-by: Changwei Zou <changwei.zou@canonical.com>
---
testcases/kernel/syscalls/clone/clone10.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/testcases/kernel/syscalls/clone/clone10.c b/testcases/kernel/syscalls/clone/clone10.c
index 9ffb49c37..96de811ad 100644
--- a/testcases/kernel/syscalls/clone/clone10.c
+++ b/testcases/kernel/syscalls/clone/clone10.c
@@ -20,6 +20,7 @@
#include "tst_test.h"
#include "clone_platform.h"
#include "lapi/syscalls.h"
+#include "tst_atomic.h"
#include "lapi/tls.h"
#define TLS_EXP 100
@@ -34,21 +35,15 @@ struct user_desc *tls_desc;
static __thread int tls_var;
static char *child_stack;
-static volatile int child_done;
+static tst_atomic_t child_done;
static int flags = CLONE_THREAD | CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_SETTLS;
static int touch_tls_in_child(void *arg LTP_ATTRIBUTE_UNUSED)
{
-#if defined(__x86_64__)
- if (syscall(SYS_arch_prctl, ARCH_SET_FS, tls_ptr) == -1)
- exit(EXIT_FAILURE);
-#endif
tls_var = TLS_EXP + 1;
- tst_res(TINFO, "Child (PID: %d, TID: %d): TLS value set to: %d", getpid(), (pid_t)syscall(SYS_gettid), tls_var);
+ tst_atomic_store(1, &child_done);
- TST_CHECKPOINT_WAKE(0);
- free_tls();
tst_syscall(__NR_exit, 0);
return 0;
}
@@ -56,13 +51,16 @@ static int touch_tls_in_child(void *arg LTP_ATTRIBUTE_UNUSED)
static void verify_tls(void)
{
tls_var = TLS_EXP;
+ tst_atomic_store(0, &child_done);
TEST(ltp_clone7(flags, touch_tls_in_child, NULL, CHILD_STACK_SIZE, child_stack, NULL, tls_ptr, NULL));
if (TST_RET == -1)
tst_brk(TBROK | TTERRNO, "clone() failed");
- TST_CHECKPOINT_WAIT(0);
+ while (tst_atomic_load(&child_done) == 0) {
+ usleep(10);
+ }
if (tls_var == TLS_EXP) {
tst_res(TPASS,
@@ -84,6 +82,7 @@ static void setup(void)
static void cleanup(void)
{
free(child_stack);
+ free_tls();
}
static struct tst_test test = {
--
2.43.0
More information about the ltp
mailing list