]> granicus.if.org Git - strace/commitdiff
tests: additional capset decoder checks
authorEugene Syromyatnikov <evgsyr@gmail.com>
Tue, 18 Oct 2016 07:16:23 +0000 (10:16 +0300)
committerEugene Syromyatnikov <evgsyr@gmail.com>
Fri, 28 Oct 2016 23:54:01 +0000 (02:54 +0300)
* tests/caps.awk: Add patterns for additional checks.
* tests/caps.c: Implement additional checks.

tests/caps.awk
tests/caps.c

index 67003ac3e7d6a99f99da6927755264daeaea0e23..613048295366c94fc69d7452034bc8722708c1d2 100644 (file)
@@ -31,16 +31,26 @@ BEGIN {
        cap = "(0|1<<CAP_[A-Z_]+(\\|1<<CAP_[A-Z_]+)*|1<<CAP_[A-Z_]+(\\|1<<CAP_[A-Z_]+){37}\\|0xffffffc0)"
        s_efault = "-1 EFAULT (Bad address)"
        r_efault = "-1 EFAULT \\(Bad address\\)"
+       r_einval = "-1 EINVAL \\(Invalid argument\\)"
        r_addr = "0x[[:xdigit:]]+"
        s[1] = "capget(NULL, NULL) = " s_efault
        r[2] = "^capget\\(" r_addr ", " r_addr "\\) = " r_efault
        r[3] = "^capget\\(\\{_LINUX_CAPABILITY_VERSION_3, 0\\}, " r_addr "\\) = " r_efault
        r[4] = "^capget\\(\\{_LINUX_CAPABILITY_VERSION_3, 0\\}, \\{" cap ", " cap ", " cap "\\}\\) = 0$"
+
+       capset_v1_data = "{1<<CAP_DAC_OVERRIDE, 1<<CAP_DAC_READ_SEARCH, 0}"
+       capset_v3hi_data = "{1<<CAP_WAKE_ALARM, 1<<CAP_BLOCK_SUSPEND, 0}"
        capset_data = "{1<<CAP_DAC_OVERRIDE|1<<CAP_WAKE_ALARM, 1<<CAP_DAC_READ_SEARCH|1<<CAP_BLOCK_SUSPEND, 0}"
-       s[5] = "capset({_LINUX_CAPABILITY_VERSION_3, 0}, " capset_data ") = -1 EPERM (Operation not permitted)"
-       s[6] = "+++ exited with 0 +++"
+       s[5] = "capset(NULL, NULL) = " s_efault
+       r[6] = "^capset\\(" r_addr ", " r_addr "\\) = " r_efault
+       r[7] = "^capset\\(\\{0xbadc0ded /\\* _LINUX_CAPABILITY_VERSION_\\?\\?\\? \\*/, -1576685468\\}, " r_addr "\\) = " r_einval
+       r[8] = "^capset\\(\\{_LINUX_CAPABILITY_VERSION_2, 0\\}, " r_addr "\\) = " r_efault
+       s[9] = "capset({_LINUX_CAPABILITY_VERSION_3, 0}, " capset_data ") = -1 EPERM (Operation not permitted)"
+       s[10] = "capset({_LINUX_CAPABILITY_VERSION_3, 0}, " capset_v3hi_data ") = -1 EPERM (Operation not permitted)"
+       s[11] = "capset({_LINUX_CAPABILITY_VERSION_1, 0}, " capset_v1_data ") = -1 EPERM (Operation not permitted)"
+       s[12] = "+++ exited with 0 +++"
 
-       lines = 6
+       lines = 12
        fail = 0
 }
 
index 17e10777f2951028411fe1f4f1a312193b1f133e..9f33a39e3c0b7e1e84d664b60508435194aa9cfa 100644 (file)
@@ -38,6 +38,8 @@ int
 main(void)
 {
        const int data[] = { 2, 4, 0, 8, 16, 0 };
+       const int v1 = 0x19980330;
+       const int v2 = 0x20071026;
        const int v3 = 0x20080522;
 
        int * const head = tail_alloc(sizeof(int) * 2);
@@ -55,7 +57,31 @@ main(void)
                error_msg_and_skip("capget: v3 expected");
 
        memcpy(tail_data, data, sizeof(data));
-       if (capset(head, data) == 0 || errno != EPERM)
+
+       capset(NULL, NULL);
+       capset(head + 2, tail_data);
+
+       head[0] = 0xbadc0ded;
+       head[1] = 2718281828U;
+       capset(head, tail_data + ARRAY_SIZE(data) - 2);
+
+       head[0] = v2;
+       head[1] = 0;
+       capset(head, tail_data + ARRAY_SIZE(data) - 5);
+
+       memcpy(tail_data, data, sizeof(data));
+       head[0] = v3;
+       if (capset(head, tail_data) == 0 || errno != EPERM)
+               perror_msg_and_skip("capset");
+
+       memset(tail_data, 0, sizeof(data) / 2);
+       if (capset(head, tail_data) == 0 || errno != EPERM)
+               perror_msg_and_skip("capset");
+
+       memcpy(tail_data + ARRAY_SIZE(data) / 2, data, sizeof(data) / 2);
+       head[0] = v1;
+       if (capset(head, tail_data + ARRAY_SIZE(data) / 2) == 0 ||
+           errno != EPERM)
                perror_msg_and_skip("capset");
 
        return 0;