Skip to content

Commit 6deeec4

Browse files
src: Fix incorrect use of cpu_set_t
cpu_set_t allocated dynamically with CPU_ALLOC need to be manipulated with CPU_*_S() family of macro, otherwise it will be assumed that the size is equal to sizeof(cpu_set_t), leading to undefined behaviours.
1 parent 3a95bf5 commit 6deeec4

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

src/rt-app.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@ static int create_cpuset_str(cpuset_data_t *cpu_data)
793793
for (i = 0; i < 10000 && cpu_count; ++i) {
794794
unsigned int n;
795795

796-
if (CPU_ISSET(i, cpu_data->cpuset)) {
796+
if (CPU_ISSET_S(cpu_data->cpusetsize, i, cpu_data->cpuset)) {
797797
--cpu_count;
798798
if (size_needed <= (idx + 1)) {
799799
log_error("Not enough memory for array");
@@ -861,8 +861,12 @@ static void set_thread_affinity(thread_data_t *data, cpuset_data_t *cpu_data)
861861
if (actual_cpu_data->cpuset == NULL)
862862
actual_cpu_data = &data->def_cpu_data;
863863

864-
if (!CPU_EQUAL(actual_cpu_data->cpuset, data->curr_cpu_data->cpuset))
865-
{
864+
if (
865+
actual_cpu_data->cpusetsize != data->curr_cpu_data->cpusetsize ||
866+
!CPU_EQUAL_S(
867+
actual_cpu_data->cpusetsize,
868+
actual_cpu_data->cpuset, data->curr_cpu_data->cpuset))
869+
{
866870
log_debug("[%d] setting cpu affinity to CPU(s) %s", data->ind,
867871
actual_cpu_data->cpuset_str);
868872
ret = pthread_setaffinity_np(pthread_self(),

src/rt-app_parse_config.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ static void parse_cpuset_data(struct json_object *obj, cpuset_data_t *data)
763763
data->cpuset_str = strdup(json_object_to_json_string(cpuset_obj));
764764
data->cpusetsize = sizeof(cpu_set_t);
765765
data->cpuset = malloc(data->cpusetsize);
766-
CPU_ZERO(data->cpuset);
766+
CPU_ZERO_S(data->cpusetsize, data->cpuset);
767767
for (i = 0; i < json_object_array_length(cpuset_obj); i++) {
768768
cpu = json_object_array_get_idx(cpuset_obj, i);
769769
cpu_idx = json_object_get_int(cpu);
@@ -773,7 +773,7 @@ static void parse_cpuset_data(struct json_object *obj, cpuset_data_t *data)
773773
free(data->cpuset_str);
774774
exit(EXIT_INV_CONFIG);
775775
}
776-
CPU_SET(cpu_idx, data->cpuset);
776+
CPU_SET_S(data->cpusetsize, cpu_idx, data->cpuset);
777777
}
778778
} else {
779779
data->cpuset_str = strdup("-");

0 commit comments

Comments
 (0)