summaryrefslogtreecommitdiffstats
path: root/tapset/conversions.stp
diff options
context:
space:
mode:
authorhunt <hunt>2006-06-30 19:31:38 +0000
committerhunt <hunt>2006-06-30 19:31:38 +0000
commitece0fed02ea52ba47993354000488f20dfb47848 (patch)
treec21708b1264a4e49533a79c78f5f93acb6ac28e6 /tapset/conversions.stp
parentb40af7ee2b7ec2a0bdabf4e1b2ecfceec1de33be (diff)
downloadsystemtap-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.stp37
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);
}
%}