2 * Check decoding of add_key syscall.
4 * Copyright (c) 2016 Eugene Syromyatnikov <evgsyr@gmail.com>
5 * Copyright (c) 2016-2019 The strace developers.
8 * SPDX-License-Identifier: GPL-2.0-or-later
16 # include <inttypes.h>
21 print_val_str(const void *ptr, const char *str)
30 do_add_key(const char *type, const char *type_str, const char *desc,
31 const char *desc_str, const char *payload, const char *payload_str,
32 size_t plen, int32_t keyring, const char *keyring_str)
34 long rc = syscall(__NR_add_key, type, desc, payload, plen, keyring);
35 const char *errstr = sprintrc(rc);
37 print_val_str(type, type_str);
38 print_val_str(desc, desc_str);
39 print_val_str(payload, payload_str);
40 printf("%zu, ", plen);
42 printf("%s", keyring_str);
44 printf("%d", keyring);
45 printf(") = %s\n", errstr);
51 static const char unterminated1[] = { '\1', '\2', '\3', '\4', '\5' };
52 static const char unterminated2[] = { '\6', '\7', '\10', '\11', '\12' };
53 static const char unterminated3[] = { '\16', '\17', '\20', '\21', '\22' };
55 char *bogus_type = tail_memdup(unterminated1, sizeof(unterminated1));
56 char *bogus_desc = tail_memdup(unterminated2, sizeof(unterminated2));
57 char *bogus_payload = tail_memdup(unterminated3, sizeof(unterminated3));
69 { bogus_type + sizeof(unterminated1), NULL },
71 { ARG_STR("\20\21\22\23\24") },
80 { bogus_desc + sizeof(unterminated2), NULL },
82 { ARG_STR("\25\26\27\30\31") },
84 { "overly long description", STRINGIFY("overly long ") "..." },
93 { bogus_payload + sizeof(unterminated3), NULL,
94 (size_t) 0xdeadbeefbadc0dedULL },
95 { bogus_payload, STRINGIFY(""), 0 },
96 { bogus_payload, STRINGIFY("\16\17\20\21\22"), 5 },
97 { bogus_payload, NULL, 10 },
98 { "overly long payload", STRINGIFY("overly long ") "...", 15 },
106 { ARG_STR(1234567890) },
107 { ARG_STR(-1234567890) },
108 { -1, "KEY_SPEC_THREAD_KEYRING" },
111 for (i = 0; i < ARRAY_SIZE(types); i++)
112 for (j = 0; j < ARRAY_SIZE(descs); j++)
113 for (k = 0; k < ARRAY_SIZE(payloads); k++)
114 for (l = 0; l < ARRAY_SIZE(keyrings); l++)
115 do_add_key(types[i].type, types[i].str,
116 descs[j].desc, descs[j].str,
123 puts("+++ exited with 0 +++");
130 SKIP_MAIN_UNDEFINED("__NR_add_key");