1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * Check decoding of DM_* commands of ioctl syscall.
3*cf84ac9aSAndroid Build Coastguard Worker *
4*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2016 Mikulas Patocka <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
6*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2016-2018 The strace developers.
7*cf84ac9aSAndroid Build Coastguard Worker * All rights reserved.
8*cf84ac9aSAndroid Build Coastguard Worker *
9*cf84ac9aSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
10*cf84ac9aSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
11*cf84ac9aSAndroid Build Coastguard Worker * are met:
12*cf84ac9aSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
13*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
14*cf84ac9aSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
15*cf84ac9aSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
16*cf84ac9aSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
17*cf84ac9aSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products
18*cf84ac9aSAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
19*cf84ac9aSAndroid Build Coastguard Worker *
20*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21*cf84ac9aSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*cf84ac9aSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23*cf84ac9aSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24*cf84ac9aSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25*cf84ac9aSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*cf84ac9aSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*cf84ac9aSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*cf84ac9aSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29*cf84ac9aSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*cf84ac9aSAndroid Build Coastguard Worker */
31*cf84ac9aSAndroid Build Coastguard Worker
32*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
33*cf84ac9aSAndroid Build Coastguard Worker
34*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_DM_IOCTL_H
35*cf84ac9aSAndroid Build Coastguard Worker
36*cf84ac9aSAndroid Build Coastguard Worker # include <errno.h>
37*cf84ac9aSAndroid Build Coastguard Worker # include <inttypes.h>
38*cf84ac9aSAndroid Build Coastguard Worker # include <stdio.h>
39*cf84ac9aSAndroid Build Coastguard Worker # include <stddef.h>
40*cf84ac9aSAndroid Build Coastguard Worker # include <string.h>
41*cf84ac9aSAndroid Build Coastguard Worker # include <sys/ioctl.h>
42*cf84ac9aSAndroid Build Coastguard Worker # include <linux/ioctl.h>
43*cf84ac9aSAndroid Build Coastguard Worker # include <linux/dm-ioctl.h>
44*cf84ac9aSAndroid Build Coastguard Worker
45*cf84ac9aSAndroid Build Coastguard Worker # ifndef VERBOSE
46*cf84ac9aSAndroid Build Coastguard Worker # define VERBOSE 0
47*cf84ac9aSAndroid Build Coastguard Worker # endif
48*cf84ac9aSAndroid Build Coastguard Worker
49*cf84ac9aSAndroid Build Coastguard Worker # define STR32 "AbCdEfGhIjKlMnOpQrStUvWxYz012345"
50*cf84ac9aSAndroid Build Coastguard Worker
51*cf84ac9aSAndroid Build Coastguard Worker # define ALIGNED_SIZE(s_, t_) \
52*cf84ac9aSAndroid Build Coastguard Worker (((s_) + (ALIGNOF(t_) - 1UL)) & ~(ALIGNOF(t_) - 1UL))
53*cf84ac9aSAndroid Build Coastguard Worker # define ALIGNED_OFFSET(t_, m_) \
54*cf84ac9aSAndroid Build Coastguard Worker ALIGNED_SIZE(offsetof(t_, m_), t_)
55*cf84ac9aSAndroid Build Coastguard Worker
56*cf84ac9aSAndroid Build Coastguard Worker # ifndef DM_DEV_ARM_POLL
57*cf84ac9aSAndroid Build Coastguard Worker # define DM_DEV_ARM_POLL _IOWR(DM_IOCTL, 0x10, struct dm_ioctl)
58*cf84ac9aSAndroid Build Coastguard Worker # endif
59*cf84ac9aSAndroid Build Coastguard Worker
60*cf84ac9aSAndroid Build Coastguard Worker static const char str129[] = STR32 STR32 STR32 STR32 "6";
61*cf84ac9aSAndroid Build Coastguard Worker
62*cf84ac9aSAndroid Build Coastguard Worker static const __u64 dts_sector_base = (__u64) 0xdeadca75facef157ULL;
63*cf84ac9aSAndroid Build Coastguard Worker static const __u64 dts_sector_step = (__u64) 0x100000001ULL;
64*cf84ac9aSAndroid Build Coastguard Worker static const __u64 dts_length_base = (__u64) 0xbadc0dedda7a1057ULL;
65*cf84ac9aSAndroid Build Coastguard Worker static const __u64 dts_length_step = (__u64) 0x700000007ULL;
66*cf84ac9aSAndroid Build Coastguard Worker static const __s32 dts_status_base = (__s32) 3141592653U;
67*cf84ac9aSAndroid Build Coastguard Worker static const __s32 dts_status_step = 0x1234;
68*cf84ac9aSAndroid Build Coastguard Worker
69*cf84ac9aSAndroid Build Coastguard Worker static const size_t min_sizeof_dm_ioctl =
70*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_ioctl, data);
71*cf84ac9aSAndroid Build Coastguard Worker
72*cf84ac9aSAndroid Build Coastguard Worker static struct s {
73*cf84ac9aSAndroid Build Coastguard Worker struct dm_ioctl ioc;
74*cf84ac9aSAndroid Build Coastguard Worker union {
75*cf84ac9aSAndroid Build Coastguard Worker struct {
76*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target_spec;
77*cf84ac9aSAndroid Build Coastguard Worker char target_params[256];
78*cf84ac9aSAndroid Build Coastguard Worker } ts;
79*cf84ac9aSAndroid Build Coastguard Worker struct {
80*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_msg target_msg;
81*cf84ac9aSAndroid Build Coastguard Worker char target_string[256];
82*cf84ac9aSAndroid Build Coastguard Worker } tm;
83*cf84ac9aSAndroid Build Coastguard Worker char string[256];
84*cf84ac9aSAndroid Build Coastguard Worker } u;
85*cf84ac9aSAndroid Build Coastguard Worker } s;
86*cf84ac9aSAndroid Build Coastguard Worker
87*cf84ac9aSAndroid Build Coastguard Worker struct dm_table_open_test {
88*cf84ac9aSAndroid Build Coastguard Worker struct dm_ioctl ioc;
89*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target0;
90*cf84ac9aSAndroid Build Coastguard Worker char param0[1];
91*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target1;
92*cf84ac9aSAndroid Build Coastguard Worker char param1[2];
93*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target2;
94*cf84ac9aSAndroid Build Coastguard Worker char param2[3];
95*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target3;
96*cf84ac9aSAndroid Build Coastguard Worker char param3[4];
97*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target4;
98*cf84ac9aSAndroid Build Coastguard Worker char param4[5];
99*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target5;
100*cf84ac9aSAndroid Build Coastguard Worker char param5[6];
101*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target6;
102*cf84ac9aSAndroid Build Coastguard Worker char param6[7];
103*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target7;
104*cf84ac9aSAndroid Build Coastguard Worker char param7[8];
105*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target8;
106*cf84ac9aSAndroid Build Coastguard Worker char param8[9];
107*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_spec target9;
108*cf84ac9aSAndroid Build Coastguard Worker char param9[10];
109*cf84ac9aSAndroid Build Coastguard Worker };
110*cf84ac9aSAndroid Build Coastguard Worker
111*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_msg_test {
112*cf84ac9aSAndroid Build Coastguard Worker struct dm_ioctl ioc;
113*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_msg msg;
114*cf84ac9aSAndroid Build Coastguard Worker };
115*cf84ac9aSAndroid Build Coastguard Worker
116*cf84ac9aSAndroid Build Coastguard Worker struct args {
117*cf84ac9aSAndroid Build Coastguard Worker unsigned int arg;
118*cf84ac9aSAndroid Build Coastguard Worker const char *str;
119*cf84ac9aSAndroid Build Coastguard Worker bool has_params;
120*cf84ac9aSAndroid Build Coastguard Worker bool has_event_nr;
121*cf84ac9aSAndroid Build Coastguard Worker };
122*cf84ac9aSAndroid Build Coastguard Worker
123*cf84ac9aSAndroid Build Coastguard Worker
124*cf84ac9aSAndroid Build Coastguard Worker static void
init_s(struct dm_ioctl * s,size_t size,size_t offs)125*cf84ac9aSAndroid Build Coastguard Worker init_s(struct dm_ioctl *s, size_t size, size_t offs)
126*cf84ac9aSAndroid Build Coastguard Worker {
127*cf84ac9aSAndroid Build Coastguard Worker memset(s, 0, size);
128*cf84ac9aSAndroid Build Coastguard Worker s->version[0] = DM_VERSION_MAJOR;
129*cf84ac9aSAndroid Build Coastguard Worker s->version[1] = 1;
130*cf84ac9aSAndroid Build Coastguard Worker s->version[2] = 2;
131*cf84ac9aSAndroid Build Coastguard Worker s->data_size = size;
132*cf84ac9aSAndroid Build Coastguard Worker s->data_start = offs;
133*cf84ac9aSAndroid Build Coastguard Worker s->dev = 0x1234;
134*cf84ac9aSAndroid Build Coastguard Worker strcpy(s->name, "nnn");
135*cf84ac9aSAndroid Build Coastguard Worker strcpy(s->uuid, "uuu");
136*cf84ac9aSAndroid Build Coastguard Worker }
137*cf84ac9aSAndroid Build Coastguard Worker
138*cf84ac9aSAndroid Build Coastguard Worker static void
init_dm_target_spec(struct dm_target_spec * ptr,uint32_t id)139*cf84ac9aSAndroid Build Coastguard Worker init_dm_target_spec(struct dm_target_spec *ptr, uint32_t id)
140*cf84ac9aSAndroid Build Coastguard Worker {
141*cf84ac9aSAndroid Build Coastguard Worker ptr->sector_start = dts_sector_base + dts_sector_step * id;
142*cf84ac9aSAndroid Build Coastguard Worker ptr->length = dts_length_base + dts_length_step * id;
143*cf84ac9aSAndroid Build Coastguard Worker ptr->status = dts_status_base + dts_status_step * id;
144*cf84ac9aSAndroid Build Coastguard Worker
145*cf84ac9aSAndroid Build Coastguard Worker memcpy(ptr->target_type, str129 +
146*cf84ac9aSAndroid Build Coastguard Worker id % (sizeof(str129) - sizeof(ptr->target_type)),
147*cf84ac9aSAndroid Build Coastguard Worker id % (sizeof(ptr->target_type) + 1));
148*cf84ac9aSAndroid Build Coastguard Worker if (id % (sizeof(ptr->target_type) + 1) < sizeof(ptr->target_type))
149*cf84ac9aSAndroid Build Coastguard Worker ptr->target_type[id % (sizeof(ptr->target_type) + 1)] = '\0';
150*cf84ac9aSAndroid Build Coastguard Worker }
151*cf84ac9aSAndroid Build Coastguard Worker
152*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
153*cf84ac9aSAndroid Build Coastguard Worker static void
print_dm_target_spec(struct dm_target_spec * ptr,uint32_t id)154*cf84ac9aSAndroid Build Coastguard Worker print_dm_target_spec(struct dm_target_spec *ptr, uint32_t id)
155*cf84ac9aSAndroid Build Coastguard Worker {
156*cf84ac9aSAndroid Build Coastguard Worker printf("{sector_start=%" PRI__u64 ", length=%" PRI__u64 ", "
157*cf84ac9aSAndroid Build Coastguard Worker "target_type=\"%.*s\", string=",
158*cf84ac9aSAndroid Build Coastguard Worker dts_sector_base + dts_sector_step * id,
159*cf84ac9aSAndroid Build Coastguard Worker dts_length_base + dts_length_step * id,
160*cf84ac9aSAndroid Build Coastguard Worker (int) (id % (sizeof(ptr->target_type) + 1)),
161*cf84ac9aSAndroid Build Coastguard Worker str129 + id % (sizeof(str129) - sizeof(ptr->target_type)));
162*cf84ac9aSAndroid Build Coastguard Worker }
163*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
164*cf84ac9aSAndroid Build Coastguard Worker
165*cf84ac9aSAndroid Build Coastguard Worker int
main(void)166*cf84ac9aSAndroid Build Coastguard Worker main(void)
167*cf84ac9aSAndroid Build Coastguard Worker {
168*cf84ac9aSAndroid Build Coastguard Worker static kernel_ulong_t dummy_dm_ioctl1 =
169*cf84ac9aSAndroid Build Coastguard Worker _IOC(_IOC_READ, DM_IOCTL, 0, 0x1fff);
170*cf84ac9aSAndroid Build Coastguard Worker static kernel_ulong_t dummy_dm_ioctl2 =
171*cf84ac9aSAndroid Build Coastguard Worker _IOC(_IOC_READ|_IOC_WRITE, DM_IOCTL, 0xed, 0);
172*cf84ac9aSAndroid Build Coastguard Worker static kernel_ulong_t dummy_dm_arg =
173*cf84ac9aSAndroid Build Coastguard Worker (kernel_ulong_t) 0xbadc0dedda7a1057ULL;
174*cf84ac9aSAndroid Build Coastguard Worker /* We can't check these properly for now */
175*cf84ac9aSAndroid Build Coastguard Worker static struct args dummy_check_cmds_nodev[] = {
176*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_REMOVE_ALL), false },
177*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_LIST_DEVICES), true },
178*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_LIST_VERSIONS), true },
179*cf84ac9aSAndroid Build Coastguard Worker };
180*cf84ac9aSAndroid Build Coastguard Worker static struct args dummy_check_cmds[] = {
181*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_DEV_CREATE), false },
182*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_DEV_REMOVE), false, true },
183*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_DEV_STATUS), false },
184*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_DEV_WAIT), true, true },
185*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_TABLE_CLEAR), false },
186*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_TABLE_DEPS), true },
187*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_TABLE_STATUS), true },
188*cf84ac9aSAndroid Build Coastguard Worker { ARG_STR(DM_DEV_ARM_POLL), false },
189*cf84ac9aSAndroid Build Coastguard Worker };
190*cf84ac9aSAndroid Build Coastguard Worker
191*cf84ac9aSAndroid Build Coastguard Worker struct dm_ioctl *unaligned_dm_arg =
192*cf84ac9aSAndroid Build Coastguard Worker tail_alloc(offsetof(struct dm_ioctl, data));
193*cf84ac9aSAndroid Build Coastguard Worker struct dm_ioctl *dm_arg =
194*cf84ac9aSAndroid Build Coastguard Worker tail_alloc(ALIGNED_OFFSET(struct dm_ioctl, data));
195*cf84ac9aSAndroid Build Coastguard Worker struct dm_table_open_test *dm_arg_open1 =
196*cf84ac9aSAndroid Build Coastguard Worker tail_alloc(ALIGNED_OFFSET(struct dm_table_open_test, target1));
197*cf84ac9aSAndroid Build Coastguard Worker struct dm_table_open_test *dm_arg_open2 =
198*cf84ac9aSAndroid Build Coastguard Worker tail_alloc(ALIGNED_OFFSET(struct dm_table_open_test, param1));
199*cf84ac9aSAndroid Build Coastguard Worker struct dm_table_open_test *dm_arg_open3 =
200*cf84ac9aSAndroid Build Coastguard Worker tail_alloc(ALIGNED_OFFSET(struct dm_table_open_test, target9));
201*cf84ac9aSAndroid Build Coastguard Worker struct dm_target_msg_test *dm_arg_msg =
202*cf84ac9aSAndroid Build Coastguard Worker tail_alloc(sizeof(*dm_arg_msg));
203*cf84ac9aSAndroid Build Coastguard Worker
204*cf84ac9aSAndroid Build Coastguard Worker long rc;
205*cf84ac9aSAndroid Build Coastguard Worker const char *errstr;
206*cf84ac9aSAndroid Build Coastguard Worker unsigned int i;
207*cf84ac9aSAndroid Build Coastguard Worker
208*cf84ac9aSAndroid Build Coastguard Worker
209*cf84ac9aSAndroid Build Coastguard Worker /* Incorrect operation */
210*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, _IOW(DM_IOCTL, 0xde, int), dm_arg);
211*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, _IOC(_IOC_WRITE, %#x, 0xde, %#zx), %p) = "
212*cf84ac9aSAndroid Build Coastguard Worker "-1 EBADF (%m)\n",
213*cf84ac9aSAndroid Build Coastguard Worker DM_IOCTL, sizeof(int), dm_arg);
214*cf84ac9aSAndroid Build Coastguard Worker
215*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, dummy_dm_ioctl1, 0);
216*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, _IOC(_IOC_READ, %#x, 0, %#x), 0) = -1 EBADF (%m)\n",
217*cf84ac9aSAndroid Build Coastguard Worker DM_IOCTL, (unsigned int) _IOC_SIZE(dummy_dm_ioctl1));
218*cf84ac9aSAndroid Build Coastguard Worker
219*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, dummy_dm_ioctl2, dummy_dm_arg);
220*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, _IOC(_IOC_READ|_IOC_WRITE, %#x, %#x, 0), %#lx) = "
221*cf84ac9aSAndroid Build Coastguard Worker "-1 EBADF (%m)\n",
222*cf84ac9aSAndroid Build Coastguard Worker DM_IOCTL, (unsigned int) _IOC_NR(dummy_dm_ioctl2),
223*cf84ac9aSAndroid Build Coastguard Worker (unsigned long) dummy_dm_arg);
224*cf84ac9aSAndroid Build Coastguard Worker
225*cf84ac9aSAndroid Build Coastguard Worker
226*cf84ac9aSAndroid Build Coastguard Worker /* DM_VERSION */
227*cf84ac9aSAndroid Build Coastguard Worker /* Incorrect pointer */
228*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_VERSION, dm_arg + 1);
229*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_VERSION, %p) = -1 EBADF (%m)\n", dm_arg + 1);
230*cf84ac9aSAndroid Build Coastguard Worker
231*cf84ac9aSAndroid Build Coastguard Worker /* Incorrect data_size */
232*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, 0, 0);
233*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_VERSION, &s);
234*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_VERSION, %p) = -1 EBADF (%m)\n", &s);
235*cf84ac9aSAndroid Build Coastguard Worker
236*cf84ac9aSAndroid Build Coastguard Worker /* Incorrect version */
237*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0);
238*cf84ac9aSAndroid Build Coastguard Worker dm_arg->version[0] = 0xbadc0ded;
239*cf84ac9aSAndroid Build Coastguard Worker dm_arg->version[1] = 0xbadc0dee;
240*cf84ac9aSAndroid Build Coastguard Worker dm_arg->version[2] = 0xbadc0def;
241*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_VERSION, dm_arg);
242*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_VERSION, {version=%u.%u.%u"
243*cf84ac9aSAndroid Build Coastguard Worker " /* unsupported device mapper ABI version */}) = "
244*cf84ac9aSAndroid Build Coastguard Worker "-1 EBADF (%m)\n", 0xbadc0ded, 0xbadc0dee, 0xbadc0def);
245*cf84ac9aSAndroid Build Coastguard Worker
246*cf84ac9aSAndroid Build Coastguard Worker /* Incorrect data_size */
247*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, 14, 64);
248*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_VERSION, dm_arg);
249*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_VERSION, {version=4.1.2, data_size=14"
250*cf84ac9aSAndroid Build Coastguard Worker " /* data_size too small */}) = -1 EBADF (%m)\n");
251*cf84ac9aSAndroid Build Coastguard Worker
252*cf84ac9aSAndroid Build Coastguard Worker /* Unterminated name/uuid */
253*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0);
254*cf84ac9aSAndroid Build Coastguard Worker memcpy(dm_arg->name, str129, sizeof(dm_arg->name));
255*cf84ac9aSAndroid Build Coastguard Worker memcpy(dm_arg->uuid, str129, sizeof(dm_arg->uuid));
256*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_VERSION, dm_arg);
257*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_VERSION, {version=4.1.2, data_size=%zu, "
258*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"%.127s\"..., uuid=\"%.128s\"..., "
259*cf84ac9aSAndroid Build Coastguard Worker "flags=0}) = -1 EBADF (%m)\n",
260*cf84ac9aSAndroid Build Coastguard Worker min_sizeof_dm_ioctl, str129, str129);
261*cf84ac9aSAndroid Build Coastguard Worker
262*cf84ac9aSAndroid Build Coastguard Worker /* Normal call */
263*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0);
264*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_VERSION, dm_arg);
265*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_VERSION, "
266*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, "
267*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0}) = "
268*cf84ac9aSAndroid Build Coastguard Worker "-1 EBADF (%m)\n", min_sizeof_dm_ioctl);
269*cf84ac9aSAndroid Build Coastguard Worker
270*cf84ac9aSAndroid Build Coastguard Worker /* Zero dev, name, uuid */
271*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0);
272*cf84ac9aSAndroid Build Coastguard Worker dm_arg->data_size = 0xfacefeed;
273*cf84ac9aSAndroid Build Coastguard Worker dm_arg->dev = 0;
274*cf84ac9aSAndroid Build Coastguard Worker dm_arg->name[0] = '\0';
275*cf84ac9aSAndroid Build Coastguard Worker dm_arg->uuid[0] = '\0';
276*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_VERSION, dm_arg);
277*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_VERSION, "
278*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%u, flags=0}) = "
279*cf84ac9aSAndroid Build Coastguard Worker "-1 EBADF (%m)\n", 0xfacefeed);
280*cf84ac9aSAndroid Build Coastguard Worker
281*cf84ac9aSAndroid Build Coastguard Worker /* Flag */
282*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0);
283*cf84ac9aSAndroid Build Coastguard Worker dm_arg->flags = 0xffffffff;
284*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_VERSION, dm_arg);
285*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_VERSION, "
286*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, "
287*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags="
288*cf84ac9aSAndroid Build Coastguard Worker "DM_READONLY_FLAG|DM_SUSPEND_FLAG|DM_EXISTS_FLAG|"
289*cf84ac9aSAndroid Build Coastguard Worker "DM_PERSISTENT_DEV_FLAG|DM_STATUS_TABLE_FLAG|"
290*cf84ac9aSAndroid Build Coastguard Worker "DM_ACTIVE_PRESENT_FLAG|DM_INACTIVE_PRESENT_FLAG|"
291*cf84ac9aSAndroid Build Coastguard Worker "DM_BUFFER_FULL_FLAG|DM_SKIP_BDGET_FLAG|DM_SKIP_LOCKFS_FLAG|"
292*cf84ac9aSAndroid Build Coastguard Worker "DM_NOFLUSH_FLAG|DM_QUERY_INACTIVE_TABLE_FLAG|"
293*cf84ac9aSAndroid Build Coastguard Worker "DM_UEVENT_GENERATED_FLAG|DM_UUID_FLAG|DM_SECURE_DATA_FLAG|"
294*cf84ac9aSAndroid Build Coastguard Worker "DM_DATA_OUT_FLAG|DM_DEFERRED_REMOVE|DM_INTERNAL_SUSPEND_FLAG|"
295*cf84ac9aSAndroid Build Coastguard Worker "0xfff80080}) = -1 EBADF (%m)\n",
296*cf84ac9aSAndroid Build Coastguard Worker min_sizeof_dm_ioctl);
297*cf84ac9aSAndroid Build Coastguard Worker
298*cf84ac9aSAndroid Build Coastguard Worker /* Normal call */
299*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s.ioc), 0);
300*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_VERSION, &s);
301*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_VERSION, "
302*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, "
303*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0}) = "
304*cf84ac9aSAndroid Build Coastguard Worker "-1 EBADF (%m)\n", sizeof(s.ioc));
305*cf84ac9aSAndroid Build Coastguard Worker
306*cf84ac9aSAndroid Build Coastguard Worker
307*cf84ac9aSAndroid Build Coastguard Worker /* DM_REMOVE_ALL */
308*cf84ac9aSAndroid Build Coastguard Worker /* DM_LIST_DEVICES */
309*cf84ac9aSAndroid Build Coastguard Worker /* DM_LIST_VERSIONS */
310*cf84ac9aSAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(dummy_check_cmds_nodev); i++) {
311*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0);
312*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, dummy_check_cmds_nodev[i].arg, dm_arg);
313*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, %s, {version=4.1.2, data_size=%zu%s, "
314*cf84ac9aSAndroid Build Coastguard Worker "flags=0}) = -1 EBADF (%m)\n",
315*cf84ac9aSAndroid Build Coastguard Worker dummy_check_cmds_nodev[i].str,
316*cf84ac9aSAndroid Build Coastguard Worker min_sizeof_dm_ioctl,
317*cf84ac9aSAndroid Build Coastguard Worker dummy_check_cmds_nodev[i].has_params ?
318*cf84ac9aSAndroid Build Coastguard Worker ", data_start=0" : "");
319*cf84ac9aSAndroid Build Coastguard Worker }
320*cf84ac9aSAndroid Build Coastguard Worker
321*cf84ac9aSAndroid Build Coastguard Worker
322*cf84ac9aSAndroid Build Coastguard Worker /* DM_DEV_CREATE */
323*cf84ac9aSAndroid Build Coastguard Worker /* DM_DEV_REMOVE */
324*cf84ac9aSAndroid Build Coastguard Worker /* DM_DEV_STATUS */
325*cf84ac9aSAndroid Build Coastguard Worker /* DM_DEV_WAIT */
326*cf84ac9aSAndroid Build Coastguard Worker /* DM_TABLE_CLEAR */
327*cf84ac9aSAndroid Build Coastguard Worker /* DM_TABLE_DEPS */
328*cf84ac9aSAndroid Build Coastguard Worker /* DM_TABLE_STATUS */
329*cf84ac9aSAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(dummy_check_cmds); i++) {
330*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0);
331*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, dummy_check_cmds[i].arg, dm_arg);
332*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, %s, {version=4.1.2, data_size=%zu%s, "
333*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\"%s, "
334*cf84ac9aSAndroid Build Coastguard Worker "flags=0}) = -1 EBADF (%m)\n",
335*cf84ac9aSAndroid Build Coastguard Worker dummy_check_cmds[i].str, min_sizeof_dm_ioctl,
336*cf84ac9aSAndroid Build Coastguard Worker dummy_check_cmds[i].has_params ? ", data_start=0" : "",
337*cf84ac9aSAndroid Build Coastguard Worker dummy_check_cmds[i].has_event_nr ? ", event_nr=0" : "");
338*cf84ac9aSAndroid Build Coastguard Worker }
339*cf84ac9aSAndroid Build Coastguard Worker
340*cf84ac9aSAndroid Build Coastguard Worker
341*cf84ac9aSAndroid Build Coastguard Worker /* DM_DEV_SUSPEND */
342*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s.ioc), 0);
343*cf84ac9aSAndroid Build Coastguard Worker s.ioc.flags = DM_SUSPEND_FLAG;
344*cf84ac9aSAndroid Build Coastguard Worker s.ioc.event_nr = 0xbadc0ded;
345*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_DEV_SUSPEND, &s);
346*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_DEV_SUSPEND, "
347*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, "
348*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
349*cf84ac9aSAndroid Build Coastguard Worker "flags=DM_SUSPEND_FLAG}) = -1 EBADF (%m)\n", sizeof(s.ioc));
350*cf84ac9aSAndroid Build Coastguard Worker
351*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s.ioc), 0);
352*cf84ac9aSAndroid Build Coastguard Worker s.ioc.event_nr = 0xbadc0ded;
353*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_DEV_SUSPEND, &s);
354*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_DEV_SUSPEND, "
355*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, dev=makedev(18, 52), "
356*cf84ac9aSAndroid Build Coastguard Worker "name=\"nnn\", uuid=\"uuu\", event_nr=3134983661, "
357*cf84ac9aSAndroid Build Coastguard Worker "flags=0}) = -1 EBADF (%m)\n", sizeof(s.ioc));
358*cf84ac9aSAndroid Build Coastguard Worker
359*cf84ac9aSAndroid Build Coastguard Worker
360*cf84ac9aSAndroid Build Coastguard Worker /* DM_TABLE_LOAD */
361*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
362*cf84ac9aSAndroid Build Coastguard Worker s.ioc.target_count = 1;
363*cf84ac9aSAndroid Build Coastguard Worker s.u.ts.target_spec.sector_start = 0x10;
364*cf84ac9aSAndroid Build Coastguard Worker s.u.ts.target_spec.length = 0x20;
365*cf84ac9aSAndroid Build Coastguard Worker s.u.ts.target_spec.next =
366*cf84ac9aSAndroid Build Coastguard Worker sizeof(s.u.ts.target_spec) + sizeof(s.u.ts.target_params);
367*cf84ac9aSAndroid Build Coastguard Worker strcpy(s.u.ts.target_spec.target_type, "tgt");
368*cf84ac9aSAndroid Build Coastguard Worker strcpy(s.u.ts.target_params, "tparams");
369*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_TABLE_LOAD, &s);
370*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TABLE_LOAD, "
371*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%u, data_start=%u, "
372*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
373*cf84ac9aSAndroid Build Coastguard Worker "target_count=1, flags=0, "
374*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
375*cf84ac9aSAndroid Build Coastguard Worker "{sector_start=16, length=32, target_type=\"tgt\", "
376*cf84ac9aSAndroid Build Coastguard Worker "string=\"tparams\"}"
377*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
378*cf84ac9aSAndroid Build Coastguard Worker "..."
379*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
380*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n", s.ioc.data_size, s.ioc.data_start);
381*cf84ac9aSAndroid Build Coastguard Worker
382*cf84ac9aSAndroid Build Coastguard Worker /* No targets */
383*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, min_sizeof_dm_ioctl);
384*cf84ac9aSAndroid Build Coastguard Worker dm_arg->data_size = sizeof(*dm_arg);
385*cf84ac9aSAndroid Build Coastguard Worker dm_arg->target_count = 0;
386*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_TABLE_LOAD, dm_arg);
387*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TABLE_LOAD, "
388*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
389*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
390*cf84ac9aSAndroid Build Coastguard Worker "target_count=0, flags=0}) = -1 EBADF (%m)\n",
391*cf84ac9aSAndroid Build Coastguard Worker sizeof(*dm_arg), min_sizeof_dm_ioctl);
392*cf84ac9aSAndroid Build Coastguard Worker
393*cf84ac9aSAndroid Build Coastguard Worker /* Invalid data_start */
394*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0xfffffff8);
395*cf84ac9aSAndroid Build Coastguard Worker dm_arg->data_size = sizeof(*dm_arg);
396*cf84ac9aSAndroid Build Coastguard Worker dm_arg->target_count = 1234;
397*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_TABLE_LOAD, dm_arg);
398*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TABLE_LOAD, "
399*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%u, "
400*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
401*cf84ac9aSAndroid Build Coastguard Worker "target_count=1234, flags=0, "
402*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
403*cf84ac9aSAndroid Build Coastguard Worker "??? /* misplaced struct dm_target_spec */"
404*cf84ac9aSAndroid Build Coastguard Worker # else
405*cf84ac9aSAndroid Build Coastguard Worker "..."
406*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
407*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n", sizeof(*dm_arg), 0xfffffff8);
408*cf84ac9aSAndroid Build Coastguard Worker
409*cf84ac9aSAndroid Build Coastguard Worker /* Inaccessible pointer */
410*cf84ac9aSAndroid Build Coastguard Worker init_s(&dm_arg_open1->ioc, offsetof(struct dm_table_open_test, target1),
411*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target1));
412*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open1->ioc.data_size = sizeof(*dm_arg_open1);
413*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open1->ioc.target_count = 0xdeaddea1;
414*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_TABLE_LOAD, dm_arg_open1);
415*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TABLE_LOAD, "
416*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
417*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
418*cf84ac9aSAndroid Build Coastguard Worker "target_count=3735936673, flags=0, "
419*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
420*cf84ac9aSAndroid Build Coastguard Worker "%p"
421*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
422*cf84ac9aSAndroid Build Coastguard Worker "..."
423*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
424*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n", sizeof(*dm_arg_open1),
425*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target1)
426*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
427*cf84ac9aSAndroid Build Coastguard Worker , (char *) dm_arg_open1 +
428*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target1)
429*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
430*cf84ac9aSAndroid Build Coastguard Worker );
431*cf84ac9aSAndroid Build Coastguard Worker
432*cf84ac9aSAndroid Build Coastguard Worker /* Inaccessible string */
433*cf84ac9aSAndroid Build Coastguard Worker init_s(&dm_arg_open2->ioc, offsetof(struct dm_table_open_test, param1),
434*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target1));
435*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open2->ioc.data_size = sizeof(*dm_arg_open2);
436*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open2->ioc.target_count = 2;
437*cf84ac9aSAndroid Build Coastguard Worker init_dm_target_spec(&dm_arg_open2->target1, 7);
438*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open2->target1.next =
439*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target3) -
440*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target1);
441*cf84ac9aSAndroid Build Coastguard Worker rc = ioctl(-1, DM_TABLE_LOAD, dm_arg_open2);
442*cf84ac9aSAndroid Build Coastguard Worker errstr = sprintrc(rc);
443*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TABLE_LOAD, "
444*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
445*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
446*cf84ac9aSAndroid Build Coastguard Worker "target_count=2, flags=0, ",
447*cf84ac9aSAndroid Build Coastguard Worker sizeof(*dm_arg_open2),
448*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target1));
449*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
450*cf84ac9aSAndroid Build Coastguard Worker print_dm_target_spec(&dm_arg_open2->target1, 7);
451*cf84ac9aSAndroid Build Coastguard Worker printf("%p}, %p",
452*cf84ac9aSAndroid Build Coastguard Worker (char *) dm_arg_open2 +
453*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, param1),
454*cf84ac9aSAndroid Build Coastguard Worker (char *) dm_arg_open2 +
455*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target3));
456*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
457*cf84ac9aSAndroid Build Coastguard Worker printf("...");
458*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
459*cf84ac9aSAndroid Build Coastguard Worker printf("}) = %s\n", errstr);
460*cf84ac9aSAndroid Build Coastguard Worker
461*cf84ac9aSAndroid Build Coastguard Worker /* Incorrect next */
462*cf84ac9aSAndroid Build Coastguard Worker init_s(&dm_arg_open3->ioc, offsetof(struct dm_table_open_test, target5),
463*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target0));
464*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->ioc.target_count = 4;
465*cf84ac9aSAndroid Build Coastguard Worker
466*cf84ac9aSAndroid Build Coastguard Worker init_dm_target_spec(&dm_arg_open3->target0, 9);
467*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->target0.next =
468*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target1) -
469*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target0);
470*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->param0[0] = '\0';
471*cf84ac9aSAndroid Build Coastguard Worker
472*cf84ac9aSAndroid Build Coastguard Worker init_dm_target_spec(&dm_arg_open3->target1, 15);
473*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->target1.next =
474*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target3) -
475*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target1);
476*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->param1[0] = '\377';
477*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->param1[1] = '\0';
478*cf84ac9aSAndroid Build Coastguard Worker
479*cf84ac9aSAndroid Build Coastguard Worker init_dm_target_spec(&dm_arg_open3->target3, 42);
480*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->target3.next = 0xdeadbeef;
481*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->param3[0] = '\1';
482*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->param3[1] = '\2';
483*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->param3[2] = '\0';
484*cf84ac9aSAndroid Build Coastguard Worker
485*cf84ac9aSAndroid Build Coastguard Worker rc = ioctl(-1, DM_TABLE_LOAD, dm_arg_open3);
486*cf84ac9aSAndroid Build Coastguard Worker errstr = sprintrc(rc);
487*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TABLE_LOAD, "
488*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
489*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
490*cf84ac9aSAndroid Build Coastguard Worker "target_count=4, flags=0, ",
491*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target5),
492*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target0));
493*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
494*cf84ac9aSAndroid Build Coastguard Worker print_dm_target_spec(&dm_arg_open3->target0, 9);
495*cf84ac9aSAndroid Build Coastguard Worker printf("\"\"}, ");
496*cf84ac9aSAndroid Build Coastguard Worker print_dm_target_spec(&dm_arg_open3->target1, 15);
497*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\377\"}, ");
498*cf84ac9aSAndroid Build Coastguard Worker print_dm_target_spec(&dm_arg_open3->target1, 42);
499*cf84ac9aSAndroid Build Coastguard Worker printf("\"\\1\\2\"}, ??? /* misplaced struct dm_target_spec */");
500*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
501*cf84ac9aSAndroid Build Coastguard Worker printf("...");
502*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
503*cf84ac9aSAndroid Build Coastguard Worker printf("}) = %s\n", errstr);
504*cf84ac9aSAndroid Build Coastguard Worker
505*cf84ac9aSAndroid Build Coastguard Worker #define FILL_DM_TARGET(id, id_next) \
506*cf84ac9aSAndroid Build Coastguard Worker do { \
507*cf84ac9aSAndroid Build Coastguard Worker init_dm_target_spec(&dm_arg_open3->target##id, id); \
508*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->target##id.next = \
509*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, \
510*cf84ac9aSAndroid Build Coastguard Worker target##id_next) - \
511*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, \
512*cf84ac9aSAndroid Build Coastguard Worker target##id); \
513*cf84ac9aSAndroid Build Coastguard Worker memcpy(dm_arg_open3->param##id, str129 + id * 2, id); \
514*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->param##id[id] = '\0'; \
515*cf84ac9aSAndroid Build Coastguard Worker } while (0)
516*cf84ac9aSAndroid Build Coastguard Worker #define PRINT_DM_TARGET(id) \
517*cf84ac9aSAndroid Build Coastguard Worker do { \
518*cf84ac9aSAndroid Build Coastguard Worker print_dm_target_spec(&dm_arg_open3->target##id, id); \
519*cf84ac9aSAndroid Build Coastguard Worker printf("\"%.*s\"}, ", id, str129 + id * 2); \
520*cf84ac9aSAndroid Build Coastguard Worker } while (0)
521*cf84ac9aSAndroid Build Coastguard Worker
522*cf84ac9aSAndroid Build Coastguard Worker /* max_strlen limit */
523*cf84ac9aSAndroid Build Coastguard Worker init_s(&dm_arg_open3->ioc, offsetof(struct dm_table_open_test, target9),
524*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target0));
525*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->ioc.data_size = sizeof(*dm_arg_open3);
526*cf84ac9aSAndroid Build Coastguard Worker dm_arg_open3->ioc.target_count = 0xbadc0ded;
527*cf84ac9aSAndroid Build Coastguard Worker FILL_DM_TARGET(0, 1);
528*cf84ac9aSAndroid Build Coastguard Worker FILL_DM_TARGET(1, 2);
529*cf84ac9aSAndroid Build Coastguard Worker FILL_DM_TARGET(2, 3);
530*cf84ac9aSAndroid Build Coastguard Worker FILL_DM_TARGET(3, 4);
531*cf84ac9aSAndroid Build Coastguard Worker FILL_DM_TARGET(4, 5);
532*cf84ac9aSAndroid Build Coastguard Worker FILL_DM_TARGET(5, 6);
533*cf84ac9aSAndroid Build Coastguard Worker FILL_DM_TARGET(6, 7);
534*cf84ac9aSAndroid Build Coastguard Worker FILL_DM_TARGET(7, 8);
535*cf84ac9aSAndroid Build Coastguard Worker FILL_DM_TARGET(8, 9);
536*cf84ac9aSAndroid Build Coastguard Worker rc = ioctl(-1, DM_TABLE_LOAD, dm_arg_open3);
537*cf84ac9aSAndroid Build Coastguard Worker errstr = sprintrc(rc);
538*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TABLE_LOAD, "
539*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
540*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
541*cf84ac9aSAndroid Build Coastguard Worker "target_count=3134983661, flags=0, ",
542*cf84ac9aSAndroid Build Coastguard Worker sizeof(*dm_arg_open3),
543*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_table_open_test, target0));
544*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
545*cf84ac9aSAndroid Build Coastguard Worker PRINT_DM_TARGET(0);
546*cf84ac9aSAndroid Build Coastguard Worker PRINT_DM_TARGET(1);
547*cf84ac9aSAndroid Build Coastguard Worker PRINT_DM_TARGET(2);
548*cf84ac9aSAndroid Build Coastguard Worker PRINT_DM_TARGET(3);
549*cf84ac9aSAndroid Build Coastguard Worker PRINT_DM_TARGET(4);
550*cf84ac9aSAndroid Build Coastguard Worker PRINT_DM_TARGET(5);
551*cf84ac9aSAndroid Build Coastguard Worker PRINT_DM_TARGET(6);
552*cf84ac9aSAndroid Build Coastguard Worker PRINT_DM_TARGET(7);
553*cf84ac9aSAndroid Build Coastguard Worker PRINT_DM_TARGET(8);
554*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
555*cf84ac9aSAndroid Build Coastguard Worker printf("...}) = %s\n", errstr);
556*cf84ac9aSAndroid Build Coastguard Worker
557*cf84ac9aSAndroid Build Coastguard Worker
558*cf84ac9aSAndroid Build Coastguard Worker /* DM_TARGET_MSG */
559*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
560*cf84ac9aSAndroid Build Coastguard Worker s.u.tm.target_msg.sector = 0x1234;
561*cf84ac9aSAndroid Build Coastguard Worker strcpy(s.u.string + offsetof(struct dm_target_msg, message),
562*cf84ac9aSAndroid Build Coastguard Worker "long target msg");
563*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_TARGET_MSG, &s);
564*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TARGET_MSG, "
565*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%u, data_start=%u, "
566*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
567*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
568*cf84ac9aSAndroid Build Coastguard Worker "{sector=4660, message=\"long targ\"...}"
569*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
570*cf84ac9aSAndroid Build Coastguard Worker "..."
571*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
572*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
573*cf84ac9aSAndroid Build Coastguard Worker s.ioc.data_size, s.ioc.data_start);
574*cf84ac9aSAndroid Build Coastguard Worker
575*cf84ac9aSAndroid Build Coastguard Worker /* Invalid data_start */
576*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, min_sizeof_dm_ioctl);
577*cf84ac9aSAndroid Build Coastguard Worker dm_arg->data_size = sizeof(*dm_arg);
578*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_TARGET_MSG, dm_arg);
579*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TARGET_MSG, "
580*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
581*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
582*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
583*cf84ac9aSAndroid Build Coastguard Worker "??? /* misplaced struct dm_target_msg */"
584*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
585*cf84ac9aSAndroid Build Coastguard Worker "..."
586*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
587*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
588*cf84ac9aSAndroid Build Coastguard Worker sizeof(*dm_arg), min_sizeof_dm_ioctl);
589*cf84ac9aSAndroid Build Coastguard Worker
590*cf84ac9aSAndroid Build Coastguard Worker /* Invalid data_start */
591*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0xffffffff);
592*cf84ac9aSAndroid Build Coastguard Worker dm_arg->data_size = sizeof(*dm_arg);
593*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_TARGET_MSG, dm_arg);
594*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TARGET_MSG, "
595*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%u, "
596*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
597*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
598*cf84ac9aSAndroid Build Coastguard Worker "??? /* misplaced struct dm_target_msg */"
599*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
600*cf84ac9aSAndroid Build Coastguard Worker "..."
601*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
602*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
603*cf84ac9aSAndroid Build Coastguard Worker sizeof(*dm_arg), 0xffffffff);
604*cf84ac9aSAndroid Build Coastguard Worker
605*cf84ac9aSAndroid Build Coastguard Worker /* Inaccessible pointer */
606*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, 0);
607*cf84ac9aSAndroid Build Coastguard Worker dm_arg->data_size = sizeof(*dm_arg) + sizeof(struct dm_target_msg);
608*cf84ac9aSAndroid Build Coastguard Worker dm_arg->data_start = sizeof(*dm_arg);
609*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_TARGET_MSG, dm_arg);
610*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TARGET_MSG, "
611*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
612*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
613*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
614*cf84ac9aSAndroid Build Coastguard Worker "%p"
615*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
616*cf84ac9aSAndroid Build Coastguard Worker "..."
617*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
618*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
619*cf84ac9aSAndroid Build Coastguard Worker sizeof(*dm_arg) + sizeof(struct dm_target_msg),
620*cf84ac9aSAndroid Build Coastguard Worker sizeof(*dm_arg)
621*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
622*cf84ac9aSAndroid Build Coastguard Worker , (char *) dm_arg + sizeof(*dm_arg)
623*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
624*cf84ac9aSAndroid Build Coastguard Worker );
625*cf84ac9aSAndroid Build Coastguard Worker
626*cf84ac9aSAndroid Build Coastguard Worker /* Inaccessible string */
627*cf84ac9aSAndroid Build Coastguard Worker init_s(&dm_arg_msg->ioc, sizeof(*dm_arg_msg),
628*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_target_msg_test, msg));
629*cf84ac9aSAndroid Build Coastguard Worker dm_arg_msg->ioc.data_size = sizeof(*dm_arg_msg) + 1;
630*cf84ac9aSAndroid Build Coastguard Worker dm_arg_msg->msg.sector = (__u64) 0xdeadbeeffacef157ULL;
631*cf84ac9aSAndroid Build Coastguard Worker rc = ioctl(-1, DM_TARGET_MSG, dm_arg_msg);
632*cf84ac9aSAndroid Build Coastguard Worker errstr = sprintrc(rc);
633*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TARGET_MSG, "
634*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
635*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, ",
636*cf84ac9aSAndroid Build Coastguard Worker sizeof(*dm_arg_msg) + 1,
637*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_target_msg_test, msg));
638*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
639*cf84ac9aSAndroid Build Coastguard Worker printf("{sector=%" PRI__u64 ", message=%p}",
640*cf84ac9aSAndroid Build Coastguard Worker (__u64) 0xdeadbeeffacef157ULL,
641*cf84ac9aSAndroid Build Coastguard Worker (char *) dm_arg_msg +
642*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_target_msg_test, msg.message));
643*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
644*cf84ac9aSAndroid Build Coastguard Worker printf("...");
645*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
646*cf84ac9aSAndroid Build Coastguard Worker printf("}) = %s\n", errstr);
647*cf84ac9aSAndroid Build Coastguard Worker
648*cf84ac9aSAndroid Build Coastguard Worker /* Zero-sied string */
649*cf84ac9aSAndroid Build Coastguard Worker init_s(&dm_arg_msg->ioc, sizeof(*dm_arg_msg),
650*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_target_msg_test, msg));
651*cf84ac9aSAndroid Build Coastguard Worker dm_arg_msg->msg.sector = (__u64) 0xdeadbeeffacef157ULL;
652*cf84ac9aSAndroid Build Coastguard Worker rc = ioctl(-1, DM_TARGET_MSG, dm_arg_msg);
653*cf84ac9aSAndroid Build Coastguard Worker errstr = sprintrc(rc);
654*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TARGET_MSG, "
655*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
656*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, ",
657*cf84ac9aSAndroid Build Coastguard Worker sizeof(*dm_arg_msg), offsetof(struct dm_target_msg_test, msg));
658*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
659*cf84ac9aSAndroid Build Coastguard Worker printf("{sector=%" PRI__u64 ", message=\"\"}",
660*cf84ac9aSAndroid Build Coastguard Worker (__u64) 0xdeadbeeffacef157ULL);
661*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
662*cf84ac9aSAndroid Build Coastguard Worker printf("...");
663*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
664*cf84ac9aSAndroid Build Coastguard Worker printf("}) = %s\n", errstr);
665*cf84ac9aSAndroid Build Coastguard Worker
666*cf84ac9aSAndroid Build Coastguard Worker
667*cf84ac9aSAndroid Build Coastguard Worker /* DM_DEV_SET_GEOMETRY */
668*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
669*cf84ac9aSAndroid Build Coastguard Worker strcpy(s.u.string, "10 20 30 40");
670*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_DEV_SET_GEOMETRY, &s);
671*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_DEV_SET_GEOMETRY, "
672*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%u, data_start=%u, "
673*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", flags=0, "
674*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
675*cf84ac9aSAndroid Build Coastguard Worker "string=\"10 20 30 \"..."
676*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
677*cf84ac9aSAndroid Build Coastguard Worker "..."
678*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
679*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
680*cf84ac9aSAndroid Build Coastguard Worker s.ioc.data_size, s.ioc.data_start);
681*cf84ac9aSAndroid Build Coastguard Worker
682*cf84ac9aSAndroid Build Coastguard Worker
683*cf84ac9aSAndroid Build Coastguard Worker /* DM_DEV_RENAME */
684*cf84ac9aSAndroid Build Coastguard Worker /* Inaccessible data */
685*cf84ac9aSAndroid Build Coastguard Worker init_s(dm_arg, min_sizeof_dm_ioctl, min_sizeof_dm_ioctl);
686*cf84ac9aSAndroid Build Coastguard Worker dm_arg->data_size = sizeof(*dm_arg);
687*cf84ac9aSAndroid Build Coastguard Worker memcpy(unaligned_dm_arg, dm_arg, offsetof(struct dm_ioctl, data));
688*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_DEV_RENAME, unaligned_dm_arg);
689*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_DEV_RENAME, "
690*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%zu, data_start=%zu, "
691*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", event_nr=0, "
692*cf84ac9aSAndroid Build Coastguard Worker "flags=0, "
693*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
694*cf84ac9aSAndroid Build Coastguard Worker "string=%p"
695*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
696*cf84ac9aSAndroid Build Coastguard Worker "..."
697*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
698*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
699*cf84ac9aSAndroid Build Coastguard Worker sizeof(*unaligned_dm_arg), min_sizeof_dm_ioctl
700*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
701*cf84ac9aSAndroid Build Coastguard Worker , (char *) unaligned_dm_arg + min_sizeof_dm_ioctl
702*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
703*cf84ac9aSAndroid Build Coastguard Worker );
704*cf84ac9aSAndroid Build Coastguard Worker
705*cf84ac9aSAndroid Build Coastguard Worker /* Incorrect data_start data */
706*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
707*cf84ac9aSAndroid Build Coastguard Worker s.ioc.data_start = 0xdeadbeef;
708*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_DEV_RENAME, &s);
709*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_DEV_RENAME, "
710*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%u, data_start=3735928559, "
711*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", event_nr=0, "
712*cf84ac9aSAndroid Build Coastguard Worker "flags=0, "
713*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
714*cf84ac9aSAndroid Build Coastguard Worker "??? /* misplaced string */"
715*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
716*cf84ac9aSAndroid Build Coastguard Worker "..."
717*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
718*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
719*cf84ac9aSAndroid Build Coastguard Worker s.ioc.data_size);
720*cf84ac9aSAndroid Build Coastguard Worker
721*cf84ac9aSAndroid Build Coastguard Worker /* Strange but still valid data_start */
722*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
723*cf84ac9aSAndroid Build Coastguard Worker /* Curiously, this is a valid structure */
724*cf84ac9aSAndroid Build Coastguard Worker s.ioc.data_start = offsetof(struct dm_ioctl, name) + 1;
725*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_DEV_RENAME, &s);
726*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_DEV_RENAME, "
727*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%u, data_start=%zu, "
728*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", event_nr=0, "
729*cf84ac9aSAndroid Build Coastguard Worker "flags=0, "
730*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
731*cf84ac9aSAndroid Build Coastguard Worker "string=\"nn\""
732*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
733*cf84ac9aSAndroid Build Coastguard Worker "..."
734*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
735*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
736*cf84ac9aSAndroid Build Coastguard Worker s.ioc.data_size,
737*cf84ac9aSAndroid Build Coastguard Worker offsetof(struct dm_ioctl, name) + 1);
738*cf84ac9aSAndroid Build Coastguard Worker
739*cf84ac9aSAndroid Build Coastguard Worker /* Correct data */
740*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
741*cf84ac9aSAndroid Build Coastguard Worker strcpy(s.u.string, "new long name");
742*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_DEV_RENAME, &s);
743*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_DEV_RENAME, "
744*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%u, data_start=%u, "
745*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", event_nr=0, "
746*cf84ac9aSAndroid Build Coastguard Worker "flags=0, "
747*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
748*cf84ac9aSAndroid Build Coastguard Worker "string=\"new long \"..."
749*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
750*cf84ac9aSAndroid Build Coastguard Worker "..."
751*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
752*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
753*cf84ac9aSAndroid Build Coastguard Worker s.ioc.data_size, s.ioc.data_start);
754*cf84ac9aSAndroid Build Coastguard Worker
755*cf84ac9aSAndroid Build Coastguard Worker
756*cf84ac9aSAndroid Build Coastguard Worker /* DM_TABLE_LOAD */
757*cf84ac9aSAndroid Build Coastguard Worker init_s(&s.ioc, sizeof(s), offsetof(struct s, u));
758*cf84ac9aSAndroid Build Coastguard Worker s.ioc.target_count = -1U;
759*cf84ac9aSAndroid Build Coastguard Worker ioctl(-1, DM_TABLE_LOAD, &s);
760*cf84ac9aSAndroid Build Coastguard Worker printf("ioctl(-1, DM_TABLE_LOAD, "
761*cf84ac9aSAndroid Build Coastguard Worker "{version=4.1.2, data_size=%u, data_start=%u, "
762*cf84ac9aSAndroid Build Coastguard Worker "dev=makedev(18, 52), name=\"nnn\", uuid=\"uuu\", "
763*cf84ac9aSAndroid Build Coastguard Worker "target_count=4294967295, flags=0, "
764*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
765*cf84ac9aSAndroid Build Coastguard Worker "{sector_start=0, length=0, target_type=\"\", string=\"\"}"
766*cf84ac9aSAndroid Build Coastguard Worker ", ??? /* misplaced struct dm_target_spec */"
767*cf84ac9aSAndroid Build Coastguard Worker # else
768*cf84ac9aSAndroid Build Coastguard Worker "..."
769*cf84ac9aSAndroid Build Coastguard Worker # endif /* VERBOSE */
770*cf84ac9aSAndroid Build Coastguard Worker "}) = -1 EBADF (%m)\n",
771*cf84ac9aSAndroid Build Coastguard Worker s.ioc.data_size, s.ioc.data_start);
772*cf84ac9aSAndroid Build Coastguard Worker
773*cf84ac9aSAndroid Build Coastguard Worker puts("+++ exited with 0 +++");
774*cf84ac9aSAndroid Build Coastguard Worker return 0;
775*cf84ac9aSAndroid Build Coastguard Worker }
776*cf84ac9aSAndroid Build Coastguard Worker
777*cf84ac9aSAndroid Build Coastguard Worker #else /* !HAVE_LINUX_DM_IOCTL_H */
778*cf84ac9aSAndroid Build Coastguard Worker
779*cf84ac9aSAndroid Build Coastguard Worker SKIP_MAIN_UNDEFINED("HAVE_LINUX_DM_IOCTL_H")
780*cf84ac9aSAndroid Build Coastguard Worker
781*cf84ac9aSAndroid Build Coastguard Worker #endif /* HAVE_LINUX_DM_IOCTL_H */
782