From f22db4e75305057a49ee64e509986dc3a76c3336 Mon Sep 17 00:00:00 2001 From: Fei Jie Date: Mon, 18 Apr 2016 15:10:53 +0800 Subject: [PATCH] tests: add semop.test * tests/semop.c: New file. * tests/semop.test: New test. * tests/.gitignore: Add semop. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add semop.test. --- tests/.gitignore | 1 + tests/Makefile.am | 2 ++ tests/semop.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++ tests/semop.test | 6 ++++++ 4 files changed, 63 insertions(+) create mode 100644 tests/semop.c create mode 100755 tests/semop.test diff --git a/tests/.gitignore b/tests/.gitignore index f3ee6294..3d1dbef7 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -138,6 +138,7 @@ seccomp-filter seccomp-filter-v seccomp-strict select +semop sendfile sendfile64 set_ptracer_any diff --git a/tests/Makefile.am b/tests/Makefile.am index e9cd6254..f31b6007 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -188,6 +188,7 @@ check_PROGRAMS = \ seccomp-filter-v \ seccomp-strict \ select \ + semop \ sendfile \ sendfile64 \ set_ptracer_any \ @@ -394,6 +395,7 @@ DECODER_TESTS = \ seccomp-filter.test \ seccomp-strict.test \ select.test \ + semop.test \ sendfile.test \ sendfile64.test \ sethostname.test \ diff --git a/tests/semop.c b/tests/semop.c new file mode 100644 index 00000000..214ce328 --- /dev/null +++ b/tests/semop.c @@ -0,0 +1,54 @@ +#include "tests.h" +#include +#include +#include +#include +#include +#include + +union semun +{ + int val; + struct semid_ds *buf; + unsigned short *array; + struct seminfo *__buf; +}; + +static int id = -1; + +static void +cleanup(void) +{ + semctl(id, 0, IPC_RMID, 0); + id = -1; +} + +int +main(void) +{ + id = semget(IPC_PRIVATE, 1, 0600); + if (id < 0) + perror_msg_and_skip("semget"); + atexit(cleanup); + + union semun sem_union = { .val = 0 }; + if (semctl(id, 0, SETVAL, sem_union) == -1) + perror_msg_and_skip("semctl"); + + struct sembuf *const sem_b = tail_alloc(sizeof(*sem_b)); + sem_b->sem_num = 0; + sem_b->sem_op = 1; + sem_b->sem_flg = SEM_UNDO; + + if (semop(id, sem_b, 1)) + perror_msg_and_skip("semop, 1"); + printf("semop(%d, [{0, 1, SEM_UNDO}], 1) = 0\n", id); + + sem_b->sem_op = -1; + if (semop(id, sem_b, 1)) + perror_msg_and_skip("semop, -1"); + printf("semop(%d, [{0, -1, SEM_UNDO}], 1) = 0\n", id); + + puts("+++ exited with 0 +++"); + return 0; +} diff --git a/tests/semop.test b/tests/semop.test new file mode 100755 index 00000000..7e8f32cd --- /dev/null +++ b/tests/semop.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check semop syscall decoding. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a32 -- 2.40.0