From: Dmitry V. Levin Date: Sun, 23 Apr 2017 23:10:57 +0000 (+0000) Subject: tests: check decoding of invalid tv_sec and tv_nsec values X-Git-Tag: v4.17~28 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8b86137d565cf2430bcdd61521ac7e153888a0c6;p=strace tests: check decoding of invalid tv_sec and tv_nsec values * tests/aio.c (main): Check decoding of invalid tv_sec and tv_nsec values. * tests/clock_nanosleep.c (main): Likewise. * tests/clock_xettime.c (main): Likewise. * tests/futex.c (main): Likewise. * tests/nanosleep.c (main): Likewise. * tests/ppoll.c (main): Likewise. * tests/pselect6.c (main): Likewise. * tests/recvmmsg-timeout.c (main): Likewise. * tests/rt_sigtimedwait.c (main): Likewise. * tests/semop.c (main): Likewise. * tests/timer_xettime.c (main): Likewise. * tests/timerfd_xettime.c (main): Likewise. * tests/utimensat.c (main): Likewise. --- diff --git a/tests/aio.c b/tests/aio.c index 4b114678..edb35fec 100644 --- a/tests/aio.c +++ b/tests/aio.c @@ -205,8 +205,7 @@ main(void) const unsigned long lnr = (unsigned long) (0xdeadbeef00000000ULL | nr); const struct io_event *ev = tail_alloc(nr * sizeof(struct io_event)); - const struct timespec proto_ts = { .tv_nsec = 123456789 }; - const struct timespec *ts = tail_memdup(&proto_ts, sizeof(proto_ts)); + TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, ts); (void) close(0); if (open("/dev/zero", O_RDONLY)) @@ -263,6 +262,24 @@ main(void) bogus_ctx, (long) 0xca7faceddeadf00dLL, (long) 0xba5e1e505ca571e0LL, ts + 1, sprintrc(rc)); + ts->tv_sec = 0xdeadbeefU; + ts->tv_nsec = 0xfacefeedU; + rc = syscall(__NR_io_getevents, bogus_ctx, 0, 0, 0, ts); + printf("io_getevents(%#lx, 0, 0, NULL" + ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n", + bogus_ctx, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc)); + + ts->tv_sec = (time_t) 0xcafef00ddeadbeefLL; + ts->tv_nsec = (long) 0xbadc0dedfacefeedLL; + rc = syscall(__NR_io_getevents, bogus_ctx, 0, 0, 0, ts); + printf("io_getevents(%#lx, 0, 0, NULL" + ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n", + bogus_ctx, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc)); + + ts->tv_sec = 0; + ts->tv_nsec = 123456789; rc = syscall(__NR_io_getevents, *ctx, nr, nr + 1, ev, ts); printf("io_getevents(%#lx, %ld, %ld, [" "{data=%#" PRI__x64 ", obj=%p, res=%u, res2=0}, " diff --git a/tests/clock_nanosleep.c b/tests/clock_nanosleep.c index a2428bd1..d8f63572 100644 --- a/tests/clock_nanosleep.c +++ b/tests/clock_nanosleep.c @@ -89,13 +89,32 @@ main(void) (long long) req.ts.tv_sec, zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts); + req.ts.tv_sec = 0xdeadbeefU; + req.ts.tv_nsec = 0xfacefeedU; + assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0, + &req.ts, &rem.ts) == -1); + printf("clock_nanosleep(CLOCK_REALTIME, 0" + ", {tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n", + (long long) req.ts.tv_sec, + zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts); + + req.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL; + req.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL; + assert(syscall(__NR_clock_nanosleep, CLOCK_MONOTONIC, 0, + &req.ts, &rem.ts) == -1); + printf("clock_nanosleep(CLOCK_MONOTONIC, 0" + ", {tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n", + (long long) req.ts.tv_sec, + zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts); + assert(sigaction(SIGALRM, &act, NULL) == 0); assert(sigprocmask(SIG_SETMASK, &set, NULL) == 0); if (setitimer(ITIMER_REAL, &itv, NULL)) perror_msg_and_skip("setitimer"); - --req.ts.tv_nsec; + req.ts.tv_sec = 0; + req.ts.tv_nsec = 999999999; assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0, &req.ts, &rem.ts) == -1); printf("clock_nanosleep(CLOCK_REALTIME, 0" diff --git a/tests/clock_xettime.c b/tests/clock_xettime.c index 220a81cb..0ecda8bf 100644 --- a/tests/clock_xettime.c +++ b/tests/clock_xettime.c @@ -62,9 +62,23 @@ main(void) t.ts.tv_sec = 0xdeface1; t.ts.tv_nsec = 0xdeface2; - if (!syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts)) - error_msg_and_skip("clock_settime CLOCK_THREAD_CPUTIME_ID:" - " EINVAL expected"); + syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts); + printf("clock_settime(CLOCK_THREAD_CPUTIME_ID" + ", {tv_sec=%lld, tv_nsec=%llu}) = -1 EINVAL (%m)\n", + (long long) t.ts.tv_sec, + zero_extend_signed_to_ull(t.ts.tv_nsec)); + + t.ts.tv_sec = 0xdeadbeefU; + t.ts.tv_nsec = 0xfacefeedU; + syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts); + printf("clock_settime(CLOCK_THREAD_CPUTIME_ID" + ", {tv_sec=%lld, tv_nsec=%llu}) = -1 EINVAL (%m)\n", + (long long) t.ts.tv_sec, + zero_extend_signed_to_ull(t.ts.tv_nsec)); + + t.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL; + t.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL; + syscall(__NR_clock_settime, CLOCK_THREAD_CPUTIME_ID, &t.ts); printf("clock_settime(CLOCK_THREAD_CPUTIME_ID" ", {tv_sec=%lld, tv_nsec=%llu}) = -1 EINVAL (%m)\n", (long long) t.ts.tv_sec, diff --git a/tests/futex.c b/tests/futex.c index 0f986a51..9925698b 100644 --- a/tests/futex.c +++ b/tests/futex.c @@ -55,8 +55,6 @@ # include "xlat/futexwakeops.h" # include "xlat/futexwakecmps.h" -static struct timespec *tmout; - void futex_error(int *uaddr, int op, unsigned long val, unsigned long timeout, int *uaddr2, unsigned long val3, int rc) { @@ -172,7 +170,7 @@ main(int argc, char *argv[]) uaddr[0] = 0x1deadead; uaddr2[0] = 0xbadf00d; - tmout = tail_alloc(sizeof(*tmout)); + TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, tmout); tmout->tv_sec = 123; tmout->tv_nsec = 0xbadc0de; @@ -206,6 +204,28 @@ main(int argc, char *argv[]) printf("futex(%p, FUTEX_WAIT, %u, %p) = %s\n", uaddr, 0xfacefeed, tmout + 1, sprintrc(rc)); + /* timeout is invalid */ + tmout->tv_sec = 0xdeadbeefU; + tmout->tv_nsec = 0xfacefeedU; + + CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3, + (rc == -1) && (errno == EINVAL)); + printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n", + uaddr, VAL_PR, (long long) tmout->tv_sec, + zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc)); + + tmout->tv_sec = (time_t) 0xcafef00ddeadbeefLL; + tmout->tv_nsec = (long) 0xbadc0dedfacefeedLL; + + CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout, uaddr2, VAL3, + (rc == -1) && (errno == EINVAL)); + printf("futex(%p, FUTEX_WAIT, %u, {tv_sec=%lld, tv_nsec=%llu}) = %s\n", + uaddr, VAL_PR, (long long) tmout->tv_sec, + zero_extend_signed_to_ull(tmout->tv_nsec), sprintrc(rc)); + + tmout->tv_sec = 123; + tmout->tv_nsec = 0xbadc0de; + /* uaddr is not as provided; uaddr2 is faulty but ignored */ CHECK_FUTEX(uaddr, FUTEX_WAIT, VAL, tmout, uaddr2 + 1, VAL3, (rc == -1) && (errno == EAGAIN)); diff --git a/tests/nanosleep.c b/tests/nanosleep.c index e0f5cce9..56dc2ba2 100644 --- a/tests/nanosleep.c +++ b/tests/nanosleep.c @@ -78,12 +78,34 @@ main(void) (long long) req.ts.tv_sec, zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts); + req.ts.tv_sec = 0xdeadbeefU; + req.ts.tv_nsec = 0xfacefeedU; + assert(nanosleep(&req.ts, &rem.ts) == -1); + printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n", + (long long) req.ts.tv_sec, + zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts); + + req.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL; + req.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL; + assert(nanosleep(&req.ts, &rem.ts) == -1); + printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n", + (long long) req.ts.tv_sec, + zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts); + + req.ts.tv_sec = -1; + req.ts.tv_nsec = -1; + assert(nanosleep(&req.ts, &rem.ts) == -1); + printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n", + (long long) req.ts.tv_sec, + zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts); + assert(sigaction(SIGALRM, &act, NULL) == 0); assert(sigprocmask(SIG_SETMASK, &set, NULL) == 0); if (setitimer(ITIMER_REAL, &itv, NULL)) perror_msg_and_skip("setitimer"); + req.ts.tv_sec = 0; req.ts.tv_nsec = 999999999; assert(nanosleep(&req.ts, &rem.ts) == -1); printf("nanosleep({tv_sec=%lld, tv_nsec=%llu}" diff --git a/tests/ppoll.c b/tests/ppoll.c index 7570edef..85a7e0c0 100644 --- a/tests/ppoll.c +++ b/tests/ppoll.c @@ -85,6 +85,20 @@ main(void) printf("ppoll(%p, %u, %p, %p, %u) = %s\n", efault, 42, efault + 8, efault + 16, sigset_size, errstr); + ts->tv_sec = 0xdeadbeefU; + ts->tv_nsec = 0xfacefeedU; + sys_ppoll(0, 0, (unsigned long) ts, 0, sigset_size); + printf("ppoll(NULL, 0, {tv_sec=%lld, tv_nsec=%llu}, NULL, %u) = %s\n", + (long long) ts->tv_sec, zero_extend_signed_to_ull(ts->tv_nsec), + sigset_size, errstr); + + ts->tv_sec = (time_t) 0xcafef00ddeadbeefLL; + ts->tv_nsec = (long) 0xbadc0dedfacefeedL; + sys_ppoll(0, 0, (unsigned long) ts, 0, sigset_size); + printf("ppoll(NULL, 0, {tv_sec=%lld, tv_nsec=%llu}, NULL, %u) = %s\n", + (long long) ts->tv_sec, zero_extend_signed_to_ull(ts->tv_nsec), + sigset_size, errstr); + if (pipe(pipe_fd) || pipe(pipe_fd + 2)) perror_msg_and_fail("pipe"); diff --git a/tests/pselect6.c b/tests/pselect6.c index 91198838..d6aa8fd9 100644 --- a/tests/pselect6.c +++ b/tests/pselect6.c @@ -129,9 +129,28 @@ int main(int ac, char **av) /* * See how timeouts are decoded. */ + tm.ts.tv_sec = 0xdeadbeefU; + tm.ts.tv_nsec = 0xfacefeedU; + assert(pselect(0, NULL, NULL, NULL, &tm.ts, NULL) == -1); + printf("pselect6(0, NULL, NULL, NULL" + ", {tv_sec=%lld, tv_nsec=%llu}, {NULL, %u}) = %s\n", + (long long) tm.ts.tv_sec, + zero_extend_signed_to_ull(tm.ts.tv_nsec), + NSIG_BYTES, sprintrc(-1)); + + tm.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL; + tm.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL; + assert(pselect(0, NULL, NULL, NULL, &tm.ts, NULL) == -1); + printf("pselect6(0, NULL, NULL, NULL" + ", {tv_sec=%lld, tv_nsec=%llu}, {NULL, %u}) = %s\n", + (long long) tm.ts.tv_sec, + zero_extend_signed_to_ull(tm.ts.tv_nsec), + NSIG_BYTES, sprintrc(-1)); + assert(sigaction(SIGALRM, &act, NULL) == 0); assert(setitimer(ITIMER_REAL, &itv, NULL) == 0); + tm.ts.tv_sec = 0; tm.ts.tv_nsec = 222222222; assert(pselect(0, NULL, NULL, NULL, &tm.ts, &mask) == -1); printf("pselect6(0, NULL, NULL, NULL, {tv_sec=0, tv_nsec=222222222}" diff --git a/tests/recvmmsg-timeout.c b/tests/recvmmsg-timeout.c index 7cf064db..066059aa 100644 --- a/tests/recvmmsg-timeout.c +++ b/tests/recvmmsg-timeout.c @@ -50,13 +50,15 @@ main(void) .msg_iovlen = 1 } }; - struct timespec t = { .tv_sec = 0, .tv_nsec = 12345678 }; + TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, ts); + ts->tv_sec = 0; + ts->tv_nsec = 12345678; - int rc = recv_mmsg(-1, &mh, 1, 0, &t); + int rc = recv_mmsg(-1, &mh, 1, 0, ts); printf("recvmmsg(-1, %p, 1, 0, {tv_sec=0, tv_nsec=12345678})" - " = %d %s (%m)\n", &mh, rc, errno2name()); + " = %s\n", &mh, sprintrc(rc)); - rc = recv_mmsg(fds[0], &mh, 1, 0, &t); + rc = recv_mmsg(fds[0], &mh, 1, 0, ts); if (rc < 0) perror_msg_and_skip("recvmmsg"); printf("recvmmsg(%d, [{msg_hdr={msg_name=NULL, msg_namelen=0" @@ -64,7 +66,23 @@ main(void) ", msg_controllen=0, msg_flags=0}, msg_len=1}], 1, 0" ", {tv_sec=0, tv_nsec=12345678}) = " "%d (left {tv_sec=0, tv_nsec=%d})\n", - fds[0], rc, (int) t.tv_nsec); + fds[0], rc, (int) ts->tv_nsec); + + ts->tv_sec = 0xdeadbeefU; + ts->tv_nsec = 0xfacefeedU; + + rc = recv_mmsg(fds[0], &mh, 1, 0, ts); + printf("recvmmsg(%d, %p, 1, 0, {tv_sec=%lld, tv_nsec=%llu}) = %s\n", + fds[0], &mh, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc)); + + ts->tv_sec = (time_t) 0xcafef00ddeadbeefLL; + ts->tv_nsec = (long) 0xbadc0dedfacefeedLL; + + rc = recv_mmsg(fds[0], &mh, 1, 0, ts); + printf("recvmmsg(%d, %p, 1, 0, {tv_sec=%lld, tv_nsec=%llu}) = %s\n", + fds[0], &mh, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc)); puts("+++ exited with 0 +++"); return 0; diff --git a/tests/rt_sigtimedwait.c b/tests/rt_sigtimedwait.c index 74fbfead..8c638c85 100644 --- a/tests/rt_sigtimedwait.c +++ b/tests/rt_sigtimedwait.c @@ -114,6 +114,25 @@ main(void) (long long) timeout->tv_sec, zero_extend_signed_to_ull(timeout->tv_nsec), set_size); + timeout->tv_sec = 0xdeadbeefU; + timeout->tv_nsec = 0xfacefeedU; + assert(k_sigtimedwait(k_set, NULL, timeout, set_size) == -1); + tprintf("rt_sigtimedwait([], NULL, {tv_sec=%lld, tv_nsec=%llu}" + ", %u) = -1 EINVAL (%m)\n", + (long long) timeout->tv_sec, + zero_extend_signed_to_ull(timeout->tv_nsec), set_size); + + timeout->tv_sec = (time_t) 0xcafef00ddeadbeefLL; + timeout->tv_nsec = (long) 0xbadc0dedfacefeedLL; + assert(k_sigtimedwait(k_set, NULL, timeout, set_size) == -1); + tprintf("rt_sigtimedwait([], NULL, {tv_sec=%lld, tv_nsec=%llu}" + ", %u) = -1 EINVAL (%m)\n", + (long long) timeout->tv_sec, + zero_extend_signed_to_ull(timeout->tv_nsec), set_size); + + timeout->tv_sec = 0; + timeout->tv_nsec = 42; + TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set); sigemptyset(libc_set); sigaddset(libc_set, SIGHUP); diff --git a/tests/semop.c b/tests/semop.c index 30036f9d..3d1f3846 100644 --- a/tests/semop.c +++ b/tests/semop.c @@ -33,9 +33,7 @@ main(void) static void * const bogus_sops = (void *) -1L; static const size_t bogus_nsops = (size_t) 0xdefaceddeadbeefULL; - static const struct timespec ts_data = { 1, 123456789 }; - - struct timespec *ts = tail_memdup(&ts_data, sizeof(*ts)); + TAIL_ALLOC_OBJECT_CONST_PTR(struct timespec, ts); int rc; id = semget(IPC_PRIVATE, 1, 0600); @@ -91,6 +89,8 @@ main(void) printf("semtimedop(%d, %p, 1, %p) = %s\n", id, sem_b + 1, ts + 1, sprintrc(rc)); + ts->tv_sec = 1; + ts->tv_nsec = 123456789; rc = semtimedop(bogus_semid, sem_b2, 2, ts); printf("semtimedop(%d, [{%hu, %hd, %s%s%#hx}, %p], %u" ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n", @@ -114,6 +114,24 @@ main(void) ", {tv_sec=%lld, tv_nsec=%llu}) = 0\n", id, (long long) ts->tv_sec, zero_extend_signed_to_ull(ts->tv_nsec)); + sem_b->sem_op = 1; + ts->tv_sec = 0xdeadbeefU; + ts->tv_nsec = 0xfacefeedU; + rc = semtimedop(id, sem_b, 1, ts); + printf("semtimedop(%d, [{0, 1, SEM_UNDO}], 1" + ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n", + id, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc)); + + sem_b->sem_op = -1; + ts->tv_sec = (time_t) 0xcafef00ddeadbeefLL; + ts->tv_nsec = (long) 0xbadc0dedfacefeedLL; + rc = semtimedop(id, sem_b, 1, ts); + printf("semtimedop(%d, [{0, -1, SEM_UNDO}], 1" + ", {tv_sec=%lld, tv_nsec=%llu}) = %s\n", + id, (long long) ts->tv_sec, + zero_extend_signed_to_ull(ts->tv_nsec), sprintrc(rc)); + puts("+++ exited with 0 +++"); return 0; } diff --git a/tests/timer_xettime.c b/tests/timer_xettime.c index 22dc99e0..61a885bf 100644 --- a/tests/timer_xettime.c +++ b/tests/timer_xettime.c @@ -47,6 +47,7 @@ main(void) printf("timer_settime(%d, TIMER_ABSTIME, NULL, NULL)" " = -1 EINVAL (%m)\n", 0xdefaced); + long rc; int tid; struct sigevent sev = { .sigev_notify = SIGEV_NONE }; @@ -55,24 +56,34 @@ main(void) printf("timer_create(CLOCK_MONOTONIC, {sigev_signo=0" ", sigev_notify=SIGEV_NONE}, [%d]) = 0\n", tid); - struct { - struct itimerspec its; - uint32_t pad[4]; - } old = { - .its = { - .it_interval = { 0xdeface5, 0xdeface6 }, - .it_value = { 0xdeface7, 0xdeface8 } - }, - .pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded } - }, new = { - .its = { - .it_interval = { 0xdeface1, 0xdeface2 }, - .it_value = { 0xdeface3, 0xdeface4 } - }, - .pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded } - }; - - if (syscall(__NR_timer_settime, tid, 0, &new.its, &old.its)) + TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_new); + TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_old); + + its_new->it_interval.tv_sec = 0xdeadbeefU; + its_new->it_interval.tv_nsec = 0xfacefeedU; + its_new->it_value.tv_sec = (time_t) 0xcafef00ddeadbeefLL; + its_new->it_value.tv_nsec = (long) 0xbadc0dedfacefeedLL; + + rc = syscall(__NR_timer_settime, tid, 0, its_new, its_old); + printf("timer_settime(%d, 0" + ", {it_interval={tv_sec=%lld, tv_nsec=%llu}" + ", it_value={tv_sec=%lld, tv_nsec=%llu}}, %p) = %s\n", + tid, (long long) its_new->it_interval.tv_sec, + zero_extend_signed_to_ull(its_new->it_interval.tv_nsec), + (long long) its_new->it_value.tv_sec, + zero_extend_signed_to_ull(its_new->it_value.tv_nsec), + its_old, sprintrc(rc)); + + its_new->it_interval.tv_sec = 0xdeface1; + its_new->it_interval.tv_nsec = 0xdeface2; + its_new->it_value.tv_sec = 0xdeface3; + its_new->it_value.tv_nsec = 0xdeface4; + its_old->it_interval.tv_sec = 0xdeface5; + its_old->it_interval.tv_nsec = 0xdeface6; + its_old->it_value.tv_sec = 0xdeface7; + its_old->it_value.tv_nsec = 0xdeface8; + + if (syscall(__NR_timer_settime, tid, 0, its_new, its_old)) perror_msg_and_skip("timer_settime"); printf("timer_settime(%d, 0" ", {it_interval={tv_sec=%lld, tv_nsec=%llu}" @@ -81,25 +92,25 @@ main(void) ", it_value={tv_sec=%lld, tv_nsec=%llu}}" ") = 0\n", tid, - (long long) new.its.it_interval.tv_sec, - zero_extend_signed_to_ull(new.its.it_interval.tv_nsec), - (long long) new.its.it_value.tv_sec, - zero_extend_signed_to_ull(new.its.it_value.tv_nsec), - (long long) old.its.it_interval.tv_sec, - zero_extend_signed_to_ull(old.its.it_interval.tv_nsec), - (long long) old.its.it_value.tv_sec, - zero_extend_signed_to_ull(old.its.it_value.tv_nsec)); - - if (syscall(__NR_timer_gettime, tid, &old.its)) + (long long) its_new->it_interval.tv_sec, + zero_extend_signed_to_ull(its_new->it_interval.tv_nsec), + (long long) its_new->it_value.tv_sec, + zero_extend_signed_to_ull(its_new->it_value.tv_nsec), + (long long) its_old->it_interval.tv_sec, + zero_extend_signed_to_ull(its_old->it_interval.tv_nsec), + (long long) its_old->it_value.tv_sec, + zero_extend_signed_to_ull(its_old->it_value.tv_nsec)); + + if (syscall(__NR_timer_gettime, tid, its_old)) perror_msg_and_skip("timer_gettime"); printf("timer_gettime(%d" ", {it_interval={tv_sec=%lld, tv_nsec=%llu}" ", it_value={tv_sec=%lld, tv_nsec=%llu}}) = 0\n", tid, - (long long) old.its.it_interval.tv_sec, - zero_extend_signed_to_ull(old.its.it_interval.tv_nsec), - (long long) old.its.it_value.tv_sec, - zero_extend_signed_to_ull(old.its.it_value.tv_nsec)); + (long long) its_old->it_interval.tv_sec, + zero_extend_signed_to_ull(its_old->it_interval.tv_nsec), + (long long) its_old->it_value.tv_sec, + zero_extend_signed_to_ull(its_old->it_value.tv_nsec)); puts("+++ exited with 0 +++"); return 0; diff --git a/tests/timerfd_xettime.c b/tests/timerfd_xettime.c index c8a22cc4..7759185b 100644 --- a/tests/timerfd_xettime.c +++ b/tests/timerfd_xettime.c @@ -47,24 +47,34 @@ main(void) perror_msg_and_skip("timerfd_create"); puts("timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC|TFD_NONBLOCK) = 0"); - struct { - struct itimerspec its; - uint32_t pad[4]; - } old = { - .its = { - .it_interval = { 0xdeface5, 0xdeface6 }, - .it_value = { 0xdeface7, 0xdeface8 } - }, - .pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded } - }, new = { - .its = { - .it_interval = { 0xdeface1, 0xdeface2 }, - .it_value = { 0xdeface3, 0xdeface4 } - }, - .pad = { 0xdeadbeef, 0xbadc0ded, 0xdeadbeef, 0xbadc0ded } - }; + TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_new); + TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_old); - if (syscall(__NR_timerfd_settime, 0, 0, &new.its, &old.its)) + its_new->it_interval.tv_sec = 0xdeadbeefU; + its_new->it_interval.tv_nsec = 0xfacefeedU; + its_new->it_value.tv_sec = (time_t) 0xcafef00ddeadbeefLL; + its_new->it_value.tv_nsec = (long) 0xbadc0dedfacefeedLL; + + long rc = syscall(__NR_timerfd_settime, 0, 0, its_new, its_old); + printf("timerfd_settime(0, 0" + ", {it_interval={tv_sec=%lld, tv_nsec=%llu}" + ", it_value={tv_sec=%lld, tv_nsec=%llu}}, %p) = %s\n", + (long long) its_new->it_interval.tv_sec, + zero_extend_signed_to_ull(its_new->it_interval.tv_nsec), + (long long) its_new->it_value.tv_sec, + zero_extend_signed_to_ull(its_new->it_value.tv_nsec), + its_old, sprintrc(rc)); + + its_new->it_interval.tv_sec = 0xdeface1; + its_new->it_interval.tv_nsec = 0xdeface2; + its_new->it_value.tv_sec = 0xdeface3; + its_new->it_value.tv_nsec = 0xdeface4; + its_old->it_interval.tv_sec = 0xdeface5; + its_old->it_interval.tv_nsec = 0xdeface6; + its_old->it_value.tv_sec = 0xdeface7; + its_old->it_value.tv_nsec = 0xdeface8; + + if (syscall(__NR_timerfd_settime, 0, 0, its_new, its_old)) perror_msg_and_skip("timerfd_settime"); printf("timerfd_settime(0, 0" ", {it_interval={tv_sec=%lld, tv_nsec=%llu}" @@ -72,24 +82,24 @@ main(void) ", {it_interval={tv_sec=%lld, tv_nsec=%llu}" ", it_value={tv_sec=%lld, tv_nsec=%llu}}" ") = 0\n", - (long long) new.its.it_interval.tv_sec, - zero_extend_signed_to_ull(new.its.it_interval.tv_nsec), - (long long) new.its.it_value.tv_sec, - zero_extend_signed_to_ull(new.its.it_value.tv_nsec), - (long long) old.its.it_interval.tv_sec, - zero_extend_signed_to_ull(old.its.it_interval.tv_nsec), - (long long) old.its.it_value.tv_sec, - zero_extend_signed_to_ull(old.its.it_value.tv_nsec)); + (long long) its_new->it_interval.tv_sec, + zero_extend_signed_to_ull(its_new->it_interval.tv_nsec), + (long long) its_new->it_value.tv_sec, + zero_extend_signed_to_ull(its_new->it_value.tv_nsec), + (long long) its_old->it_interval.tv_sec, + zero_extend_signed_to_ull(its_old->it_interval.tv_nsec), + (long long) its_old->it_value.tv_sec, + zero_extend_signed_to_ull(its_old->it_value.tv_nsec)); - if (syscall(__NR_timerfd_gettime, 0, &old.its)) + if (syscall(__NR_timerfd_gettime, 0, its_old)) perror_msg_and_skip("timerfd_gettime"); printf("timerfd_gettime(0" ", {it_interval={tv_sec=%lld, tv_nsec=%llu}" ", it_value={tv_sec=%lld, tv_nsec=%llu}}) = 0\n", - (long long) old.its.it_interval.tv_sec, - zero_extend_signed_to_ull(old.its.it_interval.tv_nsec), - (long long) old.its.it_value.tv_sec, - zero_extend_signed_to_ull(old.its.it_value.tv_nsec)); + (long long) its_old->it_interval.tv_sec, + zero_extend_signed_to_ull(its_old->it_interval.tv_nsec), + (long long) its_old->it_value.tv_sec, + zero_extend_signed_to_ull(its_old->it_value.tv_nsec)); puts("+++ exited with 0 +++"); return 0; diff --git a/tests/utimensat.c b/tests/utimensat.c index 4f55fb1f..ddfd3601 100644 --- a/tests/utimensat.c +++ b/tests/utimensat.c @@ -141,6 +141,30 @@ main(void) print_ts(&ts[1]); printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr); + ts[0].tv_sec = 0; + ts[0].tv_nsec = 0; + ts[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL; + ts[1].tv_nsec = 0; + + k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100); + printf("utimensat(AT_FDCWD, %s, [", qname); + print_ts(&ts[0]); + printf(", "); + print_ts(&ts[1]); + printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr); + + ts[0].tv_sec = 0xdeadbeefU; + ts[0].tv_nsec = 0xfacefeedU; + ts[1].tv_sec = (time_t) 0xcafef00ddeadbeefLL; + ts[1].tv_nsec = (long) 0xbadc0dedfacefeedLL; + + k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100); + printf("utimensat(AT_FDCWD, %s, [", qname); + print_ts(&ts[0]); + printf(", "); + print_ts(&ts[1]); + printf("], AT_SYMLINK_NOFOLLOW) = %s\n", errstr); + ts[0].tv_nsec = UTIME_NOW; ts[1].tv_nsec = UTIME_OMIT; k_utimensat(kfdcwd, kfname, (uintptr_t) ts, 0x100);