File 0411-Use-destination-buffer-size-for-snprintf.patch of Package erlang
From 9a4d02cd8386e1b662cfee821509e50051887982 Mon Sep 17 00:00:00 2001
From: Rickard Green <rickard@erlang.org>
Date: Fri, 5 Jun 2020 17:48:28 +0200
Subject: [PATCH 11/11] Use destination buffer size for snprintf()
---
erts/emulator/beam/erl_async.c | 2 +-
erts/emulator/beam/erl_process.c | 12 ++++++------
erts/lib_src/pthread/ethread.c | 14 ++++++++++++--
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/erts/emulator/beam/erl_async.c b/erts/emulator/beam/erl_async.c
index 536c50c283..cc42f68668 100644
--- a/erts/emulator/beam/erl_async.c
+++ b/erts/emulator/beam/erl_async.c
@@ -209,7 +209,7 @@ erts_init_async(void)
for (i = 0; i < erts_async_max_threads; i++) {
ErtsAsyncQ *aq = async_q(i);
- erts_snprintf(thr_opts.name, 32, "async_%d", i+1);
+ erts_snprintf(thr_opts.name, sizeof(thr_name), "async_%d", i+1);
erts_thr_create(&aq->thr_id, async_main, (void*) aq, &thr_opts);
}
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 12de96f4e9..4a69900d28 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -8621,7 +8621,7 @@ erts_start_schedulers(void)
if (erts_runq_supervision_interval) {
opts.suggested_stack_size = 16;
- erts_snprintf(opts.name, 32, "runq_supervisor");
+ erts_snprintf(opts.name, sizeof(name), "runq_supervisor");
erts_atomic_init_nob(&runq_supervisor_sleeping, 0);
if (0 != ethr_event_init(&runq_supervision_event))
erts_exit(ERTS_ABORT_EXIT, "Failed to create run-queue supervision event\n");
@@ -8642,7 +8642,7 @@ erts_start_schedulers(void)
for (ix = 0; ix < erts_no_schedulers; ix++) {
ErtsSchedulerData *esdp = ERTS_SCHEDULER_IX(ix);
ASSERT(ix == esdp->no - 1);
- erts_snprintf(opts.name, 32, "%lu_scheduler", ix + 1);
+ erts_snprintf(opts.name, sizeof(name), "%lu_scheduler", ix + 1);
res = ethr_thr_create(&esdp->tid, sched_thread_func, (void*)esdp, &opts);
if (res != 0) {
erts_exit(ERTS_ABORT_EXIT, "Failed to create scheduler thread %d, error = %d\n", ix, res);
@@ -8656,7 +8656,7 @@ erts_start_schedulers(void)
{
for (ix = 0; ix < erts_no_dirty_cpu_schedulers; ix++) {
ErtsSchedulerData *esdp = ERTS_DIRTY_CPU_SCHEDULER_IX(ix);
- erts_snprintf(opts.name, 32, "%d_dirty_cpu_scheduler", ix + 1);
+ erts_snprintf(opts.name, sizeof(name), "%d_dirty_cpu_scheduler", ix + 1);
opts.suggested_stack_size = erts_dcpu_sched_thread_suggested_stack_size;
res = ethr_thr_create(&esdp->tid,sched_dirty_cpu_thread_func,(void*)esdp,&opts);
if (res != 0)
@@ -8664,7 +8664,7 @@ erts_start_schedulers(void)
}
for (ix = 0; ix < erts_no_dirty_io_schedulers; ix++) {
ErtsSchedulerData *esdp = ERTS_DIRTY_IO_SCHEDULER_IX(ix);
- erts_snprintf(opts.name, 32, "%d_dirty_io_scheduler", ix + 1);
+ erts_snprintf(opts.name, sizeof(name), "%d_dirty_io_scheduler", ix + 1);
opts.suggested_stack_size = erts_dio_sched_thread_suggested_stack_size;
res = ethr_thr_create(&esdp->tid,sched_dirty_io_thread_func,(void*)esdp,&opts);
if (res != 0)
@@ -8672,7 +8672,7 @@ erts_start_schedulers(void)
}
}
- erts_snprintf(opts.name, 32, "aux");
+ erts_snprintf(opts.name, sizeof(name), "aux");
res = ethr_thr_create(&tid, aux_thread, NULL, &opts);
if (res != 0)
@@ -8694,7 +8694,7 @@ erts_start_schedulers(void)
bpt->blocked = 0;
bpt->id = ix;
- erts_snprintf(opts.name, 32, "%d_poller", ix);
+ erts_snprintf(opts.name, sizeof(name), "%d_poller", ix);
res = ethr_thr_create(&tid, poll_thread, (void*) bpt, &opts);
if (res != 0)
diff --git a/erts/lib_src/pthread/ethread.c b/erts/lib_src/pthread/ethread.c
index 9dcc2c505d..ba36b2f452 100644
--- a/erts/lib_src/pthread/ethread.c
+++ b/erts/lib_src/pthread/ethread.c
@@ -341,11 +341,21 @@ ethr_thr_create(ethr_tid *tid, void * (*func)(void *), void *arg,
twd.stacksize = 0;
if (opts && opts->name) {
+ size_t nlen = sizeof(twd.name_buff);
#ifdef __HAIKU__
- snprintf(twd.name_buff, B_OS_NAME_LENGTH, "%s", opts->name);
+ if (nlen > B_OS_NAME_LENGTH)
+ nlen = B_OS_NAME_LENGTH;
#else
- snprintf(twd.name_buff, 16, "%s", opts->name);
+ /*
+ * Length of 16 is known to work. At least pthread_setname_np()
+ * is documented to fail on too long name string, but documentation
+ * does not say what the limit is. Do not have the time to dig
+ * further into that now...
+ */
+ if (nlen > 16)
+ nlen = 16;
#endif
+ snprintf(twd.name_buff, nlen, "%s", opts->name);
twd.name = twd.name_buff;
} else
twd.name = NULL;
--
2.26.2