Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftest: af_unix: Test SO_PASSRIGHTS.

scm_rights.c has various patterns of tests to exercise GC.

Let's add cases where SO_PASSRIGHTS is disabled.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Kuniyuki Iwashima and committed by
David S. Miller
431e2b87 77cbe1a6

+78 -2
+78 -2
tools/testing/selftests/net/af_unix/scm_rights.c
··· 23 23 int type; 24 24 int flags; 25 25 bool test_listener; 26 + bool disabled; 26 27 }; 27 28 28 29 FIXTURE_VARIANT_ADD(scm_rights, dgram) ··· 32 31 .type = SOCK_DGRAM, 33 32 .flags = 0, 34 33 .test_listener = false, 34 + .disabled = false, 35 + }; 36 + 37 + FIXTURE_VARIANT_ADD(scm_rights, dgram_disabled) 38 + { 39 + .name = "UNIX ", 40 + .type = SOCK_DGRAM, 41 + .flags = 0, 42 + .test_listener = false, 43 + .disabled = true, 35 44 }; 36 45 37 46 FIXTURE_VARIANT_ADD(scm_rights, stream) ··· 50 39 .type = SOCK_STREAM, 51 40 .flags = 0, 52 41 .test_listener = false, 42 + .disabled = false, 43 + }; 44 + 45 + FIXTURE_VARIANT_ADD(scm_rights, stream_disabled) 46 + { 47 + .name = "UNIX-STREAM ", 48 + .type = SOCK_STREAM, 49 + .flags = 0, 50 + .test_listener = false, 51 + .disabled = true, 53 52 }; 54 53 55 54 FIXTURE_VARIANT_ADD(scm_rights, stream_oob) ··· 68 47 .type = SOCK_STREAM, 69 48 .flags = MSG_OOB, 70 49 .test_listener = false, 50 + .disabled = false, 51 + }; 52 + 53 + FIXTURE_VARIANT_ADD(scm_rights, stream_oob_disabled) 54 + { 55 + .name = "UNIX-STREAM ", 56 + .type = SOCK_STREAM, 57 + .flags = MSG_OOB, 58 + .test_listener = false, 59 + .disabled = true, 71 60 }; 72 61 73 62 FIXTURE_VARIANT_ADD(scm_rights, stream_listener) ··· 86 55 .type = SOCK_STREAM, 87 56 .flags = 0, 88 57 .test_listener = true, 58 + .disabled = false, 59 + }; 60 + 61 + FIXTURE_VARIANT_ADD(scm_rights, stream_listener_disabled) 62 + { 63 + .name = "UNIX-STREAM ", 64 + .type = SOCK_STREAM, 65 + .flags = 0, 66 + .test_listener = true, 67 + .disabled = true, 89 68 }; 90 69 91 70 FIXTURE_VARIANT_ADD(scm_rights, stream_listener_oob) ··· 104 63 .type = SOCK_STREAM, 105 64 .flags = MSG_OOB, 106 65 .test_listener = true, 66 + .disabled = false, 67 + }; 68 + 69 + FIXTURE_VARIANT_ADD(scm_rights, stream_listener_oob_disabled) 70 + { 71 + .name = "UNIX-STREAM ", 72 + .type = SOCK_STREAM, 73 + .flags = MSG_OOB, 74 + .test_listener = true, 75 + .disabled = true, 107 76 }; 108 77 109 78 static int count_sockets(struct __test_metadata *_metadata, ··· 156 105 ret = unshare(CLONE_NEWNET); 157 106 ASSERT_EQ(0, ret); 158 107 108 + if (variant->disabled) 109 + return; 110 + 159 111 ret = count_sockets(_metadata, variant); 160 112 ASSERT_EQ(0, ret); 161 113 } ··· 166 112 FIXTURE_TEARDOWN(scm_rights) 167 113 { 168 114 int ret; 115 + 116 + if (variant->disabled) 117 + return; 169 118 170 119 sleep(1); 171 120 ··· 178 121 179 122 static void create_listeners(struct __test_metadata *_metadata, 180 123 FIXTURE_DATA(scm_rights) *self, 124 + const FIXTURE_VARIANT(scm_rights) *variant, 181 125 int n) 182 126 { 183 127 struct sockaddr_un addr = { ··· 197 139 198 140 ret = listen(self->fd[i], -1); 199 141 ASSERT_EQ(0, ret); 142 + 143 + if (variant->disabled) { 144 + ret = setsockopt(self->fd[i], SOL_SOCKET, SO_PASSRIGHTS, 145 + &(int){0}, sizeof(int)); 146 + ASSERT_EQ(0, ret); 147 + } 200 148 201 149 addrlen = sizeof(addr); 202 150 ret = getsockname(self->fd[i], (struct sockaddr *)&addr, &addrlen); ··· 228 164 for (i = 0; i < n * 2; i += 2) { 229 165 ret = socketpair(AF_UNIX, variant->type, 0, self->fd + i); 230 166 ASSERT_EQ(0, ret); 167 + 168 + if (variant->disabled) { 169 + ret = setsockopt(self->fd[i], SOL_SOCKET, SO_PASSRIGHTS, 170 + &(int){0}, sizeof(int)); 171 + ASSERT_EQ(0, ret); 172 + } 231 173 } 232 174 } 233 175 ··· 245 175 ASSERT_LE(n * 2, sizeof(self->fd) / sizeof(self->fd[0])); 246 176 247 177 if (variant->test_listener) 248 - create_listeners(_metadata, self, n); 178 + create_listeners(_metadata, self, variant, n); 249 179 else 250 180 create_socketpairs(_metadata, self, variant, n); 251 181 } ··· 300 230 int ret; 301 231 302 232 ret = sendmsg(self->fd[receiver * 2 + 1], &msg, variant->flags); 303 - ASSERT_EQ(MSGLEN, ret); 233 + 234 + if (variant->disabled) { 235 + ASSERT_EQ(-1, ret); 236 + ASSERT_EQ(-EPERM, -errno); 237 + } else { 238 + ASSERT_EQ(MSGLEN, ret); 239 + } 304 240 } 305 241 306 242 #define create_sockets(n) \