]> granicus.if.org Git - strace/commitdiff
tests: check decoding of sched_[gs]etattr corner cases
authorDmitry V. Levin <ldv@altlinux.org>
Sat, 18 Feb 2017 09:58:52 +0000 (09:58 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sat, 18 Feb 2017 09:58:52 +0000 (09:58 +0000)
* 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.

tests/sched_xetattr.c

index 1826480bbb063c4ac73c0bd930d18796c0a04547..f3d2b3772c73b150274812dd09cfaaedf5ee49ce 100644 (file)
@@ -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;
 }