From: Dmitry V. Levin Date: Sat, 18 Feb 2017 09:58:52 +0000 (+0000) Subject: tests: check decoding of sched_[gs]etattr corner cases X-Git-Tag: v4.17~202 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f31755fda2015cbb1aa0686e257118169f102031;p=strace tests: check decoding of sched_[gs]etattr corner cases * tests/sched_xetattr.c (main): Check that integer arguments of sched_getattr and sched_setattr syscalls are decoded properly by adding a few cases with filled higher 32 bits. Check that pointer argument is decoded properly on F8ILL_KULONG_SUPPORTED architectures. --- diff --git a/tests/sched_xetattr.c b/tests/sched_xetattr.c index 1826480b..f3d2b377 100644 --- a/tests/sched_xetattr.c +++ b/tests/sched_xetattr.c @@ -70,6 +70,12 @@ main(void) struct sched_attr *const attr = tail_alloc(sizeof(*attr)); void *const efault = attr + 1; + sys_sched_getattr(0, 0, 0, 0); + printf("sched_getattr(0, NULL, 0, 0) = %s\n", errstr); + + sys_sched_getattr(0, (unsigned long) attr, 0, 0); + printf("sched_getattr(0, %p, 0, 0) = %s\n", attr, errstr); + sys_sched_getattr(bogus_pid, 0, 0, 0); printf("sched_getattr(%d, NULL, 0, 0) = %s\n", (int) bogus_pid, errstr); @@ -96,6 +102,24 @@ main(void) attr->sched_period, (unsigned) sizeof(*attr)); + sys_sched_getattr(F8ILL_KULONG_MASK, (unsigned long) attr, + F8ILL_KULONG_MASK | sizeof(*attr), F8ILL_KULONG_MASK); + printf("sched_getattr(0, {size=%u, sched_policy=", attr->size); + printxval(schedulers, attr->sched_policy, NULL); + printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u" + ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64 + ", sched_period=%" PRIu64 "}, %u, 0) = 0\n", + attr->sched_flags ? "SCHED_FLAG_RESET_ON_FORK" : "0", + attr->sched_nice, + attr->sched_priority, + attr->sched_runtime, + attr->sched_deadline, + attr->sched_period, + (unsigned) sizeof(*attr)); + + sys_sched_setattr(bogus_pid, 0, 0); + printf("sched_setattr(%d, NULL, 0) = %s\n", (int) bogus_pid, errstr); + attr->sched_flags |= 1; if (sys_sched_setattr(0, (unsigned long) attr, 0)) @@ -112,6 +136,20 @@ main(void) attr->sched_deadline, attr->sched_period); + sys_sched_setattr(F8ILL_KULONG_MASK, (unsigned long) attr, + F8ILL_KULONG_MASK); + printf("sched_setattr(0, {size=%u, sched_policy=", attr->size); + printxval(schedulers, attr->sched_policy, NULL); + printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u" + ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64 + ", sched_period=%" PRIu64 "}, 0) = 0\n", + "SCHED_FLAG_RESET_ON_FORK", + attr->sched_nice, + attr->sched_priority, + attr->sched_runtime, + attr->sched_deadline, + attr->sched_period); + attr->size = 0x90807060; attr->sched_policy = 0xca7faced; attr->sched_flags = 0xbadc0ded1057da7aULL; @@ -138,6 +176,19 @@ main(void) attr->sched_period, (unsigned) bogus_flags, errstr); + if (F8ILL_KULONG_SUPPORTED) { + const kernel_ulong_t ill = f8ill_ptr_to_kulong(attr); + + sys_sched_getattr(0, ill, sizeof(*attr), 0); + printf("sched_getattr(0, %#llx, %u, 0) = %s\n", + (unsigned long long) ill, (unsigned) sizeof(*attr), + errstr); + + sys_sched_setattr(0, ill, 0); + printf("sched_setattr(0, %#llx, 0) = %s\n", + (unsigned long long) ill, errstr); + } + puts("+++ exited with 0 +++"); return 0; }