]> sourceware.org Git - systemtap.git/commitdiff
Added rename()/renameat() testcase and prevent more syscall nesting.
authorDavid Smith <dsmith@redhat.com>
Wed, 12 Feb 2014 20:53:21 +0000 (14:53 -0600)
committerDavid Smith <dsmith@redhat.com>
Wed, 12 Feb 2014 20:53:21 +0000 (14:53 -0600)
* testsuite/systemtap.syscall/rename.c: New testcase for rename() and
  renameat().
* tapset/linux/syscalls2.stp: Prevent syscall nesting in syscall.open,
  and syscall.renameat.
* tapset/linux/nd_syscalls2.stp: Ditto.
* tapset/linux/syscalls.stp: Prevent syscall nesting in syscall.mkdirat.
* tapset/linux/nd_syscalls.stp: Ditto.
* runtime/linux/compat_unistd.h: Add __NR_compat defines.

runtime/linux/compat_unistd.h
tapset/linux/nd_syscalls.stp
tapset/linux/nd_syscalls2.stp
tapset/linux/syscalls.stp
tapset/linux/syscalls2.stp
testsuite/systemtap.syscall/rename.c [new file with mode: 0644]

index bfb3e6fc6b3cecbfc6c5f88470197495f87ee579..2fc7c7abaf8250e9709092fddc7cb82d43a43c22 100644 (file)
 #ifndef __NR_ia32_linkat
 #define __NR_ia32_linkat 303
 #endif
+#ifndef __NR_ia32_mkdirat
+#define __NR_ia32_mkdirat 296
+#endif
+#ifndef __NR_ia32_open
+#define __NR_ia32_open 5
+#endif
 #ifndef __NR_ia32_pipe2
 #define __NR_ia32_pipe2 331
 #endif
 #ifndef __NR_ia32_readlinkat
 #define __NR_ia32_readlinkat 305
 #endif
+#ifndef __NR_ia32_renameat
+#define __NR_ia32_renameat 302
+#endif
 #ifndef __NR_ia32_rt_sigprocmask
 #define __NR_ia32_rt_sigprocmask 175
 #endif
 #define __NR_compat_getpgid            __NR_ia32_getpgid
 #define __NR_compat_inotify_init1      __NR_ia32_inotify_init1
 #define __NR_compat_linkat             __NR_ia32_linkat
+#define __NR_compat_mkdirat            __NR_ia32_mkdirat
+#define __NR_compat_open               __NR_ia32_open
 #define __NR_compat_pipe2              __NR_ia32_pipe2
 #define __NR_compat_readlinkat         __NR_ia32_readlinkat
+#define __NR_compat_renameat           __NR_ia32_renameat
 #define __NR_compat_rt_sigprocmask     __NR_ia32_rt_sigprocmask
 #define __NR_compat_symlinkat          __NR_ia32_symlinkat
 #define __NR_compat_umount2            __NR_ia32_umount2
 #define __NR_compat_getpgid            __NR_getpgid
 #define __NR_compat_inotify_init1      __NR_inotify_init1
 #define __NR_compat_linkat             __NR_linkat
+#define __NR_compat_mkdirat            __NR_mkdirat
+#define __NR_compat_open               __NR_open
 #define __NR_compat_pipe2              __NR_pipe2
 #define __NR_compat_readlinkat         __NR_readlinkat
+#define __NR_compat_renameat           __NR_renameat
 #define __NR_compat_rt_sigprocmask     __NR_rt_sigprocmask
 #define __NR_compat_symlinkat          __NR_symlinkat
 #define __NR_compat_umount2            __NR_umount2
index 19813facc8ca5a098d0d6f53956929ac1e371eac..bfd7d2001cb4dfcf3ec345fded75a936824017d1 100644 (file)
@@ -3447,6 +3447,7 @@ probe nd_syscall.mkdir.return = kprobe.function("sys_mkdir").return ?
 # long sys_mkdirat(int dfd, const char __user *pathname, int mode)
 probe nd_syscall.mkdirat = kprobe.function("sys_mkdirat") ?
 {
+       @__syscall_compat_gate(%{ __NR_mkdirat %}, %{ __NR_compat_mkdirat %})
        name = "mkdirat"
        // dirfd = $dfd
        // pathname = user_string($pathname)
@@ -3460,6 +3461,7 @@ probe nd_syscall.mkdirat = kprobe.function("sys_mkdirat") ?
 }
 probe nd_syscall.mkdirat.return = kprobe.function("sys_mkdirat").return ?
 {
+       @__syscall_compat_gate(%{ __NR_mkdirat %}, %{ __NR_compat_mkdirat %})
        name = "mkdirat"
        retstr = returnstr(1)
 }
index 9a5322c63a2b8842f148c1795b265de643bc7ad5..019ed365dad433a8ca6ad7e5901ce20d7e7dc67c 100644 (file)
@@ -132,6 +132,7 @@ probe nd_syscall.open = kprobe.function("compat_sys_open") ?,
                         kprobe.function("sys32_open") ?,
                         kprobe.function("sys_open") ?
 {
+       @__syscall_compat_gate(%{ __NR_open %}, %{ __NR_compat_open %})
        name = "open"
        // filename = user_string($filename)
        // flags = $flags
@@ -157,6 +158,7 @@ probe nd_syscall.open.return = kprobe.function("compat_sys_open").return ?,
                                kprobe.function("sys32_open").return ?,
                                kprobe.function("sys_open").return ?
 {
+       @__syscall_compat_gate(%{ __NR_open %}, %{ __NR_compat_open %})
        name = "open"
        retstr = returnstr(1)
 }
@@ -1266,6 +1268,7 @@ probe nd_syscall.rename.return = kprobe.function("sys_rename").return ?
 #      int newdfd, const char __user *newname)
 probe nd_syscall.renameat = kprobe.function("sys_renameat") ?
 {
+       @__syscall_compat_gate(%{ __NR_renameat %}, %{ __NR_compat_renameat %})
        name = "renameat"
        // olddfd = $olddfd
        // olddfd_str = _dfd_str($olddfd)
@@ -1293,6 +1296,7 @@ probe nd_syscall.renameat = kprobe.function("sys_renameat") ?
 }
 probe nd_syscall.renameat.return = kprobe.function("sys_renameat").return ?
 {
+       @__syscall_compat_gate(%{ __NR_renameat %}, %{ __NR_compat_renameat %})
        name = "renameat"
        retstr = returnstr(1)
 }
index 99e4579df8690cca303f97b71299734cb67fa047..38a00b479a12967a6a838e682be726a400bda599 100644 (file)
@@ -2750,6 +2750,7 @@ probe syscall.mkdir.return = kernel.function("sys_mkdir").return
 # long sys_mkdirat(int dfd, const char __user *pathname, int mode)
 probe syscall.mkdirat = kernel.function("sys_mkdirat").call ?
 {
+       @__syscall_compat_gate(%{ __NR_mkdirat %}, %{ __NR_compat_mkdirat %})
        name = "mkdirat"
        dirfd = $dfd
        pathname = user_string_quoted($pathname)
@@ -2758,6 +2759,7 @@ probe syscall.mkdirat = kernel.function("sys_mkdirat").call ?
 }
 probe syscall.mkdirat.return = kernel.function("sys_mkdirat").return ?
 {
+       @__syscall_compat_gate(%{ __NR_mkdirat %}, %{ __NR_compat_mkdirat %})
        name = "mkdirat"
        retstr = return_str(1, $return)
 }
index 1686d98dffe86b84567a072fdd636496b0e9ad96..fee448bef84c7fbf55c7dda96f220a48cc30e86c 100644 (file)
@@ -122,6 +122,7 @@ probe syscall.ni_syscall.return = kernel.function("sys_ni_syscall").return
 #
 probe syscall.open = __syscall.compat_open ?, __syscall.open
 {
+       @__syscall_compat_gate(%{ __NR_open %}, %{ __NR_compat_open %})
        name = "open"
        flags = $flags
        if ($flags & 64)
@@ -148,6 +149,7 @@ probe syscall.open.return = kernel.function("compat_sys_open").return ?,
                             kernel.function("sys32_open").return ?,
                             kernel.function("sys_open").return ?
 {
+       @__syscall_compat_gate(%{ __NR_open %}, %{ __NR_compat_open %})
        name = "open"
        retstr = return_str(1, $return)
 }
@@ -1157,6 +1159,7 @@ probe syscall.rename.return = kernel.function("sys_rename").return
 #      int newdfd, const char __user *newname)
 probe syscall.renameat = kernel.function("sys_renameat").call ?
 {
+       @__syscall_compat_gate(%{ __NR_renameat %}, %{ __NR_compat_renameat %})
        name = "renameat"
        olddfd = $olddfd
        olddfd_str = _dfd_str($olddfd)
@@ -1172,6 +1175,7 @@ probe syscall.renameat = kernel.function("sys_renameat").call ?
 }
 probe syscall.renameat.return = kernel.function("sys_renameat").return ?
 {
+       @__syscall_compat_gate(%{ __NR_renameat %}, %{ __NR_compat_renameat %})
        name = "renameat"
        retstr = return_str(1, $return)
 }
diff --git a/testsuite/systemtap.syscall/rename.c b/testsuite/systemtap.syscall/rename.c
new file mode 100644 (file)
index 0000000..e6cbb44
--- /dev/null
@@ -0,0 +1,86 @@
+/* COVERAGE: rename renameat */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+// To test for glibc support for renameat():
+//
+// Since glibc 2.10:
+//     _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
+// Before glibc 2.10:
+//     _ATFILE_SOURCE
+
+#define GLIBC_SUPPORT \
+  (_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L \
+   || defined(_ATFILE_SOURCE))
+
+int main()
+{
+  int fd1;
+
+  fd1 = creat("file1", S_IREAD|S_IWRITE);
+  close (fd1);
+  
+  mkdir("dir1", S_IREAD|S_IWRITE|S_IEXEC);
+  mkdir("dir3", S_IREAD|S_IWRITE|S_IEXEC);
+
+  fd1 = creat("dir3/file", S_IREAD|S_IWRITE);
+  close (fd1);
+
+  rename("file1", "file2");
+  //staptest// rename ("file1", "file2") = 0
+
+  rename("dir1", "dir2");
+  //staptest// rename ("dir1", "dir2") = 0
+
+  // This will fail since the target isn't empty.
+  rename("dir2", "dir3");
+  //staptest// rename ("dir2", "dir3") = -NNNN (ENOTEMPTY!!!!EEXIST)
+
+  // This will fail since you can't rename a file to a directory.
+  rename("file2", "dir2");
+  //staptest// rename ("file2", "dir2") = -NNNN (EISDIR)
+
+  // You can't rename a directory to a subdirectory of itself.
+  rename("dir2", "dir2/dir4");
+  //staptest// rename ("dir2", "dir2/dir4") = -NNNN (EINVAL)
+
+  // You can't rename a directory to a file.
+  rename("dir2", "file2");
+  //staptest// rename ("dir2", "file2") = -NNNN (ENOTDIR)
+
+  rename("file2", (char *)-1);
+  //staptest// rename ("file2", XXXX) = -NNNN (EFAULT)
+
+#if GLIBC_SUPPORT
+  renameat(AT_FDCWD, "file2", AT_FDCWD, "file1");
+  //staptest// renameat (AT_FDCWD, "file2", AT_FDCWD, "file1") = 0
+
+  renameat(AT_FDCWD, "dir2", AT_FDCWD, "dir1");
+  //staptest// renameat (AT_FDCWD, "dir2", AT_FDCWD, "dir1") = 0
+
+  // This will fail since the target isn't empty.
+  renameat(AT_FDCWD, "dir1", AT_FDCWD, "dir3");
+  //staptest// rename (AT_FDCWD, "dir1", AT_FDCWD, "dir3") = -NNNN (ENOTEMPTY!!!!EEXIST)
+
+  // This will fail since you can't rename a file to a directory.
+  renameat(AT_FDCWD, "file1", AT_FDCWD, "dir1");
+  //staptest// renameat (AT_FDCWD, "file1", AT_FDCWD, "dir1") = -NNNN (EISDIR)
+
+  // You can't rename a directory to a subdirectory of itself.
+  renameat(AT_FDCWD, "dir1", AT_FDCWD, "dir1/dir4");
+  //staptest// renameat (AT_FDCWD, "dir1", AT_FDCWD, "dir1/dir4") = -NNNN (EINVAL)
+
+  // You can't rename a directory to a file.
+  renameat(AT_FDCWD, "dir1", AT_FDCWD, "file1");
+  //staptest// renameat (AT_FDCWD, "dir1", AT_FDCWD, "file1") = -NNNN (ENOTDIR)
+
+  renameat(AT_FDCWD, "file1", AT_FDCWD, (char *)-1);
+  //staptest// renameat (AT_FDCWD, "file1", AT_FDCWD, XXXX) = -NNNN (EFAULT)
+
+#endif
+  return 0;
+}
This page took 0.049768 seconds and 5 git commands to generate.