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 /tapset/conversions.stp | |
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.
Diffstat (limited to 'tapset/conversions.stp')
-rw-r--r-- | tapset/conversions.stp | 37 |
1 files changed, 26 insertions, 11 deletions
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); } %} |