usb: gadget: f_fs: Prevent panic due to failure of huge size buffer allocation
[platform/kernel/linux-rpi.git] / tools / testing / selftests / kdbus / test-bus.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <fcntl.h>
4 #include <stdlib.h>
5 #include <stddef.h>
6 #include <unistd.h>
7 #include <stdint.h>
8 #include <errno.h>
9 #include <assert.h>
10 #include <limits.h>
11 #include <sys/mman.h>
12 #include <stdbool.h>
13
14 #include "kdbus-api.h"
15 #include "kdbus-util.h"
16 #include "kdbus-enum.h"
17 #include "kdbus-test.h"
18
19 static wur struct kdbus_item *kdbus_get_item(struct kdbus_info *info,
20                                          uint64_t type)
21 {
22         struct kdbus_item *item;
23
24         KDBUS_ITEM_FOREACH(item, info, items)
25                 if (item->type == type)
26                         return item;
27
28         return NULL;
29 }
30
31 static wur int test_bus_creator_info(const char *bus_path)
32 {
33         int ret;
34         uint64_t offset;
35         struct kdbus_conn *conn;
36         struct kdbus_info *info;
37         struct kdbus_item *item;
38         char *tmp, *busname;
39
40         /* extract the bus-name from @bus_path */
41         tmp = strdup(bus_path);
42         ASSERT_NONZERO(tmp);
43         busname = strrchr(tmp, '/');
44         ASSERT_NONZERO(busname);
45         *busname = 0;
46         busname = strrchr(tmp, '/');
47         ASSERT_NONZERO(busname);
48         ++busname;
49
50         conn = kdbus_hello(bus_path, 0, NULL, 0);
51         ASSERT_NONZERO(conn);
52
53         ASSERT_ZERO(kdbus_bus_creator_info(conn, _KDBUS_ATTACH_ALL, &offset));
54
55         info = (struct kdbus_info *)(conn->buf + offset);
56
57         item = kdbus_get_item(info, KDBUS_ITEM_MAKE_NAME);
58         ASSERT_NONZERO(item);
59         ASSERT_ZERO(strcmp(item->str, busname));
60
61         ret = kdbus_free(conn, offset);
62         ASSERT_RETURN_VAL(ret,==,0, ret);
63
64         free(tmp);
65         kdbus_conn_free(conn);
66         return 0;
67 }
68
69 wur int kdbus_test_bus_make(struct kdbus_test_env *env)
70 {
71         struct {
72                 struct kdbus_cmd cmd;
73
74                 /* bloom size item */
75                 struct {
76                         uint64_t size;
77                         uint64_t type;
78                         struct kdbus_bloom_parameter bloom;
79                 } bs;
80
81                 /* name item */
82                 uint64_t n_size;
83                 uint64_t n_type;
84                 char name[64];
85         } bus_make;
86         char s[PATH_MAX], *name;
87         int control_fd2;
88         uid_t uid;
89
90         name = unique_name("");
91         ASSERT_NONZERO(name);
92
93         snprintf(s, sizeof(s), "%s/control", env->root);
94         env->control_fd = open(s, O_RDWR|O_CLOEXEC);
95         ASSERT_RETURN(env->control_fd,>=,0);
96
97         control_fd2 = open(s, O_RDWR|O_CLOEXEC);
98         ASSERT_RETURN(control_fd2,>=,0);
99
100         memset(&bus_make, 0, sizeof(bus_make));
101
102         bus_make.bs.size = sizeof(bus_make.bs);
103         bus_make.bs.type = KDBUS_ITEM_BLOOM_PARAMETER;
104         bus_make.bs.bloom.size = 64;
105         bus_make.bs.bloom.n_hash = 1;
106
107         bus_make.n_type = KDBUS_ITEM_MAKE_NAME;
108
109         uid = getuid();
110
111         /* missing uid prefix */
112         snprintf(bus_make.name, sizeof(bus_make.name), "foo");
113         bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
114         bus_make.cmd.size = sizeof(struct kdbus_cmd) +
115                             sizeof(bus_make.bs) + bus_make.n_size;
116         ASSERT_RETURN(-EINVAL,==,kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
117
118         /* non alphanumeric character */
119         snprintf(bus_make.name, sizeof(bus_make.name), "%u-blah@123", uid);
120         bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
121         bus_make.cmd.size = sizeof(struct kdbus_cmd) +
122                             sizeof(bus_make.bs) + bus_make.n_size;
123         ASSERT_RETURN(-EINVAL,==,kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
124
125         /* '-' at the end */
126         snprintf(bus_make.name, sizeof(bus_make.name), "%u-blah-", uid);
127         bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
128         bus_make.cmd.size = sizeof(struct kdbus_cmd) +
129                             sizeof(bus_make.bs) + bus_make.n_size;
130         ASSERT_RETURN(-EINVAL,==,kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
131
132         /* create a new bus */
133         snprintf(bus_make.name, sizeof(bus_make.name), "%u-%s-1", uid, name);
134         bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
135         bus_make.cmd.size = sizeof(struct kdbus_cmd) +
136                             sizeof(bus_make.bs) + bus_make.n_size;
137         ASSERT_ZERO(kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
138
139         ASSERT_RETURN(-EEXIST,==,kdbus_cmd_bus_make(control_fd2, &bus_make.cmd));
140
141         snprintf(s, sizeof(s), "%s/%u-%s-1/bus", env->root, uid, name);
142         ASSERT_ZERO(access(s, F_OK));
143
144         ASSERT_ZERO(test_bus_creator_info(s));
145
146         /* can't use the same fd for bus make twice, even though a different
147          * bus name is used
148          */
149         snprintf(bus_make.name, sizeof(bus_make.name), "%u-%s-2", uid, name);
150         bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
151         bus_make.cmd.size = sizeof(struct kdbus_cmd) +
152                             sizeof(bus_make.bs) + bus_make.n_size;
153         ASSERT_RETURN(-EBADFD,==,kdbus_cmd_bus_make(env->control_fd, &bus_make.cmd));
154
155         /* create a new bus, with different fd and different bus name */
156         snprintf(bus_make.name, sizeof(bus_make.name), "%u-%s-2", uid, name);
157         bus_make.n_size = KDBUS_ITEM_HEADER_SIZE + strlen(bus_make.name) + 1;
158         bus_make.cmd.size = sizeof(struct kdbus_cmd) +
159                             sizeof(bus_make.bs) + bus_make.n_size;
160         ASSERT_ZERO(kdbus_cmd_bus_make(control_fd2, &bus_make.cmd));
161
162         CLOSE(control_fd2);
163         free(name);
164
165         return TEST_OK;
166 }