diff options
author | fche <fche> | 2005-09-03 17:24:49 +0000 |
---|---|---|
committer | fche <fche> | 2005-09-03 17:24:49 +0000 |
commit | f9eba66ef3ec406f883caebed75cdeaa042f6b33 (patch) | |
tree | ee5996857ff254f209742df2ad9ed54e50b4e157 /tapset/conversions.stp | |
parent | 6a505121fc997e6f21d26f8c8656f99e58faaaab (diff) | |
download | systemtap-steved-f9eba66ef3ec406f883caebed75cdeaa042f6b33.tar.gz systemtap-steved-f9eba66ef3ec406f883caebed75cdeaa042f6b33.tar.xz systemtap-steved-f9eba66ef3ec406f883caebed75cdeaa042f6b33.zip |
2005-09-03 Frank Ch. Eigler <fche@elastic.org>
PR 1187 prime
* tapset.cxx (literal_stmt_for_local): Don't automgaically copy
target char*'s to systemtap strings.
* tapset/conversions.stp (user_string, kernel_string): New functions.
* stapfuncs.5.in: Document new functions.
Diffstat (limited to 'tapset/conversions.stp')
-rw-r--r-- | tapset/conversions.stp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/tapset/conversions.stp b/tapset/conversions.stp index 901f26a4..50dbfeb0 100644 --- a/tapset/conversions.stp +++ b/tapset/conversions.stp @@ -6,3 +6,31 @@ function string:string (num:long) %{ sprintf (THIS->__retvalue, "%lld", (long long) THIS->num); %} + +function kernel_string:string (addr:long) %{ + char *destination = THIS->__retvalue; + deref_string (destination, THIS->addr, MAXSTRINGLEN); + goto success; +deref_fault: /* branched to from deref() */ + { + static char errmsg[40]; + snprintf (errmsg, 40, "kernel string copy fault at 0x%p", + (void *) (uintptr_t) THIS->addr); + CONTEXT->last_error = errmsg; + } +success: ; +%} + +# NB: accessing user space is hazardous from certain kernel contexts. +function user_string:string (addr:long) %{ + 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; + } +%} |