diff options
author | hunt <hunt> | 2006-06-30 19:31:38 +0000 |
---|---|---|
committer | hunt <hunt> | 2006-06-30 19:31:38 +0000 |
commit | ece0fed02ea52ba47993354000488f20dfb47848 (patch) | |
tree | c21708b1264a4e49533a79c78f5f93acb6ac28e6 | |
parent | b40af7ee2b7ec2a0bdabf4e1b2ecfceec1de33be (diff) | |
download | systemtap-steved-ece0fed02ea52ba47993354000488f20dfb47848.tar.gz systemtap-steved-ece0fed02ea52ba47993354000488f20dfb47848.tar.xz systemtap-steved-ece0fed02ea52ba47993354000488f20dfb47848.zip |
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.
-rw-r--r-- | tapset/ChangeLog | 7 | ||||
-rw-r--r-- | tapset/conversions.stp | 37 | ||||
-rw-r--r-- | tapset/i686/syscalls.stp | 30 | ||||
-rw-r--r-- | tapset/syscalls.stp | 37 | ||||
-rw-r--r-- | tapset/syscalls2.stp | 64 | ||||
-rw-r--r-- | tapset/x86_64/syscalls.stp | 32 |
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) |