summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
Diffstat (limited to 'tapset')
-rw-r--r--tapset/ChangeLog7
-rw-r--r--tapset/conversions.stp37
-rw-r--r--tapset/i686/syscalls.stp30
-rw-r--r--tapset/syscalls.stp37
-rw-r--r--tapset/syscalls2.stp64
-rw-r--r--tapset/x86_64/syscalls.stp32
6 files changed, 101 insertions, 106 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index d01902db..986f423d 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,10 @@
+2006-06-30 Martin Hunt <hunt@redhat.com>
+
+ * conversions.stp (user_string): Don't generate errors
+ on faults, just return <unknown>.
+ (user_string2): New function.
+ (user_string_warn): New function.
+
2006-06-26 Martin Hunt <hunt@redhat.com>
* aux_syscalls.stp (_stp_ctime): New function.
diff --git a/tapset/conversions.stp b/tapset/conversions.stp
index 099cdd20..78e936aa 100644
--- a/tapset/conversions.stp
+++ b/tapset/conversions.stp
@@ -20,17 +20,32 @@ deref_fault: /* branched to from deref() */
success: ;
%}
-# NB: accessing user space is hazardous from certain kernel contexts.
-# Errors should be returned when this is detected.
+
+// On rare cases when userspace data is not accessible,
+// this function returns "<unknown>"
+
function user_string:string (addr:long) %{ /* pure */
- long rc = _stp_strncpy_from_user (THIS->__retvalue,
- (const char __user*) (uintptr_t) THIS->addr,
- MAXSTRINGLEN);
- if (rc < 0)
- {
- static char errmsg[40];
- snprintf (errmsg, 40, "user string copy fault at 0x%p",
- (void *) (uintptr_t) THIS->addr);
- CONTEXT->last_error = errmsg;
+ if (_stp_strncpy_from_user (THIS->__retvalue,
+ (const char __user*) (uintptr_t) THIS->addr,
+ MAXSTRINGLEN) < 0)
+ strlcpy (THIS->__retvalue, "<unknown>", MAXSTRINGLEN);
+%}
+
+function user_string2:string (addr:long, err_msg:string) %{ /* pure */
+ if (_stp_strncpy_from_user (THIS->__retvalue,
+ (const char __user*) (uintptr_t) THIS->addr,
+ MAXSTRINGLEN) < 0)
+ strlcpy (THIS->__retvalue, THIS->err_msg, MAXSTRINGLEN);
+%}
+
+function user_string_warn:string (addr:long) %{ /* pure */
+ long rc = _stp_strncpy_from_user (THIS->__retvalue,
+ (const char __user*) (uintptr_t) THIS->addr, MAXSTRINGLEN);
+ if (rc < 0) {
+ static char errmsg[40];
+ snprintf (errmsg, 40, "user string copy fault %ld at %p", rc,
+ (void *) (uintptr_t) THIS->addr);
+ _stp_warn(errmsg);
+ strlcpy (THIS->__retvalue, "<unknown>", MAXSTRINGLEN);
}
%}
diff --git a/tapset/i686/syscalls.stp b/tapset/i686/syscalls.stp
index 8ce1828f..340fca6f 100644
--- a/tapset/i686/syscalls.stp
+++ b/tapset/i686/syscalls.stp
@@ -12,19 +12,6 @@ probe syscall.getgroups16.return = kernel.function("sys_getgroups16").return {
retstr = returnstr(1)
}
-# lstat ______________________________________________________
-# long sys_lstat(char __user * filename, struct __old_kernel_stat __user * statbuf)
-probe syscall.lstat = kernel.function("sys_lstat") {
- name = "lstat"
- file_name = user_string($filename)
- buf_uaddr = $statbuf
- argstr = sprintf("%s, [%p]", file_name, buf_uaddr)
-}
-probe syscall.lstat.return = kernel.function("sys_lstat").return {
- name = "lstat.return"
- retstr = returnstr(1)
-}
-
# setgroups16 ________________________________________________
#
# asmlinkage long
@@ -42,23 +29,6 @@ probe syscall.setgroups16.return = kernel.function("sys_setgroups16").return {
retstr = returnstr(1)
}
-# stat _______________________________________________________
-#
-# asmlinkage long
-# sys_stat(char __user * filename,
-# struct __old_stat __user * statbuf)
-#
-probe syscall.stat = kernel.function("sys_stat") {
- name = "stat"
- filename_uaddr = $filename
- filename = user_string($filename)
- buf_uaddr = $statbuf
- argstr = sprintf("%s, [%p]", filename, buf_uaddr)
-}
-probe syscall.stat.return = kernel.function("sys_stat").return {
- name = "stat"
- retstr = returnstr(1)
-}
# acct _______________________________________________________
# long sys_acct(const char __user *name)
diff --git a/tapset/syscalls.stp b/tapset/syscalls.stp
index 01d36b3a..d4be4941 100644
--- a/tapset/syscalls.stp
+++ b/tapset/syscalls.stp
@@ -706,14 +706,26 @@ probe syscall.fsetxattr.return = kernel.function("sys_fsetxattr").return {
# fstat ______________________________________________________
# long sys_fstat(unsigned int fd, struct __old_kernel_stat __user * statbuf)
-# long sys_fstat64(unsigned long fd, struct stat64 __user * statbuf)!run
-probe syscall.fstat = kernel.function("sys_fstat") ?, kernel.function("sys_fstat64") ? {
+# long sys_fstat64(unsigned long fd, struct stat64 __user * statbuf)
+# long sys32_fstat64(unsigned int fd, struct stat64 __user *statbuf)
+# long sys_newfstat(unsigned int fd, struct stat __user * statbuf)
+probe syscall.fstat =
+ kernel.function("sys_fstat") ?,
+ kernel.function("sys_fstat64") ?,
+ kernel.function("sys32_fstat64") ?,
+ kernel.function("sys_newfstat") ?
+{
name = "fstat"
filedes = $fd
buf_uaddr = $statbuf
argstr = sprintf("%d, [%p]", $fd, $statbuf)
}
-probe syscall.fstat.return = kernel.function("sys_fstat").return ?, kernel.function("sys_fstat64").return ? {
+probe syscall.fstat.return =
+ kernel.function("sys_fstat").return ?,
+ kernel.function("sys_fstat64").return ?,
+ kernel.function("sys32_fstat64").return ?,
+ kernel.function("sys_newfstat").return ?
+{
name = "fstat"
retstr = returnstr(1)
}
@@ -1632,6 +1644,25 @@ probe kernel.syscall.lsetxattr.return =
name = "lsetxattr.return"
}
+# lstat ______________________________________________________
+# long sys_lstat(char __user * filename, struct __old_kernel_stat __user * statbuf)
+probe syscall.lstat =
+ kernel.function("sys_lstat") ?,
+ kernel.function("cpmpat_sys_newlstat") ?
+{
+ name = "lstat"
+ file_name = user_string($filename)
+ buf_uaddr = $statbuf
+ argstr = sprintf("\"%s\", [%p]", file_name, buf_uaddr)
+}
+probe syscall.lstat.return =
+ kernel.function("sys_lstat").return ?,
+ kernel.function("cpmpat_sys_newlstat").return ?
+{
+ name = "lstat"
+ retstr = returnstr(1)
+}
+
# madvise ____________________________________________________
/*
* asmlinkage long
diff --git a/tapset/syscalls2.stp b/tapset/syscalls2.stp
index 49f7cc79..80b2aa71 100644
--- a/tapset/syscalls2.stp
+++ b/tapset/syscalls2.stp
@@ -36,22 +36,6 @@ probe syscall.nanosleep.return = kernel.function("sys_nanosleep").return {
name = "nanosleep"
retstr = returnstr(1)
}
-# newfstat ___________________________________________________
-#
-# asmlinkage long
-# sys_newfstat(unsigned int fd,
-# struct stat __user * statbuf)
-#
-probe syscall.newfstat = kernel.function("sys_newfstat") {
- name = "fstat"
- fd = $fd
- buf_uaddr = $statbuf
- argstr = sprintf("%d, [%p]", fd, buf_uaddr)
-}
-probe syscall.newfstat.return = kernel.function("sys_newfstat").return {
- name = "fstat"
- retstr = returnstr(1)
-}
# newlstat ___________________________________________________
#
# long sys_newlstat(char __user * filename,
@@ -161,7 +145,10 @@ probe syscall.old_getrlimit.return = kernel.function("sys_old_getrlimit").return
# open _______________________________________________________
# asmlinkage long sys_open(const char __user * filename, int flags, int mode)
-probe syscall.open = kernel.function("sys_open") {
+probe syscall.open =
+ kernel.function("sys_open") ?,
+ kernel.function("sys32_open") ?
+{
name = "open"
filename = user_string($filename)
flags = $flags
@@ -171,7 +158,10 @@ probe syscall.open = kernel.function("sys_open") {
else
argstr = sprintf("\"%s\", %s", filename, _sys_open_flag_str(flags))
}
-probe syscall.open.return = kernel.function("sys_open").return {
+probe syscall.open.return =
+ kernel.function("sys_open").return ?,
+ kernel.function("sys32_open").return ?
+{
name = "open"
retstr = returnstr(1)
}
@@ -1772,21 +1762,41 @@ probe syscall.ssetmask.return = kernel.function("sys_ssetmask").return {
retstr = returnstr(1)
}
-# statfs _____________________________________________________
+# stat _______________________________________________________
+# long sys_stat(char __user * filename, struct __old_stat __user * statbuf)
#
-# long sys_statfs(const char __user * path,
-# struct statfs __user * buf)
+probe syscall.stat =
+ kernel.function("sys_stat") ?,
+ kernel.function("sys_newstat") ?
+{
+ name = "stat"
+ filename_uaddr = $filename
+ filename = user_string($filename)
+ buf_uaddr = $statbuf
+ argstr = sprintf("%s, [%p]", filename, buf_uaddr)
+}
+probe syscall.stat.return =
+ kernel.function("sys_stat").return ?,
+ kernel.function("sys_newstat").return ?
+{
+ name = "stat"
+ retstr = returnstr(1)
+}
+
+# statfs _____________________________________________________
+# long sys_statfs(const char __user * path, struct statfs __user * buf)
#
probe syscall.statfs = kernel.function("sys_statfs") {
name = "statfs"
path = user_string($path)
buf_uaddr = $buf
- argstr = sprintf("%s, [%p]", path, $buf)
+ argstr = sprintf("\"%s\", [%p]", path, $buf)
}
probe syscall.statfs.return = kernel.function("sys_statfs").return {
name = "statfs"
retstr = returnstr(1)
}
+
# statfs64 ___________________________________________________
#
# long sys_statfs64(const char __user *path,
@@ -2159,10 +2169,7 @@ probe syscall.uname.return = kernel.function("sys_uname").return {
probe syscall.unlink = kernel.function("sys_unlink") {
name = "unlink"
pathname_uaddr = $pathname
- if ($pathname > 0)
- pathname = user_string($pathname)
- else
- pathname = "null"
+ pathname = user_string($pathname)
argstr = sprintf("\"%s\"",pathname)
}
probe syscall.unlink.return = kernel.function("sys_unlink").return {
@@ -2185,10 +2192,7 @@ probe syscall.uselib.return = kernel.function("sys_uselib").return {
retstr = returnstr(1)
}
# ustat ______________________________________________________
-#
-# asmlinkage long
-# sys_ustat(unsigned dev,
-# struct ustat __user * ubuf)
+# long sys_ustat(unsigned dev, struct ustat __user * ubuf)
#
probe syscall.ustat = kernel.function("sys_ustat") {
name = "ustat"
diff --git a/tapset/x86_64/syscalls.stp b/tapset/x86_64/syscalls.stp
index 27f4f2ce..ffe6df40 100644
--- a/tapset/x86_64/syscalls.stp
+++ b/tapset/x86_64/syscalls.stp
@@ -11,21 +11,6 @@ probe syscall.getgroups16.return = kernel.function("sys_getgroups16").return {
retstr = returnstr(1)
}
-
-# lstat ______________________________________________________
-# long sys_lstat(char __user * filename, struct __old_kernel_stat __user * statbuf)
-probe syscall.lstat = kernel.function("sys_lstat") {
- name = "lstat"
- file_name = user_string($filename)
- buf_uaddr = $statbuf
- argstr = sprintf("%s, [%p]", file_name, buf_uaddr)
-}
-probe syscall.lstat.return = kernel.function("sys_lstat").return {
- name = "lstat"
- retstr = returnstr(1)
-}
-
-
# setgroups16 ________________________________________________
#
# asmlinkage long
@@ -43,23 +28,6 @@ probe syscall.setgroups16.return = kernel.function("sys_setgroups16").return {
retstr = returnstr(1)
}
-# stat _______________________________________________________
-#
-# asmlinkage long
-# sys_stat(char __user * filename,
-# struct __old_stat __user * statbuf)
-#
-probe syscall.stat = kernel.function("sys_stat") {
- name = "stat"
- filename_uaddr = $filename
- filename = user_string($filename)
- buf_uaddr = $statbuf
- argstr = sprintf("%s, [%p]", filename, buf_uaddr)
-}
-probe syscall.stat.return = kernel.function("sys_stat").return {
- name = "stat"
- retstr = returnstr(1)
-}
# acct _______________________________________________________
# long sys_acct(const char __user *name)