diff options
author | James Morris <james.l.morris@oracle.com> | 2017-06-26 22:38:46 -0400 |
---|---|---|
committer | James Morris <james.l.morris@oracle.com> | 2017-06-26 22:38:46 -0400 |
commit | c377a2c8eaaa6ef55dfe5806384214b4f304be5e (patch) | |
tree | 829c7e542f95790c9fb4efe03b289c9db7bd8fdd /tools | |
parent | 5965453d5e3fb425e6f9d6b4fec403bda3f33107 (diff) | |
parent | 0b5fa2290637a3235898d18dc0e7a136783f1bd2 (diff) |
Merge tag 'seccomp-next' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux into next
Diffstat (limited to 'tools')
-rw-r--r-- | tools/testing/selftests/seccomp/seccomp_bpf.c | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c index 03f1fa495d74..00a928b833d0 100644 --- a/tools/testing/selftests/seccomp/seccomp_bpf.c +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c | |||
@@ -1822,6 +1822,23 @@ struct tsync_sibling { | |||
1822 | struct __test_metadata *metadata; | 1822 | struct __test_metadata *metadata; |
1823 | }; | 1823 | }; |
1824 | 1824 | ||
1825 | /* | ||
1826 | * To avoid joining joined threads (which is not allowed by Bionic), | ||
1827 | * make sure we both successfully join and clear the tid to skip a | ||
1828 | * later join attempt during fixture teardown. Any remaining threads | ||
1829 | * will be directly killed during teardown. | ||
1830 | */ | ||
1831 | #define PTHREAD_JOIN(tid, status) \ | ||
1832 | do { \ | ||
1833 | int _rc = pthread_join(tid, status); \ | ||
1834 | if (_rc) { \ | ||
1835 | TH_LOG("pthread_join of tid %u failed: %d\n", \ | ||
1836 | (unsigned int)tid, _rc); \ | ||
1837 | } else { \ | ||
1838 | tid = 0; \ | ||
1839 | } \ | ||
1840 | } while (0) | ||
1841 | |||
1825 | FIXTURE_DATA(TSYNC) { | 1842 | FIXTURE_DATA(TSYNC) { |
1826 | struct sock_fprog root_prog, apply_prog; | 1843 | struct sock_fprog root_prog, apply_prog; |
1827 | struct tsync_sibling sibling[TSYNC_SIBLINGS]; | 1844 | struct tsync_sibling sibling[TSYNC_SIBLINGS]; |
@@ -1890,14 +1907,14 @@ FIXTURE_TEARDOWN(TSYNC) | |||
1890 | 1907 | ||
1891 | for ( ; sib < self->sibling_count; ++sib) { | 1908 | for ( ; sib < self->sibling_count; ++sib) { |
1892 | struct tsync_sibling *s = &self->sibling[sib]; | 1909 | struct tsync_sibling *s = &self->sibling[sib]; |
1893 | void *status; | ||
1894 | 1910 | ||
1895 | if (!s->tid) | 1911 | if (!s->tid) |
1896 | continue; | 1912 | continue; |
1897 | if (pthread_kill(s->tid, 0)) { | 1913 | /* |
1898 | pthread_cancel(s->tid); | 1914 | * If a thread is still running, it may be stuck, so hit |
1899 | pthread_join(s->tid, &status); | 1915 | * it over the head really hard. |
1900 | } | 1916 | */ |
1917 | pthread_kill(s->tid, 9); | ||
1901 | } | 1918 | } |
1902 | pthread_mutex_destroy(&self->mutex); | 1919 | pthread_mutex_destroy(&self->mutex); |
1903 | pthread_cond_destroy(&self->cond); | 1920 | pthread_cond_destroy(&self->cond); |
@@ -1987,9 +2004,9 @@ TEST_F(TSYNC, siblings_fail_prctl) | |||
1987 | pthread_mutex_unlock(&self->mutex); | 2004 | pthread_mutex_unlock(&self->mutex); |
1988 | 2005 | ||
1989 | /* Ensure diverging sibling failed to call prctl. */ | 2006 | /* Ensure diverging sibling failed to call prctl. */ |
1990 | pthread_join(self->sibling[0].tid, &status); | 2007 | PTHREAD_JOIN(self->sibling[0].tid, &status); |
1991 | EXPECT_EQ(SIBLING_EXIT_FAILURE, (long)status); | 2008 | EXPECT_EQ(SIBLING_EXIT_FAILURE, (long)status); |
1992 | pthread_join(self->sibling[1].tid, &status); | 2009 | PTHREAD_JOIN(self->sibling[1].tid, &status); |
1993 | EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); | 2010 | EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); |
1994 | } | 2011 | } |
1995 | 2012 | ||
@@ -2029,9 +2046,9 @@ TEST_F(TSYNC, two_siblings_with_ancestor) | |||
2029 | } | 2046 | } |
2030 | pthread_mutex_unlock(&self->mutex); | 2047 | pthread_mutex_unlock(&self->mutex); |
2031 | /* Ensure they are both killed and don't exit cleanly. */ | 2048 | /* Ensure they are both killed and don't exit cleanly. */ |
2032 | pthread_join(self->sibling[0].tid, &status); | 2049 | PTHREAD_JOIN(self->sibling[0].tid, &status); |
2033 | EXPECT_EQ(0x0, (long)status); | 2050 | EXPECT_EQ(0x0, (long)status); |
2034 | pthread_join(self->sibling[1].tid, &status); | 2051 | PTHREAD_JOIN(self->sibling[1].tid, &status); |
2035 | EXPECT_EQ(0x0, (long)status); | 2052 | EXPECT_EQ(0x0, (long)status); |
2036 | } | 2053 | } |
2037 | 2054 | ||
@@ -2055,9 +2072,9 @@ TEST_F(TSYNC, two_sibling_want_nnp) | |||
2055 | pthread_mutex_unlock(&self->mutex); | 2072 | pthread_mutex_unlock(&self->mutex); |
2056 | 2073 | ||
2057 | /* Ensure they are both upset about lacking nnp. */ | 2074 | /* Ensure they are both upset about lacking nnp. */ |
2058 | pthread_join(self->sibling[0].tid, &status); | 2075 | PTHREAD_JOIN(self->sibling[0].tid, &status); |
2059 | EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status); | 2076 | EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status); |
2060 | pthread_join(self->sibling[1].tid, &status); | 2077 | PTHREAD_JOIN(self->sibling[1].tid, &status); |
2061 | EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status); | 2078 | EXPECT_EQ(SIBLING_EXIT_NEWPRIVS, (long)status); |
2062 | } | 2079 | } |
2063 | 2080 | ||
@@ -2095,9 +2112,9 @@ TEST_F(TSYNC, two_siblings_with_no_filter) | |||
2095 | pthread_mutex_unlock(&self->mutex); | 2112 | pthread_mutex_unlock(&self->mutex); |
2096 | 2113 | ||
2097 | /* Ensure they are both killed and don't exit cleanly. */ | 2114 | /* Ensure they are both killed and don't exit cleanly. */ |
2098 | pthread_join(self->sibling[0].tid, &status); | 2115 | PTHREAD_JOIN(self->sibling[0].tid, &status); |
2099 | EXPECT_EQ(0x0, (long)status); | 2116 | EXPECT_EQ(0x0, (long)status); |
2100 | pthread_join(self->sibling[1].tid, &status); | 2117 | PTHREAD_JOIN(self->sibling[1].tid, &status); |
2101 | EXPECT_EQ(0x0, (long)status); | 2118 | EXPECT_EQ(0x0, (long)status); |
2102 | } | 2119 | } |
2103 | 2120 | ||
@@ -2140,9 +2157,9 @@ TEST_F(TSYNC, two_siblings_with_one_divergence) | |||
2140 | pthread_mutex_unlock(&self->mutex); | 2157 | pthread_mutex_unlock(&self->mutex); |
2141 | 2158 | ||
2142 | /* Ensure they are both unkilled. */ | 2159 | /* Ensure they are both unkilled. */ |
2143 | pthread_join(self->sibling[0].tid, &status); | 2160 | PTHREAD_JOIN(self->sibling[0].tid, &status); |
2144 | EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); | 2161 | EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); |
2145 | pthread_join(self->sibling[1].tid, &status); | 2162 | PTHREAD_JOIN(self->sibling[1].tid, &status); |
2146 | EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); | 2163 | EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); |
2147 | } | 2164 | } |
2148 | 2165 | ||
@@ -2199,7 +2216,7 @@ TEST_F(TSYNC, two_siblings_not_under_filter) | |||
2199 | TH_LOG("cond broadcast non-zero"); | 2216 | TH_LOG("cond broadcast non-zero"); |
2200 | } | 2217 | } |
2201 | pthread_mutex_unlock(&self->mutex); | 2218 | pthread_mutex_unlock(&self->mutex); |
2202 | pthread_join(self->sibling[sib].tid, &status); | 2219 | PTHREAD_JOIN(self->sibling[sib].tid, &status); |
2203 | EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); | 2220 | EXPECT_EQ(SIBLING_EXIT_UNKILLED, (long)status); |
2204 | /* Poll for actual task death. pthread_join doesn't guarantee it. */ | 2221 | /* Poll for actual task death. pthread_join doesn't guarantee it. */ |
2205 | while (!kill(self->sibling[sib].system_tid, 0)) | 2222 | while (!kill(self->sibling[sib].system_tid, 0)) |
@@ -2224,7 +2241,7 @@ TEST_F(TSYNC, two_siblings_not_under_filter) | |||
2224 | TH_LOG("cond broadcast non-zero"); | 2241 | TH_LOG("cond broadcast non-zero"); |
2225 | } | 2242 | } |
2226 | pthread_mutex_unlock(&self->mutex); | 2243 | pthread_mutex_unlock(&self->mutex); |
2227 | pthread_join(self->sibling[sib].tid, &status); | 2244 | PTHREAD_JOIN(self->sibling[sib].tid, &status); |
2228 | EXPECT_EQ(0, (long)status); | 2245 | EXPECT_EQ(0, (long)status); |
2229 | /* Poll for actual task death. pthread_join doesn't guarantee it. */ | 2246 | /* Poll for actual task death. pthread_join doesn't guarantee it. */ |
2230 | while (!kill(self->sibling[sib].system_tid, 0)) | 2247 | while (!kill(self->sibling[sib].system_tid, 0)) |