Home | History | Annotate | Download | only in tests-mx32
      1 /*
      2  * Check decoding of keyctl syscall.
      3  *
      4  * Copyright (c) 2016 Eugene Syromyatnikov <evgsyr (at) 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
    821