Skip to content

Commit

Permalink
semctl03: Skipped EFAULT tests for libc variant.
Browse files Browse the repository at this point in the history
Tested EFAULT cases only for "__NR_semctl" syscall.

Tests for bad addresses in LTP cases trigger segment
fault in libc on a 32bit system.

Signed-off-by: Vinay Kumar <vinay.m.engg@gmail.com>
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
  • Loading branch information
vinay110974 authored and metan-ucw committed Jun 17, 2021
1 parent 294f3ef commit a5a80aa
Showing 1 changed file with 35 additions and 2 deletions.
37 changes: 35 additions & 2 deletions testcases/kernel/syscalls/ipc/semctl/semctl03.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "tst_test.h"
#include "lapi/sem.h"
#include "libnewipc.h"
#include "lapi/syscalls.h"

static int sem_id = -1;
static int bad_id = -1;
Expand All @@ -23,6 +24,17 @@ static struct semid_ds sem_ds;
static union semun sem_un = {.buf = &sem_ds};
static void *semds_ptr = &sem_un;
static void *bad_ptr;
static union semun arg = {0};

static int libc_semctl(int semid, int semnum, int cmd, ...)
{
return semctl(semid, semnum, cmd, arg);
}

static int sys_semctl(int semid, int semnum, int cmd, ...)
{
return tst_syscall(__NR_semctl, semid, semnum, cmd, arg);
}

static struct tcases {
int *sem_id;
Expand All @@ -37,17 +49,37 @@ static struct tcases {
{&sem_id, IPC_SET, &bad_ptr, EFAULT, "invalid union arg"}
};

static struct test_variants
{
int (*semctl)(int semid, int semnum, int cmd, ...);
char *desc;
} variants[] = {
{ .semctl = libc_semctl, .desc = "libc semctl()"},
#if (__NR_sys_semctl != __LTP__NR_INVALID_SYSCALL)
{ .semctl = sys_semctl, .desc = "__NR_semctl syscall"},
#endif
};

static void verify_semctl(unsigned int n)
{
struct tcases *tc = &tests[n];
struct test_variants *tv = &variants[tst_variant];

TST_EXP_FAIL(semctl(*(tc->sem_id), 0, tc->ipc_cmd, *(tc->buf)),
tc->error, "semctl() with %s", tc->message);
if (tc->error == EFAULT && tv->semctl == libc_semctl) {
tst_res(TCONF, "EFAULT is skipped for libc variant");
return;
}

TST_EXP_FAIL(tv->semctl(*(tc->sem_id), 0, tc->ipc_cmd, *(tc->buf)),
tc->error, "semctl() with %s", tc->message);
}

static void setup(void)
{
static key_t semkey;
struct test_variants *tv = &variants[tst_variant];

tst_res(TINFO, "Testing variant: %s", tv->desc);

semkey = GETIPCKEY();

Expand All @@ -67,4 +99,5 @@ static struct tst_test test = {
.cleanup = cleanup,
.test = verify_semctl,
.tcnt = ARRAY_SIZE(tests),
.test_variants = ARRAY_SIZE(variants),
};

0 comments on commit a5a80aa

Please sign in to comment.