fix 32bit segv (#14940)
Costa Tsaousis committed
Apr 20, 2023 at 23:50 UTC
e476bf35b8957ab9e81c98191728d5d29946b6ea
1 file changed
+12
-13
libnetdata/threads/threads.c
+12
-13
@@ -10,7 +10,7 @@ static pthread_attr_t *netdata_threads_attr = NULL;
10
typedef struct {
11
void *arg;
12
pthread_t *thread;
13
- const char *tag;
13
+ char tag[NETDATA_THREAD_NAME_MAX + 1];
14
void *(*start_routine) (void *);
15
NETDATA_THREAD_OPTIONS options;
16
} NETDATA_THREAD;
@@ -18,14 +18,14 @@ typedef struct {
18
static __thread NETDATA_THREAD *netdata_thread = NULL;
19
20
inline int netdata_thread_tag_exists(void) {
21
- return (netdata_thread && netdata_thread->tag && *netdata_thread->tag);
21
+ return (netdata_thread && *netdata_thread->tag);
22
}
23
24
static const char *thread_name_get(bool recheck) {
25
static __thread char threadname[NETDATA_THREAD_NAME_MAX + 1] = "";
26
27
if(netdata_thread_tag_exists())
28
- strncpyz(threadname, netdata_thread->tag, NETDATA_THREAD_NAME_MAX + 1);
28
+ strncpyz(threadname, netdata_thread->tag, NETDATA_THREAD_NAME_MAX);
29
else {
30
if(!recheck && threadname[0])
31
return threadname;
@@ -33,15 +33,15 @@ static const char *thread_name_get(bool recheck) {
33
#if defined(__FreeBSD__)
34
pthread_get_name_np(pthread_self(), threadname, NETDATA_THREAD_NAME_MAX + 1);
35
if(strcmp(threadname, "netdata") == 0)
36
- strncpyz(threadname, "MAIN", NETDATA_THREAD_NAME_MAX + 1);
36
+ strncpyz(threadname, "MAIN", NETDATA_THREAD_NAME_MAX);
37
#elif defined(__APPLE__)
38
- strncpyz(threadname, "MAIN", NETDATA_THREAD_NAME_MAX + 1);
38
+ strncpyz(threadname, "MAIN", NETDATA_THREAD_NAME_MAX);
39
#elif defined(HAVE_PTHREAD_GETNAME_NP)
40
pthread_getname_np(pthread_self(), threadname, NETDATA_THREAD_NAME_MAX + 1);
41
if(strcmp(threadname, "netdata") == 0)
42
- strncpyz(threadname, "MAIN", NETDATA_THREAD_NAME_MAX + 1);
42
+ strncpyz(threadname, "MAIN", NETDATA_THREAD_NAME_MAX);
43
#else
44
- strncpyz(threadname, "MAIN", NETDATA_THREAD_NAME_MAX + 1);
44
+ strncpyz(threadname, "MAIN", NETDATA_THREAD_NAME_MAX);
45
#endif
46
}
47
@@ -182,8 +182,7 @@ static void thread_cleanup(void *ptr) {
182
service_exits();
183
worker_unregister();
184
185
- freez((void *)netdata_thread->tag);
186
- netdata_thread->tag = NULL;
185
+ netdata_thread->tag[0] = '\0';
186
187
freez(netdata_thread);
188
netdata_thread = NULL;
@@ -191,7 +190,7 @@ static void thread_cleanup(void *ptr) {
190
191
static void thread_set_name_np(NETDATA_THREAD *nt) {
192
194
- if (nt->tag) {
193
+ if (nt && nt->tag[0]) {
194
int ret = 0;
195
196
char threadname[NETDATA_THREAD_NAME_MAX+1];
@@ -244,7 +243,7 @@ void os_thread_get_current_name_np(char threadname[NETDATA_THREAD_NAME_MAX + 1])
243
#endif
244
}
245
247
-static void *thread_start(void *ptr) {
246
+static void *netdata_thread_init(void *ptr) {
247
netdata_thread = (NETDATA_THREAD *)ptr;
248
249
if(!(netdata_thread->options & NETDATA_THREAD_OPTION_DONT_LOG_STARTUP))
@@ -270,11 +269,11 @@ int netdata_thread_create(netdata_thread_t *thread, const char *tag, NETDATA_THR
269
NETDATA_THREAD *info = mallocz(sizeof(NETDATA_THREAD));
270
info->arg = arg;
271
info->thread = thread;
273
- info->tag = strdupz(tag);
272
info->start_routine = start_routine;
273
info->options = options;
274
+ strncpyz(info->tag, tag, NETDATA_THREAD_NAME_MAX);
275
277
- int ret = pthread_create(thread, netdata_threads_attr, thread_start, info);
276
+ int ret = pthread_create(thread, netdata_threads_attr, netdata_thread_init, info);
277
if(ret != 0)
278
error("failed to create new thread for %s. pthread_create() failed with code %d", tag, ret);
279