[PATCH 7/8] io: Handle data_size of -1 as unlimited data in print_iovec
Otherwise it can be depleted and print_iovec starts printing empty strings. * io.c (print_iovec): Interpret c->data_size of -1 as unlimited data and do not decrease it in this case. --- io.c |6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/io.c b/io.c index 907f9d2..eb17524 100644 --- a/io.c +++ b/io.c @@ -85,13 +85,15 @@ print_iovec(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data) case IOV_DECODE_STR: if (len > c->data_size) len = c->data_size; - c->data_size -= len; + if (c->data_size != (unsigned long)-1L) + c->data_size -= len; printstr(tcp, iov[0], len); break; case IOV_DECODE_NETLINK: if (len > c->data_size) len = c->data_size; - c->data_size -= len; + if (c->data_size != (unsigned long)-1L) + c->data_size -= len; decode_netlink(tcp, iov[0], iov[1]); break; default: -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 8/8] tests: Add add_key, keyctl, request_key tests
* tests/Makefile.am (DECODER_TESTS): Add add_key.test, keyctl.test, request_key.test. (check_PROGRAMS): Add add_key, keyctl, request_key. * tests/.gitignore: Likewise. * tests/add_key.c: New file. * tests/add_key.test: Likewise. * tests/keyctl.c: Likewise. * tests/keyctl.test: Likewise. * tests/request_key.c: Likewise. * tests/request_key.test: Likewise. --- tests/.gitignore |3 + tests/Makefile.am |6 + tests/add_key.c| 128 + tests/add_key.test |6 + tests/keyctl.c | 713 tests/keyctl.test |6 + tests/request_key.c| 124 + tests/request_key.test |6 + 8 files changed, 992 insertions(+) create mode 100644 tests/add_key.c create mode 100755 tests/add_key.test create mode 100644 tests/keyctl.c create mode 100755 tests/keyctl.test create mode 100644 tests/request_key.c create mode 100755 tests/request_key.test diff --git a/tests/.gitignore b/tests/.gitignore index 9ee036b..5b33416 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -10,6 +10,7 @@ accept accept4 access acct +addkey adjtimex aio alarm @@ -117,6 +118,7 @@ ipc_msg ipc_msgbuf ipc_sem ipc_shm +keyctl kill ksysent ksysent.h @@ -208,6 +210,7 @@ remap_file_pages rename renameat renameat2 +request_key restart_syscall rmdir rt_sigpending diff --git a/tests/Makefile.am b/tests/Makefile.am index 86672fc..0c24969 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -69,6 +69,7 @@ check_PROGRAMS = \ accept4 \ access \ acct \ + add_key \ adjtimex \ aio \ alarm \ @@ -176,6 +177,7 @@ check_PROGRAMS = \ ipc_msgbuf \ ipc_sem \ ipc_shm \ + keyctl \ kill \ ksysent \ lchown \ @@ -265,6 +267,7 @@ check_PROGRAMS = \ rename \ renameat \ renameat2 \ + request_key \ restart_syscall \ rmdir \ rt_sigpending \ @@ -414,6 +417,7 @@ DECODER_TESTS = \ accept4.test \ access.test \ acct.test \ + add_key.test \ adjtimex.test \ aio.test \ alarm.test \ @@ -518,6 +522,7 @@ DECODER_TESTS = \ ipc_msgbuf.test \ ipc_sem.test \ ipc_shm.test \ + keyctl.test \ kill.test \ lchown.test \ lchown32.test \ @@ -601,6 +606,7 @@ DECODER_TESTS = \ rename.test \ renameat.test \ renameat2.test \ + request_key.test \ rmdir.test \ rt_sigpending.test \ rt_sigprocmask.test \ diff --git a/tests/add_key.c b/tests/add_key.c new file mode 100644 index 000..0773823 --- /dev/null +++ b/tests/add_key.c @@ -0,0 +1,128 @@ +#include "tests.h" + +#include + +#ifdef __NR_add_key + +# include +# include +# include + +void +print_val_str(const void *ptr, const char *str) +{ + if (str) + printf("%s, ", str); + else + printf("%p, ", ptr); +} + +void +do_add_key(const char *type, const char *type_str, const char *desc, + const char *desc_str, const char *payload, const char *payload_str, + size_t plen, int32_t keyring, const char *keyring_str) +{ + long rc; + + rc = syscall(__NR_add_key, type, desc, payload, plen, keyring); + printf("add_key("); + print_val_str(type, type_str); + print_val_str(desc, desc_str); + print_val_str(payload, payload_str); + printf("%zu, ", plen); + if (keyring_str) + printf("%s", keyring_str); + else + printf("%d", keyring); + printf(") = %s\n", sprintrc(rc)); +} + +# define _STR(_arg) #_arg +# define ARG_STR(_arg) (_arg), #_arg + +int +main(void) +{ + static const char unterminated1[] = { '\1', '\2', '\3', '\4', '\5' }; + static const char unterminated2[] = { '\6', '\7', '\10', '\11', '\12' }; + static const char unterminated3[] = + { '\16', '\17', '\20', '\21', '\22' }; + + char *bogus_type = tail_memdup(unterminated1, sizeof(unterminated1)); + char *bogus_desc = tail_memdup(unterminated2, sizeof(unterminated2)); + char *bogus_payload = tail_memdup(unterminated3, sizeof(unterminated3)); + + unsigned i; + unsigned j; + unsigned k; + unsigned l; + + struct { + const char *type; + const char *str; + } types[] = { + { ARG_STR(NULL) }, + { (const char *) 0xfee1fbadULL, NULL }, + { bogus_type, NULL }, + { ARG_STR("\20\21\22\23\24") }, + { ARG_STR("user") }, + }; + + struct { + const char *desc; + const char *str; + } descs[] = { + { ARG_STR(NULL) }, + { (const char *) 0xf00dfca7ULL, NULL }, + { bogus_desc, NULL }, + { ARG_STR("\25\26\27\30\31") }, + {
[PATCH 5/8] keyctl: Print errno name in KEYCTL_REJECT in case it is available
* keyctl.c (keyctl_reject_key): Get errno string via err_name and print it if it is not NULL. --- keyctl.c | 10 +- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/keyctl.c b/keyctl.c index c9081b7..1fb1da5 100644 --- a/keyctl.c +++ b/keyctl.c @@ -175,8 +175,16 @@ static void keyctl_reject_key(struct tcb *tcp, key_serial_t id1, unsigned timeout, unsigned error, key_serial_t id2) { + const char *err_str = err_name(error); + print_keyring_serial_number(id1); - tprintf(", %u, %u, ", timeout, error); + tprintf(", %u, ", timeout); + + if (err_str) + tprintf("%s, ", err_str); + else + tprintf("%u, ", error); + print_keyring_serial_number(id2); } -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 6/8] keyctl: Add support for KEYCTL_DH_COMPUTE
* keyctl.c (struct keyctl_dh_params): New structure. (print_dh_params): New function. (keyctl_dh_compute): New function. (SYS_FUNC(keyctl)): Add support for KEYCTL_DH_COMPUTE cmd value. --- keyctl.c | 46 ++ 1 file changed, 46 insertions(+) diff --git a/keyctl.c b/keyctl.c index 1fb1da5..0a9953e 100644 --- a/keyctl.c +++ b/keyctl.c @@ -31,6 +31,12 @@ typedef int32_t key_serial_t; #include "xlat/key_spec.h" +struct keyctl_dh_params { + int32_t private; + int32_t prime; + int32_t base; +}; + static void print_keyring_serial_number(key_serial_t id) { @@ -213,6 +219,41 @@ keyctl_setperm_key(struct tcb *tcp, key_serial_t id, uint32_t perm) printflags(key_perms, perm, "KEY_???"); } +static void +print_dh_params(struct tcb *tcp, long addr) +{ + struct keyctl_dh_params params; + + if (umove_or_printaddr(tcp, addr, )) + return; + + tprints("{private="); + print_keyring_serial_number(params.private); + tprints(", prime="); + print_keyring_serial_number(params.prime); + tprints(", base="); + print_keyring_serial_number(params.base); + tprints("}"); +} + +static void +keyctl_dh_compute(struct tcb *tcp, long params, long buf, long len) +{ + if (entering(tcp)) { + print_dh_params(tcp, params); + tprints(", "); + } else { + if (syserror(tcp)) + printaddr(buf); + else { + long rval = tcp->u_rval > len ? + len : (tcp->u_rval ? -1 : 0); + printstr(tcp, buf, rval); + } + tprintf(", %lu", len); + } +} + #include "xlat/key_reqkeys.h" #include "xlat/keyctl_commands.h" @@ -314,6 +355,11 @@ SYS_FUNC(keyctl) keyctl_get_persistent(tcp, tcp->u_arg[1], tcp->u_arg[2]); break; + case KEYCTL_DH_COMPUTE: + keyctl_dh_compute(tcp, tcp->u_arg[1], tcp->u_arg[2], + tcp->u_arg[3]); + return 0; + default: tprintf("%#llx, %#llx, %#llx, %#llx", getarg_ull(tcp, 1), getarg_ull(tcp, 2), -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 3/8] keyctl: Do not print comma for KEYCTL_SESSION_TO_PARENT command
Since this command doesn't have any additional arguments, the comma does not needed. Since this is the only command which lacks additional arguments, it's better to add special case for it rather than add printing of comma to all other commands. * keyctl.c (SYS_FUNC(keyctl)): Add check for command not being KEYCTL_SESSION_TO_PARENT when printing comma dividing cmd argument from the rest. --- keyctl.c |8 +++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/keyctl.c b/keyctl.c index a0bbbd0..c9081b7 100644 --- a/keyctl.c +++ b/keyctl.c @@ -214,7 +214,13 @@ SYS_FUNC(keyctl) if (entering(tcp)) { printxval(keyctl_commands, cmd, "KEYCTL_???"); - tprints(", "); + + /* +* For now, KEYCTL_SESSION_TO_PARENT is the only cmd without +* arguments. +*/ + if (cmd != KEYCTL_SESSION_TO_PARENT) + tprints(", "); } switch (cmd) { -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 2/8] keyctl: Use getarg_ull for printing generic arguments
Otherwise it is erroneous on x32, for example. * keyctl.c (SYS_FUNC(keyctl)): Use "%#llx" conversion specifier and getarg_ull for fallback argument printing. --- keyctl.c |6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyctl.c b/keyctl.c index ecb3e79..a0bbbd0 100644 --- a/keyctl.c +++ b/keyctl.c @@ -301,9 +301,9 @@ SYS_FUNC(keyctl) break; default: - tprintf("%#lx, %#lx, %#lx, %#lx", - tcp->u_arg[1], tcp->u_arg[2], - tcp->u_arg[3], tcp->u_arg[4]); + tprintf("%#llx, %#llx, %#llx, %#llx", + getarg_ull(tcp, 1), getarg_ull(tcp, 2), + getarg_ull(tcp, 3), getarg_ull(tcp, 4)); break; } -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 4/8] Add function for getting errno string.
* syscall.c (err_name): New function. * defs.h: Add declaration of err_name(). --- defs.h|1 + syscall.c |9 + 2 files changed, 10 insertions(+) diff --git a/defs.h b/defs.h index ffea23f..1e2363b 100644 --- a/defs.h +++ b/defs.h @@ -457,6 +457,7 @@ extern void clear_regs(void); extern void get_regs(pid_t pid); extern int get_scno(struct tcb *tcp); extern const char *syscall_name(long scno); +const char *err_name(unsigned err); extern bool is_erestart(struct tcb *); extern void temporarily_clear_syserror(struct tcb *); diff --git a/syscall.c b/syscall.c index f649a90..ee2d8cc 100644 --- a/syscall.c +++ b/syscall.c @@ -765,6 +765,15 @@ syscall_name(long scno) } } +const char * +err_name(unsigned err) +{ + if ((err < nerrnos) && errnoent[err]) + return errnoent[err]; + + return NULL; +} + static long get_regs_error; void -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 1/8] keyctl: Use printuid for printing UID/GID
UID/GID are unsigned except special -1 value (which is also special in context of specific keyctl commands), so special printing function should be used. * keyctl.c (keyctl_chown_key): Use printuid instead of printf with "%d" conversion for printing UID/GID. (keyctl_get_persistent): Likewise. --- keyctl.c |6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/keyctl.c b/keyctl.c index 456649e..ecb3e79 100644 --- a/keyctl.c +++ b/keyctl.c @@ -136,7 +136,8 @@ static void keyctl_chown_key(struct tcb *tcp, key_serial_t id, int user, int group) { print_keyring_serial_number(id); - tprintf(", %d, %d", user, group); + printuid(", ", user); + printuid(", ", group); } static void @@ -189,7 +190,8 @@ keyctl_set_timeout(struct tcb *tcp, key_serial_t id, unsigned timeout) static void keyctl_get_persistent(struct tcb *tcp, int uid, key_serial_t id) { - tprintf("%d, ", uid); + printuid("", uid); + tprintf(", "); print_keyring_serial_number(id); } -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel
[PATCH 0/8] keyctl tests
Hello. This patchset provides minor updates to decoders in keyctl.c along with tests for add_key, keyctl, and request_key syscall decoders. Eugene Syromyatnikov (8): keyctl: Use printuid for printing UID/GID keyctl: Use getarg_ull for printing generic arguments keyctl: Do not print comma for KEYCTL_SESSION_TO_PARENT command Add function for getting errno string. keyctl: Print errno name in KEYCTL_REJECT in case it is available keyctl: Add support for KEYCTL_DH_COMPUTE io: Handle data_size of -1 as unlimited data in print_iovec tests: Add add_key, keyctl, request_key tests defs.h |1 + io.c |6 +- keyctl.c | 76 +- syscall.c |9 + tests/.gitignore |3 + tests/Makefile.am |6 + tests/add_key.c| 128 + tests/add_key.test |6 + tests/keyctl.c | 713 tests/keyctl.test |6 + tests/request_key.c| 124 + tests/request_key.test |6 + 12 files changed, 1075 insertions(+), 9 deletions(-) create mode 100644 tests/add_key.c create mode 100755 tests/add_key.test create mode 100644 tests/keyctl.c create mode 100755 tests/keyctl.test create mode 100644 tests/request_key.c create mode 100755 tests/request_key.test -- 1.7.10.4 -- ___ Strace-devel mailing list Strace-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/strace-devel