[PATCH 7/8] io: Handle data_size of -1 as unlimited data in print_iovec

2016-09-29 Thread Eugene Syromyatnikov
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

2016-09-29 Thread Eugene Syromyatnikov
* 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

2016-09-29 Thread Eugene Syromyatnikov
* 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

2016-09-29 Thread Eugene Syromyatnikov
* 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

2016-09-29 Thread Eugene Syromyatnikov
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

2016-09-29 Thread Eugene Syromyatnikov
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.

2016-09-29 Thread Eugene Syromyatnikov
* 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

2016-09-29 Thread Eugene Syromyatnikov
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

2016-09-29 Thread Eugene Syromyatnikov
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