]> granicus.if.org Git - strace/blob - tests/keyctl.c
tests: use fixed timestamps in utime related tests
[strace] / tests / keyctl.c
1 /*
2  * Check decoding of keyctl syscall.
3  *
4  * Copyright (c) 2016 Eugene Syromyatnikov <evgsyr@gmail.com>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include "tests.h"
31
32 #include <asm/unistd.h>
33
34 #ifdef __NR_keyctl
35
36 # include <linux/types.h>
37 # include <linux/keyctl.h>
38
39 # include <errno.h>
40 # include <inttypes.h>
41 # include <stdarg.h>
42 # include <stdbool.h>
43 # include <stdio.h>
44 # include <stdlib.h>
45 # include <string.h>
46 # include <unistd.h>
47 # include <sys/uio.h>
48
49 /* This check should be before #include "xlat/keyctl_commands.h" */
50 # ifndef KEYCTL_DH_COMPUTE
51 struct keyctl_dh_params {
52         int32_t private;
53         int32_t prime;
54         int32_t base;
55 };
56 # endif
57
58 # include "xlat.h"
59 # include "xlat/keyctl_commands.h"
60
61 # ifndef KEY_SPEC_REQKEY_AUTH_KEY
62 #  define KEY_SPEC_REQKEY_AUTH_KEY   -7
63 # endif
64
65 # ifndef KEY_SPEC_REQUESTOR_KEYRING
66 #  define KEY_SPEC_REQUESTOR_KEYRING -8
67 # endif
68
69 static const size_t limit = 10;
70
71 /*
72  * Well, this is true for DESCRIBE and GET_SECURITY, and false for READ and
73  * DH_COMPUTE and I see no ability to pass this information without
74  * significantly breaking interface.
75  */
76 bool nul_terminated_buf = true;
77 bool buf_in_arg = false;
78
79 /*
80  * When this is called with positive size, the buffer provided is an "out"
81  * argument and rc contains resulting size (globally defined nul_terminated_buf
82  * controls whether it is nul-terminated or not). If size is negative,
83  * it contains "in" argument.
84  */
85 void
86 print_quoted_string_limit(const char *str, size_t size, long rc)
87 {
88         size_t print_size = ((rc >= 0) && (size > 0)) ?
89                 ((unsigned long) rc > size ? size :
90                 (unsigned long) rc) : size;
91         size_t limited_size = print_size > limit ? limit : print_size;
92
93         if ((rc == -1) && !buf_in_arg) {
94                 printf("%p", str);
95                 return;
96         }
97
98         if (!nul_terminated_buf ||
99             (strnlen(str, limited_size) == limited_size)) {
100                 printf("\"");
101                 print_quoted_memory(str, limited_size);
102                 if (print_size > limit)
103                         printf("\"...");
104                 else
105                         printf("\"");
106         } else {
107                 printf("\"");
108                 print_quoted_string(str);
109                 printf("\"");
110         }
111 }
112
113 static void
114 print_arg(kernel_ulong_t arg, const char *str, const char *fmt, size_t size,
115         long rc)
116 {
117         if (size == (size_t) -1)
118                 size = 0;
119
120         if (str) {
121                 printf("%s", str);
122         } else {
123                 if (size == sizeof(uint64_t))
124                         printf(fmt, (uint64_t)arg);
125                 else if (size == sizeof(uint32_t))
126                         printf(fmt, (uint32_t)arg);
127                 else
128                         print_quoted_string_limit((void *) (uintptr_t) arg,
129                                                   size, rc);
130         }
131 }
132
133 /*
134  * Arguments are passed as sz, val, str, fmt. Arguments are read until 4
135  * arguments are retrieved or size of 0 is occurred.
136  *
137  * str == NULL && fmt == NULL && sz not in {4, 8} - print_quoted_string_limit is
138  *   used for argument printing. If sz is negative, in argument is assumed, out
139  *   otherwise.
140  */
141 void
142 do_keyctl(kernel_ulong_t cmd, const char *cmd_str, ...)
143 {
144         kernel_ulong_t args[4] = {
145                 (kernel_ulong_t) 0xdeadfee1badc0de5ULL,
146                 (kernel_ulong_t) 0xdeadfee2badc0de6ULL,
147                 (kernel_ulong_t) 0xdeadfee3badc0de7ULL,
148                 (kernel_ulong_t) 0xdeadfee4badc0de8ULL,
149         };
150         const char *arg_str[4] = { NULL };
151         const char *arg_fmt[4] = { "%llu", "%llu", "%llu", "%llu" };
152         size_t arg_sz[4] = {
153                 sizeof(kernel_ulong_t),
154                 sizeof(kernel_ulong_t),
155                 sizeof(kernel_ulong_t),
156                 sizeof(kernel_ulong_t),
157         };
158         unsigned i;
159         unsigned cnt = 0;
160
161         va_list ap;
162
163         va_start(ap, cmd_str);
164
165         do {
166                 arg_sz[cnt] = va_arg(ap, size_t);
167                 if (!arg_sz[cnt])
168                         break;
169
170                 if (arg_sz[cnt] == sizeof(uint64_t))
171                         args[cnt] = va_arg(ap, uint64_t);
172                 else if (arg_sz[cnt] == sizeof(uint32_t))
173                         args[cnt] = va_arg(ap, uint32_t);
174                 else
175                         args[cnt] = (uintptr_t) va_arg(ap, void *);
176
177                 arg_str[cnt] = va_arg(ap, char *);
178                 arg_fmt[cnt] = va_arg(ap, char *);
179         } while (++cnt < 4);
180
181         long rc = syscall(__NR_keyctl, cmd, args[0], args[1], args[2], args[3]);
182         const char *errstr = sprintrc(rc);
183         printf("keyctl(%s", cmd_str);
184         for (i = 0; i < cnt; i++) {
185                 printf(", ");
186                 print_arg(args[i], arg_str[i], arg_fmt[i], arg_sz[i], rc);
187         }
188         printf(") = %s\n", errstr);
189 }
190
191 int
192 main(void)
193 {
194         enum { PR_LIMIT = 10, IOV_SIZE = 11, IOV_STR_SIZE = 4096 };
195
196         static const char *kulong_fmt =
197                 sizeof(kernel_ulong_t) == sizeof(uint64_t) ? "%#llx" : "%#x";
198         static const char *ksize_fmt =
199                 sizeof(kernel_ulong_t) == sizeof(uint64_t) ? "%llu" : "%u";
200         static const char *ptr_fmt =
201                 sizeof(void *) == sizeof(uint64_t) ? "%#llx" : "%#x";
202         static const char unterminated1[] = { '\1', '\2', '\3', '\4', '\5' };
203         static const char unterminated2[] = { '\6', '\7', '\10', '\11', '\12' };
204         static const char short_type_str[] = "shrt type";
205         static const char short_desc_str[] = "shrt desc";
206         static const char long_type_str[] = "overly long key type";
207         static const char long_desc_str[] = "overly long key description";
208         static const int32_t bogus_key1 = 0xdeadf00d;
209         static const int32_t bogus_key2 = 0x1eefdead;
210         static const kernel_ulong_t bogus_key3 =
211                 (kernel_ulong_t) 0xdec0ded1dec0ded2ULL;
212         static const char *bogus_key3_str = "-557785390";
213
214         static const struct keyctl_dh_params kcdhp_data = {
215                 KEY_SPEC_GROUP_KEYRING, 1234567890, 3141592653U };
216         static const char *kcdhp_str = "{private=KEY_SPEC_GROUP_KEYRING, "
217                 "prime=1234567890, base=-1153374643}";
218
219         char *bogus_str = tail_memdup(unterminated1, sizeof(unterminated1));
220         char *bogus_desc = tail_memdup(unterminated2, sizeof(unterminated2));
221         char *short_type = tail_memdup(short_type_str, sizeof(short_type_str));
222         char *short_desc = tail_memdup(short_desc_str, sizeof(short_desc_str));
223         char *long_type = tail_memdup(long_type_str, sizeof(long_type_str));
224         char *long_desc = tail_memdup(long_desc_str, sizeof(long_desc_str));
225         char *kcdhp = tail_memdup(&kcdhp_data, sizeof(kcdhp_data));
226         struct iovec *key_iov = tail_alloc(sizeof(*key_iov) * IOV_SIZE);
227         char *bogus_buf1 = tail_alloc(9);
228         char *bogus_buf2 = tail_alloc(256);
229         char *key_iov_str1;
230         char *key_iov_str2 = tail_alloc(4096);
231         ssize_t ret;
232         ssize_t kis_size = 0;
233         int i;
234
235         key_iov[0].iov_base = short_type;
236         key_iov[0].iov_len = sizeof(short_type_str);
237         key_iov[1].iov_base = long_type;
238         key_iov[1].iov_len = sizeof(long_type_str);
239         key_iov[2].iov_base = short_desc;
240         key_iov[2].iov_len = sizeof(short_desc_str);
241         key_iov[3].iov_base = long_desc;
242         key_iov[3].iov_len = sizeof(long_desc_str);
243         key_iov[4].iov_base = bogus_str;
244         key_iov[4].iov_len = 32;
245
246         for (i = 5; i < IOV_SIZE; i++) {
247                 key_iov[i].iov_base =
248                         (void *) (uintptr_t) (0xfffffacefffff00dULL +
249                         0x100000001ULL * i);
250                 key_iov[i].iov_len = (size_t) (0xcaffeeeddefaced7ULL +
251                         0x100000001ULL * i);
252         }
253
254         ret = asprintf(&key_iov_str1, "[{iov_base=%p, iov_len=%zu}, "
255                        "{iov_base=%p, iov_len=%zu}, "
256                        "{iov_base=%p, iov_len=%zu}, "
257                        "{iov_base=%p, iov_len=%zu}]",
258                        key_iov[IOV_SIZE - 4].iov_base,
259                        key_iov[IOV_SIZE - 4].iov_len,
260                        key_iov[IOV_SIZE - 3].iov_base,
261                        key_iov[IOV_SIZE - 3].iov_len,
262                        key_iov[IOV_SIZE - 2].iov_base,
263                        key_iov[IOV_SIZE - 2].iov_len,
264                        key_iov[IOV_SIZE - 1].iov_base,
265                        key_iov[IOV_SIZE - 1].iov_len);
266
267         if (ret < 0)
268                 error_msg_and_fail("asprintf");
269
270         ret = snprintf(key_iov_str2, IOV_STR_SIZE,
271                        "[{iov_base=\"%s\\0\", iov_len=%zu}, "
272                        "{iov_base=\"%.10s\"..., iov_len=%zu}, "
273                        "{iov_base=\"%s\\0\", iov_len=%zu}, "
274                        "{iov_base=\"%.10s\"..., iov_len=%zu}, ",
275                        (char *) key_iov[0].iov_base, key_iov[0].iov_len,
276                        (char *) key_iov[1].iov_base, key_iov[1].iov_len,
277                        (char *) key_iov[2].iov_base, key_iov[2].iov_len,
278                        (char *) key_iov[3].iov_base, key_iov[3].iov_len);
279
280         if ((ret < 0) || (ret >= IOV_STR_SIZE))
281                 error_msg_and_fail("snprintf");
282
283         for (i = 4; i < PR_LIMIT; i++) {
284                 kis_size += ret;
285
286                 ret = snprintf(key_iov_str2 + kis_size, IOV_STR_SIZE - kis_size,
287                                "{iov_base=%p, iov_len=%zu}, ",
288                                key_iov[i].iov_base, key_iov[i].iov_len);
289
290                 if ((ret < 0) || (ret >= (IOV_STR_SIZE - kis_size)))
291                         error_msg_and_fail("snprintf");
292         }
293
294         kis_size += ret;
295         snprintf(key_iov_str2 + kis_size, IOV_STR_SIZE - kis_size, "...]");
296
297
298         /* Invalid command */
299         do_keyctl((kernel_ulong_t) 0xbadc0dedfacefeedULL,
300                   "0xfacefeed /* KEYCTL_??? */",
301                   sizeof(kernel_ulong_t),
302                   (kernel_ulong_t) 0xdeadfee1badc0de5ULL, NULL, kulong_fmt,
303                   sizeof(kernel_ulong_t),
304                   (kernel_ulong_t) 0xdeadfee2badc0de6ULL, NULL, kulong_fmt,
305                   sizeof(kernel_ulong_t),
306                   (kernel_ulong_t) 0xdeadfee3badc0de7ULL, NULL, kulong_fmt,
307                   sizeof(kernel_ulong_t),
308                   (kernel_ulong_t) 0xdeadfee4badc0de8ULL, NULL, kulong_fmt);
309
310
311         /* GET_KEYRING_ID */
312         do_keyctl(ARG_STR(KEYCTL_GET_KEYRING_ID),
313                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
314                   sizeof(kernel_ulong_t),
315                   (kernel_ulong_t) 0xbadc0dedffffffffLLU, "-1",
316                   NULL, 0UL);
317         do_keyctl(ARG_STR(KEYCTL_GET_KEYRING_ID),
318                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), "%d",
319                   sizeof(int), 3141592653U, NULL, "%d",
320                   NULL, 0UL);
321
322
323         /* KEYCTL_JOIN_SESSION_KEYRING */
324         do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
325                   sizeof(char *), ARG_STR(NULL), NULL, 0UL);
326         do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
327                   sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
328                   0UL);
329         do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
330                   sizeof(char *), bogus_str, NULL, ptr_fmt, 0UL);
331         do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
332                   sizeof(char *), ARG_STR("bogus name"), NULL, 0UL);
333         do_keyctl(ARG_STR(KEYCTL_JOIN_SESSION_KEYRING),
334                   sizeof(char *), "very long keyring name", "\"very long \"...",
335                   NULL, 0UL);
336
337
338         /* KEYCTL_UPDATE */
339
340         buf_in_arg = true;
341
342         do_keyctl(ARG_STR(KEYCTL_UPDATE),
343                   sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
344                   sizeof(char *), ARG_STR(NULL), NULL,
345                   sizeof(kernel_ulong_t),
346                   (kernel_ulong_t) 0, NULL, ksize_fmt, 0UL);
347         do_keyctl(ARG_STR(KEYCTL_UPDATE),
348                   sizeof(int32_t), bogus_key1, NULL, "%d",
349                   sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
350                   sizeof(kernel_ulong_t),
351                   (kernel_ulong_t) 0xdeadfee4badc0de8ULL, NULL, ksize_fmt,
352                   0UL);
353         do_keyctl(ARG_STR(KEYCTL_UPDATE),
354                   sizeof(int32_t), bogus_key2, NULL, "%d",
355                   sizeof(char *), bogus_str, NULL, ptr_fmt,
356                   sizeof(kernel_ulong_t),
357                   (kernel_ulong_t) 0xdeadfee4badc0de8ULL, NULL, ksize_fmt,
358                   0UL);
359         do_keyctl(ARG_STR(KEYCTL_UPDATE),
360                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
361                   sizeof(short_desc_str), short_desc, NULL, NULL,
362                   sizeof(kernel_ulong_t),
363                   (kernel_ulong_t) sizeof(short_desc_str) - 1, NULL,
364                           ksize_fmt,
365                   0UL);
366
367         buf_in_arg = false;
368
369
370         /* KEYCTL_REVOKE */
371         do_keyctl(ARG_STR(KEYCTL_REVOKE),
372                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL, 0UL);
373         do_keyctl(ARG_STR(KEYCTL_REVOKE),
374                   sizeof(int32_t), bogus_key1, NULL, "%d", 0UL);
375         do_keyctl(ARG_STR(KEYCTL_REVOKE),
376                   sizeof(int32_t), bogus_key2, NULL, "%d", 0UL);
377         do_keyctl(ARG_STR(KEYCTL_REVOKE),
378                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
379                   0UL);
380
381
382         /* KEYCTL_CHOWN */
383         do_keyctl(ARG_STR(KEYCTL_CHOWN),
384                   sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
385                   sizeof(uid_t), ARG_STR(-1), NULL,
386                   sizeof(gid_t), ARG_STR(-1), NULL, 0UL);
387         do_keyctl(ARG_STR(KEYCTL_CHOWN),
388                   sizeof(int32_t), bogus_key1, NULL, "%d",
389                   sizeof(uid_t), 2718281828U, NULL, "%u",
390                   sizeof(gid_t), 3141592653U, NULL, "%u", 0UL);
391
392
393         /* KEYCTL_SETPERM */
394         do_keyctl(ARG_STR(KEYCTL_SETPERM),
395                   sizeof(int32_t), ARG_STR(KEY_SPEC_REQKEY_AUTH_KEY), NULL,
396                   sizeof(uint32_t), 0xffffffffU,
397                   "KEY_POS_VIEW|KEY_POS_READ|KEY_POS_WRITE|"
398                   "KEY_POS_SEARCH|KEY_POS_LINK|KEY_POS_SETATTR|"
399                   "KEY_USR_VIEW|KEY_USR_READ|KEY_USR_WRITE|"
400                   "KEY_USR_SEARCH|KEY_USR_LINK|KEY_USR_SETATTR|"
401                   "KEY_GRP_VIEW|KEY_GRP_READ|KEY_GRP_WRITE|"
402                   "KEY_GRP_SEARCH|KEY_GRP_LINK|KEY_GRP_SETATTR|"
403                   "KEY_OTH_VIEW|KEY_OTH_READ|KEY_OTH_WRITE|"
404                   "KEY_OTH_SEARCH|KEY_OTH_LINK|KEY_OTH_SETATTR|"
405                   "0xc0c0c0c0", NULL, 0UL);
406         do_keyctl(ARG_STR(KEYCTL_SETPERM),
407                   sizeof(int32_t), bogus_key1, NULL, "%d",
408                   sizeof(uint32_t), 0, NULL, "%#x", 0UL);
409         do_keyctl(ARG_STR(KEYCTL_SETPERM),
410                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
411                   sizeof(uint32_t), 0xc0c0c0c0, "0xc0c0c0c0 /* KEY_??? */",
412                           NULL,
413                   0UL);
414
415
416         /* KEYCTL_DESCRIBE */
417         do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
418                   sizeof(int32_t), bogus_key1, NULL, "%d",
419                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
420                   sizeof(kernel_ulong_t),
421                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
422                   0UL);
423         do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
424                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
425                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
426                   sizeof(kernel_ulong_t),
427                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
428                   0UL);
429         do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
430                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
431                   (size_t) 9, (uintptr_t) bogus_buf1, NULL, NULL,
432                   sizeof(kernel_ulong_t),
433                   (kernel_ulong_t) 9, NULL, ksize_fmt, 0UL);
434         do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
435                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
436                   (size_t) 256, (uintptr_t) bogus_buf2, NULL, NULL,
437                   sizeof(kernel_ulong_t),
438                   (kernel_ulong_t) 256, NULL, ksize_fmt, 0UL);
439         do_keyctl(ARG_STR(KEYCTL_DESCRIBE),
440                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
441                   (size_t) -4, (uintptr_t) bogus_buf2, NULL, NULL,
442                   sizeof(kernel_ulong_t),
443                   (kernel_ulong_t) -4, NULL, ksize_fmt, 0UL);
444
445
446         /* KEYCTL_CLEAR */
447         do_keyctl(ARG_STR(KEYCTL_CLEAR),
448                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL, 0UL);
449         do_keyctl(ARG_STR(KEYCTL_CLEAR),
450                   sizeof(int32_t), bogus_key1, NULL, "%d", 0UL);
451         do_keyctl(ARG_STR(KEYCTL_CLEAR),
452                   sizeof(int32_t), bogus_key2, NULL, "%d", 0UL);
453         do_keyctl(ARG_STR(KEYCTL_CLEAR),
454                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
455                   0UL);
456
457
458         /* KEYCTL_LINK */
459         do_keyctl(ARG_STR(KEYCTL_LINK),
460                   sizeof(int32_t), bogus_key1, NULL, "%d",
461                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL, 0UL);
462         do_keyctl(ARG_STR(KEYCTL_LINK),
463                   sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
464                   sizeof(int32_t), bogus_key2, NULL, "%d", 0UL);
465         do_keyctl(ARG_STR(KEYCTL_LINK),
466                   sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
467                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
468                   0UL);
469
470
471         /* KEYCTL_UNLINK */
472         do_keyctl(ARG_STR(KEYCTL_UNLINK),
473                   sizeof(int32_t), bogus_key1, NULL, "%d",
474                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
475                   0UL);
476         do_keyctl(ARG_STR(KEYCTL_UNLINK),
477                   sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
478                   sizeof(int32_t), bogus_key2, NULL, "%d", 0UL);
479         do_keyctl(ARG_STR(KEYCTL_UNLINK),
480                   sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
481                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
482                   0UL);
483
484
485         /* KEYCTL_SEARCH */
486         buf_in_arg = true;
487
488         do_keyctl(ARG_STR(KEYCTL_SEARCH),
489                   sizeof(int32_t), ARG_STR(KEY_SPEC_REQUESTOR_KEYRING), NULL,
490                   sizeof(char *), ARG_STR(NULL), NULL,
491                   sizeof(char *), ARG_STR(NULL), NULL,
492                   sizeof(int32_t), 0, NULL, "%d");
493         do_keyctl(ARG_STR(KEYCTL_SEARCH),
494                   sizeof(int32_t), bogus_key1, NULL, "%d",
495                   sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
496                   sizeof(char *), (char *) 0xfffff00dfffff157ULL, NULL, ptr_fmt,
497                   sizeof(int32_t), ARG_STR(KEY_SPEC_USER_SESSION_KEYRING),
498                           NULL);
499         do_keyctl(ARG_STR(KEYCTL_SEARCH),
500                   sizeof(int32_t), bogus_key2, NULL, "%d",
501                   sizeof(char *), bogus_str, NULL, ptr_fmt,
502                   sizeof(char *), bogus_desc, NULL, ptr_fmt,
503                   sizeof(int32_t), bogus_key1, NULL, "%d");
504         do_keyctl(ARG_STR(KEYCTL_SEARCH),
505                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
506                   sizeof(short_type_str), short_type, NULL, NULL,
507                   sizeof(short_desc_str), short_desc, NULL, NULL,
508                   sizeof(int32_t), bogus_key2, NULL, "%d");
509         do_keyctl(ARG_STR(KEYCTL_SEARCH),
510                   sizeof(int32_t), 0, NULL, "%d",
511                   sizeof(long_type_str), long_type, NULL, NULL,
512                   sizeof(long_type_str), long_desc, NULL, NULL,
513                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL);
514
515         buf_in_arg = false;
516
517
518         /* KEYCTL_READ */
519         nul_terminated_buf = false;
520
521         /* Empty result is expected for these */
522         bogus_buf1[0] = '\377';
523         bogus_buf2[0] = '\377';
524
525         do_keyctl(ARG_STR(KEYCTL_READ),
526                   sizeof(int32_t), bogus_key1, NULL, "%d",
527                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
528                   sizeof(kernel_ulong_t),
529                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
530                   0UL);
531         do_keyctl(ARG_STR(KEYCTL_READ),
532                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
533                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
534                   sizeof(kernel_ulong_t),
535                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
536                   0UL);
537         do_keyctl(ARG_STR(KEYCTL_READ),
538                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
539                   (size_t) 9, (uintptr_t) bogus_buf1, NULL, NULL,
540                   sizeof(kernel_ulong_t),
541                   (kernel_ulong_t) 9, NULL, ksize_fmt, 0UL);
542         do_keyctl(ARG_STR(KEYCTL_READ),
543                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
544                   (size_t) 256, (uintptr_t) bogus_buf2, NULL, NULL,
545                   sizeof(kernel_ulong_t),
546                   (kernel_ulong_t) 256, NULL, ksize_fmt, 0UL);
547         do_keyctl(ARG_STR(KEYCTL_READ),
548                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
549                   (size_t) -4, (uintptr_t) bogus_buf2, NULL, NULL,
550                   sizeof(kernel_ulong_t),
551                   (kernel_ulong_t) -4, NULL, ksize_fmt, 0UL);
552
553         nul_terminated_buf = true;
554
555         /* KEYCTL_INSTANTIATE */
556         buf_in_arg = true;
557
558         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
559                   sizeof(int32_t), 0, NULL, "%d",
560                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
561                   sizeof(kernel_ulong_t),
562                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
563                   sizeof(int32_t), 0, NULL, "%d");
564         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
565                   sizeof(int32_t), bogus_key1, NULL, "%d",
566                   sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
567                   sizeof(kernel_ulong_t),
568                   (kernel_ulong_t) 0xdeadfeedLLU, NULL, ksize_fmt,
569                   sizeof(int32_t), bogus_key1, NULL, "%d");
570         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
571                   sizeof(int32_t), bogus_key2, NULL, "%d",
572                   sizeof(char *), bogus_str, NULL, ptr_fmt,
573                   sizeof(kernel_ulong_t),
574                   (kernel_ulong_t) 32LLU, NULL, ksize_fmt,
575                   sizeof(int32_t), bogus_key2, NULL, "%d");
576         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
577                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
578                   sizeof(short_type_str), short_desc, NULL, NULL,
579                   sizeof(kernel_ulong_t),
580                   (kernel_ulong_t) sizeof(short_type_str) - 1, NULL,
581                           ksize_fmt,
582                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL);
583         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE),
584                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
585                   sizeof(long_type_str), long_desc, NULL, NULL,
586                   sizeof(kernel_ulong_t),
587                   (kernel_ulong_t) sizeof(long_type_str), NULL, ksize_fmt,
588                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL);
589
590         buf_in_arg = false;
591
592
593         /* KEYCTL_NEGATE */
594         do_keyctl(ARG_STR(KEYCTL_NEGATE),
595                   sizeof(int32_t), 0, NULL, "%d",
596                   sizeof(uint32_t), 0, NULL, "%u",
597                   sizeof(int32_t), 0, NULL, "%d", 0UL);
598         do_keyctl(ARG_STR(KEYCTL_NEGATE),
599                   sizeof(int32_t), bogus_key1, NULL, "%d",
600                   sizeof(uint32_t), 3141592653U, NULL, "%u",
601                   sizeof(int32_t), bogus_key1, NULL, "%d", 0UL);
602         do_keyctl(ARG_STR(KEYCTL_NEGATE),
603                   sizeof(int32_t), bogus_key2, NULL, "%d",
604                   sizeof(kernel_ulong_t),
605                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661", NULL,
606                   sizeof(int32_t), bogus_key2, NULL, "%d", 0UL);
607         do_keyctl(ARG_STR(KEYCTL_NEGATE),
608                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
609                   sizeof(kernel_ulong_t),
610                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661", NULL,
611                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
612                   0UL);
613
614
615         /* KEYCTL_SET_REQKEY_KEYRING */
616         do_keyctl(ARG_STR(KEYCTL_SET_REQKEY_KEYRING),
617                   sizeof(int32_t), ARG_STR(KEY_REQKEY_DEFL_NO_CHANGE), NULL,
618                   0UL);
619         /*
620          * Keep it commented out until proper way of faking syscalls is not
621          * implemented.
622          */
623         /* do_keyctl(ARG_STR(KEYCTL_SET_REQKEY_KEYRING),
624                   sizeof(int32_t),
625                   ARG_STR(KEY_REQKEY_DEFL_REQUESTOR_KEYRING), NULL, 0UL); */
626         do_keyctl(ARG_STR(KEYCTL_SET_REQKEY_KEYRING),
627                   sizeof(kernel_ulong_t),
628                   (kernel_ulong_t) 0xfeedf157badc0dedLLU,
629                   "0xbadc0ded /* KEY_REQKEY_DEFL_??? */", NULL, 0UL);
630
631
632         /* KEYCTL_SET_TIMEOUT */
633         do_keyctl(ARG_STR(KEYCTL_SET_TIMEOUT),
634                   sizeof(int32_t), 0, NULL, "%d",
635                   sizeof(uint32_t), 0, NULL, "%u", 0UL);
636         do_keyctl(ARG_STR(KEYCTL_SET_TIMEOUT),
637                   sizeof(int32_t), bogus_key1, NULL, "%d",
638                   sizeof(uint32_t), 3141592653U, NULL, "%u", 0UL);
639         do_keyctl(ARG_STR(KEYCTL_SET_TIMEOUT),
640                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
641                   sizeof(kernel_ulong_t),
642                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661", NULL,
643                   0UL);
644
645
646         /* KEYCTL_ASSUME_AUTHORITY */
647         do_keyctl(ARG_STR(KEYCTL_ASSUME_AUTHORITY),
648                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL, 0UL);
649         do_keyctl(ARG_STR(KEYCTL_ASSUME_AUTHORITY),
650                   sizeof(int32_t), bogus_key1, NULL, "%d", 0UL);
651         do_keyctl(ARG_STR(KEYCTL_ASSUME_AUTHORITY),
652                   sizeof(int32_t), bogus_key2, NULL, "%d", 0UL);
653         do_keyctl(ARG_STR(KEYCTL_ASSUME_AUTHORITY),
654                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
655                   0UL);
656
657
658         /* KEYCTL_GET_SECURITY */
659         do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
660                   sizeof(int32_t), bogus_key1, NULL, "%d",
661                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
662                   sizeof(uint32_t), 0xbadc0dedU, NULL, "%u", 0UL);
663         do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
664                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
665                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
666                   sizeof(kernel_ulong_t),
667                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
668                   0UL);
669         do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
670                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
671                   (size_t) 9, (uintptr_t) bogus_buf1, NULL, NULL,
672                   sizeof(kernel_ulong_t),
673                   (kernel_ulong_t) 9, NULL, ksize_fmt, 0UL);
674         do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
675                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
676                   (size_t) 256, (uintptr_t) bogus_buf2, NULL, NULL,
677                   sizeof(kernel_ulong_t),
678                   (kernel_ulong_t) 256, NULL, ksize_fmt, 0UL);
679         do_keyctl(ARG_STR(KEYCTL_GET_SECURITY),
680                   sizeof(int32_t), ARG_STR(KEY_SPEC_THREAD_KEYRING), NULL,
681                   (size_t) -4, (uintptr_t) bogus_buf2, NULL, NULL,
682                   sizeof(kernel_ulong_t),
683                   (kernel_ulong_t) -4, NULL, ksize_fmt, 0UL);
684
685
686         /* KEYCTL_SESSION_TO_PARENT */
687         do_keyctl(ARG_STR(KEYCTL_SESSION_TO_PARENT), 0UL);
688
689
690         /* KEYCTL_REJECT */
691         do_keyctl(ARG_STR(KEYCTL_REJECT),
692                   sizeof(int32_t), 0, NULL, "%d",
693                   sizeof(uint32_t), 0, NULL, "%u",
694                   sizeof(uint32_t), 0, NULL, "%u",
695                   sizeof(int32_t), 0, NULL, "%d");
696         do_keyctl(ARG_STR(KEYCTL_REJECT),
697                   sizeof(int32_t), bogus_key1, NULL, "%d",
698                   sizeof(uint32_t), 3141592653U, NULL, "%u",
699                   sizeof(uint32_t), 2718281828U, NULL, "%u",
700                   sizeof(int32_t), bogus_key1, NULL, "%d");
701         do_keyctl(ARG_STR(KEYCTL_REJECT),
702                   sizeof(int32_t), bogus_key2, NULL, "%d",
703                   sizeof(kernel_ulong_t),
704                   (kernel_ulong_t) 0xdeadca75facef157LLU, "4207866199", NULL,
705                   sizeof(kernel_ulong_t),
706                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661", NULL,
707                   sizeof(int32_t), bogus_key2, NULL, "%d");
708         do_keyctl(ARG_STR(KEYCTL_REJECT),
709                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
710                   sizeof(kernel_ulong_t),
711                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, "3134983661", NULL,
712                   sizeof(uint32_t), ARG_STR(ENODEV), NULL,
713                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL);
714
715
716         /* KEYCTL_INSTANTIATE_IOV */
717         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
718                   sizeof(int32_t), 0, NULL, "%d",
719                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
720                   sizeof(kernel_ulong_t),
721                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
722                   sizeof(int32_t), 0, NULL, "%d");
723         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
724                   sizeof(int32_t), bogus_key1, NULL, "%d",
725                   sizeof(char *), (char *) 0xfffffacefffffeedULL, NULL, ptr_fmt,
726                   sizeof(kernel_ulong_t),
727                   (kernel_ulong_t) 0xdeadfeedLLU, NULL, ksize_fmt,
728                   sizeof(int32_t), bogus_key1, NULL, "%d");
729         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
730                   sizeof(int32_t), bogus_key2, NULL, "%d",
731                   sizeof(char *), key_iov + IOV_SIZE, NULL, ptr_fmt,
732                   sizeof(kernel_ulong_t),
733                   (kernel_ulong_t) 32LLU, NULL, ksize_fmt,
734                   sizeof(int32_t), bogus_key2, NULL, "%d");
735         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
736                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
737                   sizeof(key_iov), key_iov + IOV_SIZE - 4, key_iov_str1, NULL,
738                   sizeof(kernel_ulong_t), (kernel_ulong_t) 4, NULL,
739                           ksize_fmt,
740                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL);
741         do_keyctl(ARG_STR(KEYCTL_INSTANTIATE_IOV),
742                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL,
743                   sizeof(key_iov), key_iov, key_iov_str2, NULL,
744                   sizeof(kernel_ulong_t),
745                   (kernel_ulong_t) IOV_SIZE, NULL, ksize_fmt,
746                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL);
747
748
749         /* KEYCTL_INVALIDATE */
750         do_keyctl(ARG_STR(KEYCTL_INVALIDATE),
751                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL, 0UL);
752         do_keyctl(ARG_STR(KEYCTL_INVALIDATE),
753                   sizeof(int32_t), bogus_key1, NULL, "%d", 0UL);
754         do_keyctl(ARG_STR(KEYCTL_INVALIDATE),
755                   sizeof(int32_t), bogus_key2, NULL, "%d", 0UL);
756         do_keyctl(ARG_STR(KEYCTL_INVALIDATE),
757                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
758                   0UL);
759
760
761         /* KEYCTL_GET_PERSISTENT */
762         do_keyctl(ARG_STR(KEYCTL_GET_PERSISTENT),
763                   sizeof(uid_t), ARG_STR(-1), NULL,
764                   sizeof(int32_t), ARG_STR(KEY_SPEC_GROUP_KEYRING), NULL, 0UL);
765         do_keyctl(ARG_STR(KEYCTL_GET_PERSISTENT),
766                   sizeof(uid_t), 2718281828U, NULL, "%u",
767                   sizeof(int32_t), bogus_key1, NULL, "%d", 0UL);
768         do_keyctl(ARG_STR(KEYCTL_GET_PERSISTENT),
769                   sizeof(uid_t), 2718281828U, NULL, "%u",
770                   sizeof(kernel_ulong_t), bogus_key3, bogus_key3_str, NULL,
771                   0UL);
772
773
774         /* KEYCTL_DH_COMPUTE */
775         nul_terminated_buf = false;
776
777         /* Empty result is expected for these */
778         bogus_buf1[0] = '\377';
779         bogus_buf2[0] = '\377';
780
781         do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
782                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
783                   sizeof(char *), ARG_STR(NULL), ptr_fmt,
784                   sizeof(kernel_ulong_t),
785                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
786                   0UL);
787         do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
788                   sizeof(char *), kcdhp + 1, NULL, ptr_fmt,
789                   sizeof(char *), (char *) 0xfffff157ffffdeadULL, NULL, ptr_fmt,
790                   sizeof(kernel_ulong_t),
791                   (kernel_ulong_t) 0xfeedf157badc0dedLLU, NULL, ksize_fmt,
792                   0UL);
793         do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
794                   sizeof(kcdhp), kcdhp, kcdhp_str, NULL,
795                   (size_t) 9, (uintptr_t) bogus_buf1, NULL, NULL,
796                   sizeof(kernel_ulong_t),
797                   (kernel_ulong_t) 9, NULL, ksize_fmt, 0UL);
798         do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
799                   sizeof(kcdhp), kcdhp, kcdhp_str, NULL,
800                   (size_t) 256, (uintptr_t) bogus_buf2, NULL, NULL,
801                   sizeof(kernel_ulong_t),
802                   (kernel_ulong_t) 256, NULL, ksize_fmt, 0UL);
803         do_keyctl(ARG_STR(KEYCTL_DH_COMPUTE),
804                   sizeof(kcdhp), kcdhp, kcdhp_str, NULL,
805                   (size_t) -1, (uintptr_t) bogus_buf2, NULL, NULL,
806                   sizeof(kernel_ulong_t),
807                   (kernel_ulong_t) -1, NULL, ksize_fmt, 0UL);
808
809         nul_terminated_buf = true;
810
811         puts("+++ exited with 0 +++");
812
813         return 0;
814 }
815
816 #else
817
818 SKIP_MAIN_UNDEFINED("__NR_keyctl");
819
820 #endif