aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorJames Morris <james.l.morris@oracle.com>2017-06-26 22:38:46 -0400
committerJames Morris <james.l.morris@oracle.com>2017-06-26 22:38:46 -0400
commitc377a2c8eaaa6ef55dfe5806384214b4f304be5e (patch)
tree829c7e542f95790c9fb4efe03b289c9db7bd8fdd /tools
parent5965453d5e3fb425e6f9d6b4fec403bda3f33107 (diff)
parent0b5fa2290637a3235898d18dc0e7a136783f1bd2 (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.c51
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
1825FIXTURE_DATA(TSYNC) { 1842FIXTURE_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))