Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 
0003 #define _GNU_SOURCE
0004 #include <sched.h>
0005 
0006 #include <stddef.h>
0007 #include <stdio.h>
0008 #include <unistd.h>
0009 
0010 #include <sys/socket.h>
0011 #include <sys/un.h>
0012 
0013 #include "../../kselftest_harness.h"
0014 
0015 FIXTURE(unix_connect)
0016 {
0017     int server, client;
0018     int family;
0019 };
0020 
0021 FIXTURE_VARIANT(unix_connect)
0022 {
0023     int type;
0024     char sun_path[8];
0025     int len;
0026     int flags;
0027     int err;
0028 };
0029 
0030 FIXTURE_VARIANT_ADD(unix_connect, stream_pathname)
0031 {
0032     .type = SOCK_STREAM,
0033     .sun_path = "test",
0034     .len = 4 + 1,
0035     .flags = 0,
0036     .err = 0,
0037 };
0038 
0039 FIXTURE_VARIANT_ADD(unix_connect, stream_abstract)
0040 {
0041     .type = SOCK_STREAM,
0042     .sun_path = "\0test",
0043     .len = 5,
0044     .flags = 0,
0045     .err = 0,
0046 };
0047 
0048 FIXTURE_VARIANT_ADD(unix_connect, stream_pathname_netns)
0049 {
0050     .type = SOCK_STREAM,
0051     .sun_path = "test",
0052     .len = 4 + 1,
0053     .flags = CLONE_NEWNET,
0054     .err = 0,
0055 };
0056 
0057 FIXTURE_VARIANT_ADD(unix_connect, stream_abstract_netns)
0058 {
0059     .type = SOCK_STREAM,
0060     .sun_path = "\0test",
0061     .len = 5,
0062     .flags = CLONE_NEWNET,
0063     .err = ECONNREFUSED,
0064 };
0065 
0066 FIXTURE_VARIANT_ADD(unix_connect, dgram_pathname)
0067 {
0068     .type = SOCK_DGRAM,
0069     .sun_path = "test",
0070     .len = 4 + 1,
0071     .flags = 0,
0072     .err = 0,
0073 };
0074 
0075 FIXTURE_VARIANT_ADD(unix_connect, dgram_abstract)
0076 {
0077     .type = SOCK_DGRAM,
0078     .sun_path = "\0test",
0079     .len = 5,
0080     .flags = 0,
0081     .err = 0,
0082 };
0083 
0084 FIXTURE_VARIANT_ADD(unix_connect, dgram_pathname_netns)
0085 {
0086     .type = SOCK_DGRAM,
0087     .sun_path = "test",
0088     .len = 4 + 1,
0089     .flags = CLONE_NEWNET,
0090     .err = 0,
0091 };
0092 
0093 FIXTURE_VARIANT_ADD(unix_connect, dgram_abstract_netns)
0094 {
0095     .type = SOCK_DGRAM,
0096     .sun_path = "\0test",
0097     .len = 5,
0098     .flags = CLONE_NEWNET,
0099     .err = ECONNREFUSED,
0100 };
0101 
0102 FIXTURE_SETUP(unix_connect)
0103 {
0104     self->family = AF_UNIX;
0105 }
0106 
0107 FIXTURE_TEARDOWN(unix_connect)
0108 {
0109     close(self->server);
0110     close(self->client);
0111 
0112     if (variant->sun_path[0])
0113         remove("test");
0114 }
0115 
0116 TEST_F(unix_connect, test)
0117 {
0118     socklen_t addrlen;
0119     struct sockaddr_un addr = {
0120         .sun_family = self->family,
0121     };
0122     int err;
0123 
0124     self->server = socket(self->family, variant->type, 0);
0125     ASSERT_NE(-1, self->server);
0126 
0127     addrlen = offsetof(struct sockaddr_un, sun_path) + variant->len;
0128     memcpy(&addr.sun_path, variant->sun_path, variant->len);
0129 
0130     err = bind(self->server, (struct sockaddr *)&addr, addrlen);
0131     ASSERT_EQ(0, err);
0132 
0133     if (variant->type == SOCK_STREAM) {
0134         err = listen(self->server, 32);
0135         ASSERT_EQ(0, err);
0136     }
0137 
0138     err = unshare(variant->flags);
0139     ASSERT_EQ(0, err);
0140 
0141     self->client = socket(self->family, variant->type, 0);
0142     ASSERT_LT(0, self->client);
0143 
0144     err = connect(self->client, (struct sockaddr *)&addr, addrlen);
0145     ASSERT_EQ(variant->err, err == -1 ? errno : 0);
0146 }
0147 
0148 TEST_HARNESS_MAIN