@cryptotaxi247 / netdata-1 / commits / e476bf35b

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