]> granicus.if.org Git - strace/commitdiff
tests: check decoding of invalid tv_sec and tv_nsec values
authorDmitry V. Levin <ldv@altlinux.org>
Sun, 23 Apr 2017 23:10:57 +0000 (23:10 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 24 Apr 2017 23:14:57 +0000 (23:14 +0000)
* 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.

13 files changed:
tests/aio.c
tests/clock_nanosleep.c
tests/clock_xettime.c
tests/futex.c
tests/nanosleep.c
tests/ppoll.c
tests/pselect6.c
tests/recvmmsg-timeout.c
tests/rt_sigtimedwait.c
tests/semop.c
tests/timer_xettime.c
tests/timerfd_xettime.c
tests/utimensat.c

index 4b114678f9c27a5732ceb68fdde5cd537aa56b9d..edb35fecf3f19ac329762df9aa3c8a4107a423bd 100644 (file)
@@ -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}, "
index a2428bd17547821993b0e363da9db1479a393e8a..d8f63572c77097aaef9fd4bb73889d4b4ad1b134 100644 (file)
@@ -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"
index 220a81cb9006e7aba1f8d0f1dd08a8055fcba721..0ecda8bfc48dfeb6119cc8b633f36d930e6009dd 100644 (file)
@@ -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,
index 0f986a51ad5614b134d16c6a1f7bd47b47345596..9925698bc491aef272c33b92b11b7faafca16109 100644 (file)
@@ -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));
index e0f5cce91291b43ae29605a20c613c2fc4830b6a..56dc2ba2ebc0248a82bd1142ba616ba72da37097 100644 (file)
@@ -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}"
index 7570edef9bcb01014df0466bf627c71918b08c9b..85a7e0c006ba7b7747a96736bf8dcd8f60dbe2ba 100644 (file)
@@ -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");
 
index 91198838090b80c4aa1638b7d43cfe28eb5be9b5..d6aa8fd988fb540b9e0d4d43ab8aabbdfb998914 100644 (file)
@@ -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}"
index 7cf064db4201174f46d82f4dfb2ca4628b3afb6f..066059aa26b9e6ae92a7f3c2bcda62df4f94279a 100644 (file)
@@ -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;
index 74fbfead049d07f7d610612fbfc24b29a65f337a..8c638c85eeabbe2362420a28709d07036e0ce542 100644 (file)
@@ -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);
index 30036f9ddf8de128fe1da0baa016350e7c110271..3d1f38462a37e8aee74c31cbdd879fc90b27f956 100644 (file)
@@ -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;
 }
index 22dc99e0512d25d14584f58a8cadcb35dbd4b0a3..61a885bf32fe8ff7fe08c81194b9b2beb60a9742 100644 (file)
@@ -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;
index c8a22cc412f58bae1bcc61b6e0166893e9ee4017..7759185b26ba87ba00d1feed0c92efd906c9611b 100644 (file)
@@ -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;
index 4f55fb1f50ded0c5773d3a4a396651f40a751488..ddfd3601022979e990707c137586135c147ec7a8 100644 (file)
@@ -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);