[LTP] [PATCH] hugeshmctl02: Skipped EFAULT tests for libc variant

Dylan Dai-Rong Jhong(鍾岱融) dylan@andestech.com
Mon Jun 26 04:36:28 CEST 2023


Hi All,

Ping. Any comments on this patch?

Thanks,
Dylan

-----Original Message-----
From: Dylan Dai-Rong Jhong(鍾岱融) <dylan@andestech.com>
Sent: Thursday, June 15, 2023 5:40 PM
To: ltp@lists.linux.it
Cc: Randolph Sheng-Kai Lin(林聖凱) <randolph@andestech.com>; x5710999x@gmail.com; Tim Shih-Ting OuYang(歐陽士庭) <tim609@andestech.com>; Mina Hui-Min Chou(周慧敏) <minachou@andestech.com>; Dylan Dai-Rong Jhong(鍾岱融) <dylan@andestech.com>
Subject: [LTP] [PATCH] hugeshmctl02: Skipped EFAULT tests for libc variant

When testing hugeshmctl02 under the 32bit architecture, a segmentation fault will occur. This patch will skip EFAULT tests for libc variant.

Hugeshmctl02 will intentionally pass "(struct shmid_ds *)-1" to shmctl(), but glibc will perform an additional conversion function when the architecture is 32bit, which will try to copy all items in (struct shmid_ds *) to another structure[*1]. In the process of copying, it is necessary to dereference "(struct shmid_ds *)-1", resulting in segmentation fault.

The LTP also has similar problems before, this patch is reference from the
shmctl03 patch[*2].

[*1]: https://github.com/bminor/glibc/blob/master/sysdeps/unix/sysv/linux/shmctl.c#L37
[*2]: https://github.com/linux-test-project/ltp/commit/a5a80aa8485a7cb017f96aba8d7b5ea79f1ba4d4

Signed-off-by: Dylan Jhong <dylan@andestech.com>
---
 .../mem/hugetlb/hugeshmctl/hugeshmctl02.c     | 35 ++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/testcases/kernel/mem/hugetlb/hugeshmctl/hugeshmctl02.c b/testcases/kernel/mem/hugetlb/hugeshmctl/hugeshmctl02.c
index 0bc9ffd74..e9c2e9fc8 100644
--- a/testcases/kernel/mem/hugetlb/hugeshmctl/hugeshmctl02.c
+++ b/testcases/kernel/mem/hugetlb/hugeshmctl/hugeshmctl02.c
@@ -27,6 +27,7 @@
 #include <pwd.h>
 #include <limits.h>
 #include "hugetlb.h"
+#include "lapi/syscalls.h"

 static size_t shm_size;
 static int shm_id_1 = -1;
@@ -50,9 +51,37 @@ struct tcase {
        {&shm_id_2, -1, &buf, EINVAL},
 };

+static int libc_shmctl(int shmid, int cmd, void *buf) {
+       return shmctl(shmid, cmd, buf);
+}
+
+static int sys_shmctl(int shmid, int cmd, void *buf) {
+       return tst_syscall(__NR_shmctl, shmid, cmd, buf); }
+
+static struct test_variants
+{
+       int (*shmctl)(int shmid, int cmd, void *buf);
+       char *desc;
+} variants[] = {
+       { .shmctl = libc_shmctl, .desc = "libc shmctl()"}, #if (__NR_shmctl !=
+__LTP__NR_INVALID_SYSCALL)
+       { .shmctl = sys_shmctl,  .desc = "__NR_shmctl syscall"}, #endif };
+
 static void test_hugeshmctl(unsigned int i)  {
-       TEST(shmctl(*(tcases[i].shmid), tcases[i].cmd, tcases[i].sbuf));
+       struct test_variants *tv = &variants[tst_variant];
+
+       if (tcases[i].error == EFAULT && tv->shmctl == libc_shmctl) {
+               tst_res(TCONF, "EFAULT is skipped for libc variant");
+               return;
+       }
+
+       TEST(tv->shmctl(*(tcases[i].shmid), tcases[i].cmd, tcases[i].sbuf));
        if (TST_RET != -1) {
                tst_res(TFAIL, "shmctl succeeded unexpectedly");
                return;
@@ -70,8 +99,11 @@ static void test_hugeshmctl(unsigned int i)

 static void setup(void)
 {
+       struct test_variants *tv = &variants[tst_variant];
        long hpage_size;

+       tst_res(TINFO, "Testing variant: %s", tv->desc);
+
        if (tst_hugepages == 0)
                tst_brk(TCONF, "No enough hugepages for testing.");

@@ -101,6 +133,7 @@ static void cleanup(void)

 static struct tst_test test = {
        .test = test_hugeshmctl,
+       .test_variants = ARRAY_SIZE(variants),
        .tcnt = ARRAY_SIZE(tcases),
        .needs_root = 1,
        .needs_tmpdir = 1,
--
2.34.1

CONFIDENTIALITY NOTICE:

This e-mail (and its attachments) may contain confidential and legally privileged information or information protected from disclosure. If you are not the intended recipient, you are hereby notified that any disclosure, copying, distribution, or use of the information contained herein is strictly prohibited. In this case, please immediately notify the sender by return e-mail, delete the message (and any accompanying documents) and destroy all printed hard copies. Thank you for your cooperation.

Copyright ANDES TECHNOLOGY CORPORATION - All Rights Reserved.


More information about the ltp mailing list