package/xenomai: fix build with glibc >= 2.34

Fix the following build failure with glibc >= 2.34:

In file included from timerobj.c:32:
In function 'threadobj_set_current',
    inlined from 'server_prologue' at timerobj.c:94:2:
../../include/copperplate/threadobj.h:252:9: error: 'pthread_setspecific' expecting 1 byte in a region of size 0 [-Werror=stringop-overread]
  252 |         pthread_setspecific(threadobj_tskey, thobj);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Fixes:
 - http://autobuild.buildroot.org/results/ed93f916eda304b30f320816c85d1b0d4488c699

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
This commit is contained in:
Fabrice Fontaine 2021-12-18 10:56:55 +01:00 committed by Yann E. MORIN
parent b8aebcfd82
commit 1b3055cc8d

View file

@ -0,0 +1,57 @@
From 627d488db3aa71406e32d4d8934629e8b0f35905 Mon Sep 17 00:00:00 2001
From: Jan Kiszka <jan.kiszka@siemens.com>
Date: Sat, 16 Oct 2021 15:46:33 +0200
Subject: [PATCH] lib/{cobalt,copperplate}: Use valid addresses for
pthread_setspecific
glibx 2.34 and newer annotated pthread_setspecific in a way that gcc-11
complains about non-NULL pointers that are outside of what is considered
valid. So use dummy addresses instead. namely the related pthread keys.
Those pointers will never be dereferenced in both use cases.
See also https://sourceware.org/bugzilla/show_bug.cgi?id=28458.
Reported-by: Vitaly Chikunov <vt@altlinux.org>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
[Retrieved from:
https://source.denx.de/Xenomai/xenomai/-/commit/627d488db3aa71406e32d4d8934629e8b0f35905]
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
---
include/copperplate/threadobj.h | 6 +++++-
lib/cobalt/printf.c | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/include/copperplate/threadobj.h b/include/copperplate/threadobj.h
index 7e6904f4c..c8363415b 100644
--- a/include/copperplate/threadobj.h
+++ b/include/copperplate/threadobj.h
@@ -173,7 +173,11 @@ void threadobj_save_timeout(struct threadobj_corespec *corespec,
#define __THREAD_M_SPARE6 (1 << 22)
#define __THREAD_M_SPARE7 (1 << 23)
-#define THREADOBJ_IRQCONTEXT ((struct threadobj *)-2UL)
+/*
+ * We need to use a valid address here. The object will never be dereferenced
+ * when it is identified as IRQ context, so the pthread key itself is fine.
+ */
+#define THREADOBJ_IRQCONTEXT ((struct threadobj *)&threadobj_tskey)
struct traceobj;
struct syncobj;
diff --git a/lib/cobalt/printf.c b/lib/cobalt/printf.c
index 8982ddc93..0aa5940c6 100644
--- a/lib/cobalt/printf.c
+++ b/lib/cobalt/printf.c
@@ -729,7 +729,7 @@ done:
pthread_cond_init(&printer_wakeup, NULL);
spawn_printer_thread();
/* We just need a non-zero TSD to trigger the dtor upon unwinding. */
- pthread_setspecific(cleanup_key, (void *)1);
+ pthread_setspecific(cleanup_key, &cleanup_key);
atexit(rt_print_flush_buffers);
}
--
GitLab