From c1ff46dd608b9aeaed21c9fd8892128f44d13813 Mon Sep 17 00:00:00 2001 From: zhouwenpei Date: Mon, 7 Feb 2022 17:40:24 +0800 Subject: [PATCH] fix segmentation fault with --offset and output wrong result with --verify --- ...segmentation-fault-when-using-offset.patch | 44 +++++++++++++++++++ 0002-fix-verify_shm-memcmp-nodes.patch | 25 +++++++++++ numactl.spec | 8 +++- 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 0001-Fix-segmentation-fault-when-using-offset.patch create mode 100644 0002-fix-verify_shm-memcmp-nodes.patch diff --git a/0001-Fix-segmentation-fault-when-using-offset.patch b/0001-Fix-segmentation-fault-when-using-offset.patch new file mode 100644 index 0000000..9838c2e --- /dev/null +++ b/0001-Fix-segmentation-fault-when-using-offset.patch @@ -0,0 +1,44 @@ +From 53797364e07e67555ec3b139cf3c3563c7035c11 Mon Sep 17 00:00:00 2001 +From: Chunsheng Luo +Date: Wed, 8 Sep 2021 17:18:53 +0800 +Subject: [PATCH] shm.c: Fix segmentation fault when using offset + +The following command can trigger the bug + numactl --offset 4096 --length 65536 --file xxx -p0 --touch + +When we create a shm file, we just consider shmlen, but not consider shmoffset, +resulting in the mapped memory is no within the scope of the new shm file. +--- + shm.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/shm.c b/shm.c +index e5192e5..324cfbe 100644 +--- a/shm.c ++++ b/shm.c +@@ -107,8 +107,8 @@ void attach_sysvshm(char *name, char *opt) + "need a --length to create a sysv shared memory segment"); + fprintf(stderr, + "numactl: Creating shared memory segment %s id %ld mode %04o length %.fMB\n", +- name, shmid, shmmode, ((double)shmlen) / (1024*1024) ); +- shmfd = shmget(key, shmlen, IPC_CREAT|shmmode|shmflags); ++ name, shmid, shmmode, ((double)(shmlen + shmoffset)) / (1024*1024) ); ++ shmfd = shmget(key, shmlen + shmoffset, IPC_CREAT|shmmode|shmflags); + if (shmfd < 0) + nerror("cannot create shared memory segment"); + } +@@ -145,8 +145,12 @@ void attach_shared(char *name, char *opt) + } + if (fstat64(shmfd, &st) < 0) + err("shm stat"); +- if (shmlen > st.st_size) { +- if (ftruncate64(shmfd, shmlen) < 0) { ++ /* the file size must be larger than mmap shmlen + shmoffset, otherwise SIGBUS ++ * will be caused when we access memory, because mmaped memory is no longer in ++ * the range of the file laster. ++ */ ++ if ((shmlen + shmoffset) > st.st_size) { ++ if (ftruncate64(shmfd, shmlen + shmoffset) < 0) { + /* XXX: we could do it by hand, but it would it + would be impossible to apply policy then. + need to fix that in the kernel. */ diff --git a/0002-fix-verify_shm-memcmp-nodes.patch b/0002-fix-verify_shm-memcmp-nodes.patch new file mode 100644 index 0000000..a1b9b55 --- /dev/null +++ b/0002-fix-verify_shm-memcmp-nodes.patch @@ -0,0 +1,25 @@ +From c833565be79f2ef2541459f2d8444894abd9d939 Mon Sep 17 00:00:00 2001 +From: Chunsheng Luo +Date: Wed, 8 Sep 2021 18:10:53 +0800 +Subject: [PATCH] shm.c: fix verify_shm memcmp nodes + +When nodemask_sz is large 64 (CONFIG_NODES_SHIFT > 6), verify_shm +will output wrong result "mismatched node mask". that's not what we +expected, we expected compare nodes->maskp. +--- + shm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/shm.c b/shm.c +index 324cfbe..3cf3d2b 100644 +--- a/shm.c ++++ b/shm.c +@@ -295,7 +295,7 @@ void verify_shm(int policy, struct bitmask *nodes) + policy_name(pol2), policy_name(policy)); + return; + } +- if (memcmp(nodes2, nodes, numa_bitmask_nbytes(nodes))) { ++ if (memcmp(nodes2->maskp, nodes->maskp, numa_bitmask_nbytes(nodes))) { + vwarn(p, "mismatched node mask\n"); + printmask("expected", nodes); + printmask("real", nodes2); diff --git a/numactl.spec b/numactl.spec index dd0558b..bff33e1 100644 --- a/numactl.spec +++ b/numactl.spec @@ -1,12 +1,15 @@ Name: numactl Version: 2.0.14 -Release: 1 +Release: 2 Summary: Library for tuning for Non Uniform Memory Access machines License: GPLv2 URL: https://github.com/numactl/numactl Source0: https://github.com/numactl/numactl/releases/download/v%{version}/numactl-%{version}.tar.gz BuildRequires: libtool automake autoconf +Patch1: 0001-Fix-segmentation-fault-when-using-offset.patch +Patch2: 0002-fix-verify_shm-memcmp-nodes.patch + %description Simple NUMA policy support. It consists of a numactl program to run other programs with a specific NUMA policy and a libnuma shared library to set @@ -74,6 +77,9 @@ LD_LIBRARY_PATH=$(pwd)/.libs make check %{_mandir}/man3/*.3* %changelog +* Tue Feb 8 2022 zhouwenpei - 2.0.14-2 +- fix segmentation fault with --offset and output wrong result with --verify + * Tue Nov 30 2021 zhouwenpei - 2.0.14-1 - upgrade version to 2.0.14 -- Gitee