From f3d7a07667c864c8fd3a963724971ac16ee1a40c Mon Sep 17 00:00:00 2001 From: David Smith Date: Tue, 29 Apr 2014 15:56:12 -0500 Subject: [PATCH] PR16716 partial fix: Fix types in syscall.{open,openat}. * tapset/linux/syscalls2.stp: Fixed types in syscall.{open,openat}. * tapset/linux/nd_syscalls2.stp: Ditto. * testsuite/systemtap.syscall/openclose.c: Added tests. --- tapset/linux/nd_syscalls2.stp | 15 ++++++++------- tapset/linux/syscalls2.stp | 18 +++++++++--------- testsuite/systemtap.syscall/openclose.c | 12 ++++++++++++ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/tapset/linux/nd_syscalls2.stp b/tapset/linux/nd_syscalls2.stp index be7dd7ebc..6e5c926fb 100644 --- a/tapset/linux/nd_syscalls2.stp +++ b/tapset/linux/nd_syscalls2.stp @@ -125,13 +125,14 @@ probe nd_syscall.open = kprobe.function("compat_sys_open") ?, asmlinkage() filename = user_string_quoted(pointer_arg(1)) flags = int_arg(2) - mode = int_arg(3) - if (flags & 64) - argstr = sprintf("%s, %s, %#o", user_string_quoted(pointer_arg(1)), - _sys_open_flag_str(flags), mode) + mode = uint_arg(3) + if (flags & %{ O_CREAT %}) + argstr = sprintf("%s, %s, %#o", + user_string_quoted(pointer_arg(1)), + _sys_open_flag_str(flags), mode) else argstr = sprintf("%s, %s", user_string_quoted(pointer_arg(1)), - _sys_open_flag_str(flags)) + _sys_open_flag_str(flags)) } probe nd_syscall.open.return = kprobe.function("compat_sys_open").return ?, kprobe.function("sys32_open").return ?, @@ -155,8 +156,8 @@ probe nd_syscall.openat = kprobe.function("compat_sys_openat") ?, dfd_str = _dfd_str(dfd) filename = user_string_quoted(pointer_arg(2)) flags = int_arg(3) - mode = int_arg(4) - if (flags & 64) + mode = uint_arg(4) + if (flags & %{ O_CREAT %}) argstr = sprintf("%s, %s, %s, %#o", _dfd_str(dfd), user_string_quoted(pointer_arg(2)), _sys_open_flag_str(flags), mode) diff --git a/tapset/linux/syscalls2.stp b/tapset/linux/syscalls2.stp index cdc2ed8f8..b25c80098 100644 --- a/tapset/linux/syscalls2.stp +++ b/tapset/linux/syscalls2.stp @@ -124,13 +124,13 @@ probe syscall.open = __syscall.compat_open ?, __syscall.open { @__syscall_compat_gate(%{ __NR_open %}, %{ __NR_compat_open %}) name = "open" - flags = $flags - if ($flags & 64) + flags = __int32($flags) + if ($flags & %{ O_CREAT %}) argstr = sprintf("%s, %s, %#o", filename, - _sys_open_flag_str($flags), mode) + _sys_open_flag_str(__int32($flags)), mode) else argstr = sprintf("%s, %s", filename, - _sys_open_flag_str($flags)) + _sys_open_flag_str(__int32($flags))) } probe __syscall.compat_open = kernel.function("compat_sys_open").call ?, kernel.function("sys32_open").call ? @@ -138,12 +138,12 @@ probe __syscall.compat_open = kernel.function("compat_sys_open").call ?, // On some platforms, $filename and $mode are longs on the // kernel side. Truncate these down to 32 bits. filename = user_string_quoted(__uint32($filename)) - mode = __int32($mode) + mode = __uint32($mode) } probe __syscall.open = kernel.function("sys_open").call { filename = user_string_quoted($filename) - mode = $mode + mode = __uint32($mode) } probe syscall.open.return = kernel.function("compat_sys_open").return ?, kernel.function("sys32_open").return ?, @@ -166,11 +166,11 @@ probe syscall.openat = kernel.function("compat_sys_openat").call ?, dfd_str = _dfd_str(__int32($dfd)) filename = user_string_quoted($filename) flags = $flags - mode = __int32($mode) - if ($flags & 64) + mode = __uint32($mode) + if ($flags & %{ O_CREAT %}) argstr = sprintf("%s, %s, %s, %#o", _dfd_str(__int32($dfd)), user_string_quoted($filename), - _sys_open_flag_str($flags), __int32($mode)) + _sys_open_flag_str($flags), __uint32($mode)) else argstr = sprintf("%s, %s, %s", _dfd_str(__int32($dfd)), user_string_quoted($filename), diff --git a/testsuite/systemtap.syscall/openclose.c b/testsuite/systemtap.syscall/openclose.c index 0da23c6e3..751f4c8c3 100644 --- a/testsuite/systemtap.syscall/openclose.c +++ b/testsuite/systemtap.syscall/openclose.c @@ -150,9 +150,21 @@ int main() open("foobarX", -1, S_IRWXU); //staptest// open ("foobarX", O_[^ ]+|XXXX, 0700) = + fd1 = open("foobarY", O_WRONLY|O_CREAT, -1); + //staptest// open ("foobarY", O_WRONLY|O_CREAT[[[[|O_LARGEFILE]]]]?, 037777777777) = NNNN + + close(fd1); + //staptest// close (NNNN) = 0 + #if GLIBC_SUPPORT openat(AT_FDCWD, "foobarX", -1, S_IRWXU); //staptest// openat (AT_FDCWD, "foobarX", O_[^ ]+|XXXX, 0700) = + + fd1 = openat(AT_FDCWD, "foobarZ", O_WRONLY|O_CREAT, -1); + //staptest// openat (AT_FDCWD, "foobarZ", O_WRONLY|O_CREAT[[[[|O_LARGEFILE]]]]?, 037777777777) = NNNN + + close(fd1); + //staptest// close (NNNN) = 0 #endif close(-1); -- 2.43.5