summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjistone <jistone>2007-02-07 02:54:30 +0000
committerjistone <jistone>2007-02-07 02:54:30 +0000
commitb8772cce090adb3d27cdd8b49d236662b526424e (patch)
treef216b71b2bea50d0bd95c9d22956a07e0b6fa49c
parent3b4136ca14c78881c50e8c36fa35fa574edaabb4 (diff)
downloadsystemtap-steved-b8772cce090adb3d27cdd8b49d236662b526424e.tar.gz
systemtap-steved-b8772cce090adb3d27cdd8b49d236662b526424e.tar.xz
systemtap-steved-b8772cce090adb3d27cdd8b49d236662b526424e.zip
2007-02-06 Josh Stone <joshua.i.stone@intel.com>
* aux_syscalls.stp, inet_sock.stp, ioblock.stp, ioscheduler.stp, nfs.stp, nfs_proc.stp, nfsd.stp, rpc.stp, scsi.stp, signal.stp, socket.stp, task.stp, tcp.stp, vfs.stp: Protect pointer dereferences with kread wherever possible. Some places still have hazards, as marked with FIXMEs. * errno.stp (returnstr): Don't use return in tapset C functions. * aux_syscalls.stp (__uget_timex_m): Ditto. * nfsd.stp (__get_fh): Ditto. * nfs.stp, vfs.stp (<many functions>): Ditto. * string.stp (substr): Ditto. Also make sure start index is valid. * syscalls.stp (syscall.execve): Change __string to kernel_string. LKET/ * nfs.stp, nfs_proc.stp, nfsd.stp, process.stp, tskdispatch.stp: Protect pointer dereferences with kread wherever possible. Some places still have hazards, as marked with FIXMEs. * aio.stp (log_io_getevents): Don't use return in tapset C functions. * timestamp.stp (set_timing_method): Ditto. * utils.stp (filter_by_pid): Ditto.
-rw-r--r--tapset/ChangeLog16
-rw-r--r--tapset/LKET/Changelog10
-rwxr-xr-xtapset/LKET/aio.stp12
-rwxr-xr-xtapset/LKET/nfs.stp12
-rwxr-xr-xtapset/LKET/nfs_proc.stp114
-rwxr-xr-xtapset/LKET/nfsd.stp83
-rwxr-xr-xtapset/LKET/process.stp12
-rwxr-xr-xtapset/LKET/timestamp.stp9
-rwxr-xr-xtapset/LKET/tskdispatch.stp7
-rwxr-xr-xtapset/LKET/utils.stp7
-rw-r--r--tapset/aux_syscalls.stp46
-rw-r--r--tapset/errno.stp40
-rw-r--r--tapset/inet_sock.stp21
-rw-r--r--tapset/ioblock.stp106
-rw-r--r--tapset/ioscheduler.stp28
-rw-r--r--tapset/nfs.stp341
-rw-r--r--tapset/nfs_proc.stp36
-rw-r--r--tapset/nfsd.stp57
-rw-r--r--tapset/rpc.stp76
-rw-r--r--tapset/scsi.stp7
-rw-r--r--tapset/signal.stp17
-rw-r--r--tapset/socket.stp163
-rw-r--r--tapset/string.stp6
-rw-r--r--tapset/syscalls.stp2
-rw-r--r--tapset/task.stp87
-rw-r--r--tapset/tcp.stp48
-rw-r--r--tapset/vfs.stp132
27 files changed, 691 insertions, 804 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index 8e1766cd..9ac6e525 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,19 @@
+2007-02-06 Josh Stone <joshua.i.stone@intel.com>
+
+ * aux_syscalls.stp, inet_sock.stp, ioblock.stp, ioscheduler.stp,
+ nfs.stp, nfs_proc.stp, nfsd.stp, rpc.stp, scsi.stp, signal.stp,
+ socket.stp, task.stp, tcp.stp, vfs.stp: Protect pointer dereferences
+ with kread wherever possible. Some places still have hazards, as
+ marked with FIXMEs.
+
+ * errno.stp (returnstr): Don't use return in tapset C functions.
+ * aux_syscalls.stp (__uget_timex_m): Ditto.
+ * nfsd.stp (__get_fh): Ditto.
+ * nfs.stp, vfs.stp (<many functions>): Ditto.
+ * string.stp (substr): Ditto. Also make sure start index is valid.
+
+ * syscalls.stp (syscall.execve): Change __string to kernel_string.
+
2007-02-06 Frank Ch. Eigler <fche@elastic.org>
* conversions.stp (kernel_long/int/short/char): New functions.
diff --git a/tapset/LKET/Changelog b/tapset/LKET/Changelog
index 96bfadc0..9f267636 100644
--- a/tapset/LKET/Changelog
+++ b/tapset/LKET/Changelog
@@ -1,3 +1,13 @@
+2007-02-06 Josh Stone <joshua.i.stone@intel.com>
+
+ * nfs.stp, nfs_proc.stp, nfsd.stp, process.stp, tskdispatch.stp:
+ Protect pointer dereferences with kread wherever possible. Some
+ places still have hazards, as marked with FIXMEs.
+
+ * aio.stp (log_io_getevents): Don't use return in tapset C functions.
+ * timestamp.stp (set_timing_method): Ditto.
+ * utils.stp (filter_by_pid): Ditto.
+
2006-12-29 Li Guanglei <guanglei@cn.ibm.com>
From Gui Jian <guij@cn.ibm.com>
diff --git a/tapset/LKET/aio.stp b/tapset/LKET/aio.stp
index ea81d024..09b3a3b8 100755
--- a/tapset/LKET/aio.stp
+++ b/tapset/LKET/aio.stp
@@ -237,13 +237,11 @@ function log_io_getevents(ctx_id:long, min_nr:long, nr:long,
struct timespec __user *timeout = (struct timespec *)((long)THIS->timeout);
struct timespec ts;
- if (unlikely(copy_from_user(&ts, timeout, sizeof(ts))))
- return;
-
- _lket_trace(_GROUP_AIO, _HOOKID_AIO_IO_GETEVENTS_ENTRY,
- "%8b%4b%4b%8b%4b%4b", THIS->ctx_id, THIS->min_nr,
- THIS->nr, THIS->events_uaddr, (_FMT_)ts.tv_sec,
- (_FMT_)ts.tv_nsec);
+ if (likely(0 == copy_from_user(&ts, timeout, sizeof(ts))))
+ _lket_trace(_GROUP_AIO, _HOOKID_AIO_IO_GETEVENTS_ENTRY,
+ "%8b%4b%4b%8b%4b%4b", THIS->ctx_id, THIS->min_nr,
+ THIS->nr, THIS->events_uaddr, (_FMT_)ts.tv_sec,
+ (_FMT_)ts.tv_nsec);
%}
probe addevent.aio.io_getevents.return
diff --git a/tapset/LKET/nfs.stp b/tapset/LKET/nfs.stp
index 3e4c1e53..7267da74 100755
--- a/tapset/LKET/nfs.stp
+++ b/tapset/LKET/nfs.stp
@@ -1,13 +1,17 @@
/* Helper functions */
function __file_fsname:string (file:long) %{ /* pure */
struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL)
- || (file->f_dentry == NULL)
- || (file->f_dentry->d_inode == NULL))
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ struct inode *d_inode = f_dentry? kread(&(f_dentry->d_inode)) : NULL;
+ if (d_inode == NULL)
strlcpy(THIS->__retvalue, "NULL", MAXSTRINGLEN);
else {
- strlcpy(THIS->__retvalue, file->f_dentry->d_inode->i_sb->s_type->name, MAXSTRINGLEN);
+ struct super_block *i_sb = kread(&(d_inode->i_sb));
+ struct file_system_type *s_type = kread(&(i_sb->s_type));
+ const char *name = kread(&(s_type->name));
+ deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
}
+ CATCH_DEREF_FAULT();
%}
probe never
diff --git a/tapset/LKET/nfs_proc.stp b/tapset/LKET/nfs_proc.stp
index 08a08152..418f6c21 100755
--- a/tapset/LKET/nfs_proc.stp
+++ b/tapset/LKET/nfs_proc.stp
@@ -10,6 +10,7 @@
void getdevice(char *sid,int * major,int* min)
{
+ /* FIXME: deref hazard! */
char c;
char * minor, *p;
int i = 0;
@@ -105,13 +106,15 @@ probe _addevent.nfs.proc.lookup.entry
function log_proc_lookup(version:long,dir:long,filename:string)
%{
struct inode * dir = (struct inode * )((long)THIS->dir);
- struct super_block * sb = dir->i_sb;
+ struct super_block *sb = kread(&(dir->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_LOOKUP_ENTRY,"%1b%1b%8b%1b%0s",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(dir),THIS->version,THIS->filename);
+ NFS_FILEID(dir) /* FIXME: deref hazard! */,
+ THIS->version,THIS->filename);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.lookup.return
@@ -141,14 +144,16 @@ probe _addevent.nfs.proc.read.entry
function log_proc_read(version:long,rdata:long,count:long,offset:long)
%{
struct nfs_read_data* rdata = (struct nfs_read_data* )((long)THIS->rdata);
- struct inode *inode = rdata->inode;
- struct super_block * sb = inode->i_sb;
+ struct inode *inode = kread(&(rdata->inode));
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_READ_ENTRY,"%1b%1b%8b%1b%4b%8b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->count,THIS->offset);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->count,THIS->offset);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.read.return
@@ -178,14 +183,16 @@ probe _addevent.nfs.proc.write.entry
function log_proc_write(version:long,wdata:long,count:long,offset:long)
%{
struct nfs_write_data* wdata = (struct nfs_write_data* )((long)THIS->wdata);
- struct inode *inode = wdata->inode;
- struct super_block * sb = inode->i_sb;
+ struct inode *inode = kread(&(wdata->inode));
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_WRITE_ENTRY,"%1b%1b%8b%1b%4b%8b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->count,THIS->offset);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->count,THIS->offset);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.write.return
@@ -215,15 +222,17 @@ probe _addevent.nfs.proc.commit.entry
function log_proc_commit(version:long,cdata:long,count:long,offset:long)
%{
struct nfs_write_data* cdata = (struct nfs_write_data* )((long)THIS->cdata);
- struct inode *inode = cdata->inode;
- struct super_block * sb = inode->i_sb;
+ struct inode *inode = kread(&(cdata->inode));
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_COMMIT_ENTRY,"%1b%1b%8b%1b%4b%8b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->count,THIS->offset);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->count,THIS->offset);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.commit.return
@@ -253,15 +262,17 @@ probe _addevent.nfs.proc.read_setup.entry
function log_proc_read_setup(version:long,data:long,count:long,offset:long)
%{
struct nfs_read_data* data = (struct nfs_read_data* )((long)THIS->data);
- struct inode *inode = data->inode;
- struct super_block * sb = inode->i_sb;
+ struct inode *inode = kread(&(data->inode));
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_READSETUP_ENTRY,"%1b%1b%8b%1b%4b%8b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->count,THIS->offset);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->count,THIS->offset);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.write_setup.entry
@@ -279,15 +290,17 @@ probe _addevent.nfs.proc.write_setup.entry
function log_proc_write_setup(version:long,data:long,count:long,offset:long,how:long)
%{
struct nfs_write_data* data = (struct nfs_write_data* )((long)THIS->data);
- struct inode *inode = data->inode;
- struct super_block * sb = inode->i_sb;
+ struct inode *inode = kread(&(data->inode));
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_WRITESETUP_ENTRY,"%1b%1b%8b%1b%1b%4b%8b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->how,THIS->count,THIS->offset);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->how,THIS->count,THIS->offset);
+ CATCH_DEREF_FAULT();
%}
@@ -306,15 +319,17 @@ probe _addevent.nfs.proc.commit_setup.entry
function log_proc_commit_setup(version:long,data:long,count:long,offset:long)
%{
struct nfs_write_data* data = (struct nfs_write_data* )((long)THIS->data);
- struct inode *inode = data->inode;
- struct super_block * sb = inode->i_sb;
+ struct inode *inode = kread(&(data->inode));
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_COMMITSETUP_ENTRY,"%1b%1b%8b%1b%4b%8b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->count,THIS->offset);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->count,THIS->offset);
+ CATCH_DEREF_FAULT();
%}
@@ -337,15 +352,17 @@ probe _addevent.nfs.proc.read_done.entry
function log_proc_read_done(version:long,data:long,count:long,status:long)
%{
struct nfs_read_data* data = (struct nfs_read_data* )((long)THIS->data);
- struct inode *inode = data->inode;
- struct super_block * sb = inode->i_sb;
+ struct inode *inode = kread(&(data->inode));
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_READDONE_ENTRY,"%1b%1b%8b%1b%4b%4b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->status,THIS->count);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->status,THIS->count);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.read_done.return
@@ -383,15 +400,17 @@ probe _addevent.nfs.proc.write_done.entry
function log_proc_write_done(version:long,data:long,count:long,status:long)
%{
struct nfs_write_data* data = (struct nfs_write_data* )((long)THIS->data);
- struct inode *inode = data->inode;
- struct super_block * sb = inode->i_sb;
+ struct inode *inode = kread(&(data->inode));
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_WRITEDONE_ENTRY,"%1b%1b%8b%1b%4b%4b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->status,THIS->count);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->status,THIS->count);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.write_done.return
@@ -429,15 +448,17 @@ probe _addevent.nfs.proc.commit_done.entry
function log_proc_commit_done(version:long,data:long,count:long,status:long)
%{
struct nfs_write_data* data = (struct nfs_write_data* )((long)THIS->data);
- struct inode *inode = data->inode;
- struct super_block * sb = inode->i_sb;
+ struct inode *inode = kread(&(data->inode));
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_COMMITDONE_ENTRY,"%1b%1b%8b%1b%4b%4b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->status,THIS->count);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->status,THIS->count);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.commit_done.return
@@ -472,14 +493,16 @@ function log_proc_open(version:long,inode:long,
filename:string,flag:long,mode:long)
%{
struct inode *inode = (struct inode *)((long)THIS->inode);
- struct super_block * sb = inode->i_sb;
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_OPEN_ENTRY,"%1b%1b%8b%1b%0s%4b%4b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->filename,THIS->flag,THIS->mode);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->filename,THIS->flag,THIS->mode);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.open.return
@@ -510,14 +533,16 @@ function log_proc_release(version:long,inode:long,
filename:string,flag:long,mode:long)
%{
struct inode *inode = (struct inode *)((long)THIS->inode);
- struct super_block * sb = inode->i_sb;
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_RELEASE_ENTRY,"%1b%1b%8b%1b%0s%4b%4b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->filename,THIS->flag,THIS->mode);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->filename,THIS->flag,THIS->mode);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.release.return
@@ -547,13 +572,15 @@ probe _addevent.nfs.proc.create.entry
function log_proc_create(version:long,inode:long,filename:string,mode:long)
%{
struct inode *inode = (struct inode *)((long)THIS->inode);
- struct super_block * sb = inode->i_sb;
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_CREATE_ENTRY,"%1b%1b%8b%1b%0s%4b",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->filename,THIS->mode);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->filename,THIS->mode);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.create.return
@@ -584,13 +611,15 @@ function log_proc_remove(version:long,inode:long,
filename:string)
%{
struct inode *inode = (struct inode *)((long)THIS->inode);
- struct super_block * sb = inode->i_sb;
+ struct super_block * sb = kread(&(inode->i_sb));
int major_device,minor_device;
getdevice(sb->s_id,&major_device,&minor_device);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_REMOVE_ENTRY,"%1b%1b%8b%1b%0s",
(_FMT_)major_device,(_FMT_)minor_device,
- NFS_FILEID(inode),THIS->version,THIS->filename);
+ NFS_FILEID(inode) /* FIXME: deref hazard! */,
+ THIS->version,THIS->filename);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.remove.return
@@ -622,17 +651,20 @@ function log_proc_rename(version:long,old_dir:long,old_name:string,
%{
struct inode *old_dir= (struct inode *)((long)THIS->old_dir);
struct inode *new_dir= (struct inode *)((long)THIS->new_dir);
- struct super_block * old_sb = old_dir->i_sb;
- struct super_block * new_sb = new_dir->i_sb;
+ struct super_block * old_sb = kread(&(old_dir->i_sb));
+ struct super_block * new_sb = kread(&(new_dir->i_sb));
int major_old,minor_old,major_new,minor_new;
getdevice(old_sb->s_id,&major_old,&minor_old);
getdevice(new_sb->s_id,&major_new,&minor_new);
_lket_trace(_GROUP_NFS,_HOOKID_NFS_PROC_RENAME_ENTRY,"%1b%1b%1b%8b%0s%1b%1b%8b%0s",
- THIS->version,(_FMT_)major_old,(_FMT_)minor_old,NFS_FILEID(old_dir),
- THIS->old_name,(_FMT_)major_new,(_FMT_)minor_new,NFS_FILEID(new_dir),
+ THIS->version,(_FMT_)major_old,(_FMT_)minor_old,
+ NFS_FILEID(old_dir) /* FIXME: deref hazard! */,
+ THIS->old_name,(_FMT_)major_new,(_FMT_)minor_new,
+ NFS_FILEID(new_dir) /* FIXME: deref hazard! */,
THIS->new_name);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfs.proc.rename.return
diff --git a/tapset/LKET/nfsd.stp b/tapset/LKET/nfsd.stp
index b07063a3..2e42d194 100755
--- a/tapset/LKET/nfsd.stp
+++ b/tapset/LKET/nfsd.stp
@@ -5,6 +5,7 @@
%{
void decode_fh(struct knfsd_fh *fh,__u64 * i_ino)
{
+ /* FIXME: deref hazard! */
int i;
for(i = 0;i < 3;i++)
@@ -117,7 +118,9 @@ function log_nfsd_lookup(fhp:long,filename:string)%{ /*pure*/
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_LOOKUP_ENTRY,"%1b%8b%8b%8b%0s",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],THIS->filename);
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],THIS->filename);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.lookup.return
@@ -153,8 +156,10 @@ function log_nfsd_create(fhp:long,filename:string,type:long,
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_CREATE_ENTRY,"%1b%8b%8b%8b%0s%4b%2b%4b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],THIS->filename,
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],THIS->filename,
THIS->type,THIS->iap_valid,THIS->iap_mode);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.create.return
@@ -191,8 +196,10 @@ function log_nfsd_createv3(fhp:long,filename:string,createmode:long,
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_CREATEV3_ENTRY,"%1b%8b%8b%8b%0s%1b%2b%4b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],THIS->filename,
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],THIS->filename,
THIS->createmode,THIS->iap_valid,THIS->iap_mode);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.createv3.return
@@ -227,8 +234,10 @@ function log_nfsd_unlink(fhp:long,filename:string,type:long)%{ /*pure*/
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_UNLINK_ENTRY,"%1b%8b%8b%8b%0s%4b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],
THIS->filename,THIS->type);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.unlink.return
@@ -264,9 +273,11 @@ function log_nfsd_rename(fhp:long,filename:string,tfhp:long,tname:string)%{ /*pu
decode_fh(&fhp->fh_handle,old_ino);
decode_fh(&tfhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_RENAME_ENTRY,"%1b%8b%8b%8b%0s%1b%8b%8b%8b%0s",
- (_FMT_)fhp->fh_handle.fh_size,old_ino[0],old_ino[1],old_ino[2],
- THIS->filename, (_FMT_)tfhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],
- THIS->tname);
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ old_ino[0],old_ino[1],old_ino[2], THIS->filename,
+ (_FMT_)kread(&(tfhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2], THIS->tname);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.rename.return
@@ -301,8 +312,10 @@ function log_nfsd_open(fhp:long,type:long,access:long)%{ /*pure*/
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_OPEN_ENTRY,"%1b%8b%8b%8b%4b%1b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],
THIS->type,THIS->access);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.open.return
@@ -366,8 +379,10 @@ function log_nfsd_read(fhp:long,count:long,offset:long,
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_READ_ENTRY,"%1b%8b%8b%8b%8b%8b%8b%8b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],
- THIS->count,THIS->offset,(_FMT_)vec->iov_len,THIS->vlen);
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2], THIS->count,THIS->offset,
+ (_FMT_)kread(&(vec->iov_len)), THIS->vlen);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.read.return
@@ -403,8 +418,10 @@ function log_nfsd_write(fhp:long,count:long,offset:long,
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_WRITE_ENTRY,"%1b%8b%8b%8b%8b%8b%8b%8b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],
- THIS->count,THIS->offset,(_FMT_)vec->iov_len,THIS->vlen);
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2], THIS->count,THIS->offset,
+ (_FMT_)kread(&(vec->iov_len)), THIS->vlen);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.write.return
@@ -438,8 +455,9 @@ function log_nfsd_commit(fhp:long,count:long,offset:long)%{ /*pure*/
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_COMMIT_ENTRY,"%1b%8b%8b%8b%8b%8b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],
- THIS->count,THIS->offset);
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2], THIS->count,THIS->offset);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.commit.return
@@ -499,8 +517,9 @@ function log_nfsd_proc_lookup(fh:long,version:long,filename:string)%{ /*pure*/
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_PROC_LOOKUP_ENTRY,"%1b%8b%8b%8b%1b%0s",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],
- THIS->version,THIS->filename);
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2], THIS->version,THIS->filename);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.proc.lookup.return
@@ -536,8 +555,10 @@ function log_nfsd_proc_read(fhp:long,version:long,count:long,offset:long,
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_PROC_READ_ENTRY,"%1b%8b%8b%8b%1b%8b%8b%8b%8b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],THIS->version,
- THIS->count,THIS->offset,(_FMT_)vec->iov_len,THIS->vlen);
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],THIS->version,
+ THIS->count,THIS->offset,(_FMT_)kread(&(vec->iov_len)), THIS->vlen);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.proc.read.return
@@ -573,8 +594,10 @@ function log_nfsd_proc_write(fhp:long,version:long,count:long,offset:long,
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_PROC_WRITE_ENTRY,"%1b%8b%8b%8b%1b%8b%8b%8b%8b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],THIS->version,
- THIS->count,THIS->offset,(_FMT_)vec->iov_len,THIS->vlen);
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],THIS->version,
+ THIS->count,THIS->offset,(_FMT_)kread(&(vec->iov_len)), THIS->vlen);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.proc.write.return
@@ -608,8 +631,10 @@ function log_nfsd_proc_commit(fhp:long,version:long,count:long,offset:long)%{ /*
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_PROC_COMMIT_ENTRY,"%1b%8b%8b%8b%1b%8b%8b",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],THIS->version,
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],THIS->version,
THIS->count,THIS->offset);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.proc.commit.return
@@ -671,8 +696,10 @@ function log_nfsd_proc_remove(fhp:long,version:long,filename:string)%{ /*pure*/
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_PROC_REMOVE_ENTRY,"%1b%8b%8b%8b%1b%0s",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],THIS->version,
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],THIS->version,
THIS->filename);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.proc.remove.return
@@ -708,9 +735,11 @@ function log_nfsd_proc_rename(fhp:long,version:long,filename:string,
decode_fh(&fhp->fh_handle,o_ino);
decode_fh(&tfhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_PROC_RENAME_ENTRY,"%1b%1b%8b%8b%8b%0s%1b%8b%8b%8b%0s",
- THIS->version,(_FMT_)fhp->fh_handle.fh_size,o_ino[0],o_ino[1],o_ino[2],
- THIS->filename, (_FMT_)tfhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],
- THIS->tname);
+ THIS->version,(_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ o_ino[0],o_ino[1],o_ino[2], THIS->filename,
+ (_FMT_)kread(&(tfhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2], THIS->tname);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.proc.rename.return
@@ -744,8 +773,10 @@ function log_nfsd_proc_create(fhp:long,version:long,filename:string)%{ /*pure*/
decode_fh(&fhp->fh_handle,i_ino);
_lket_trace(_GROUP_NFSD,_HOOKID_NFSD_PROC_CREATE_ENTRY,"%1b%8b%8b%8b%1b%0s",
- (_FMT_)fhp->fh_handle.fh_size,i_ino[0],i_ino[1],i_ino[2],
+ (_FMT_)kread(&(fhp->fh_handle.fh_size)),
+ i_ino[0],i_ino[1],i_ino[2],
THIS->version,THIS->filename);
+ CATCH_DEREF_FAULT();
%}
probe addevent.nfsd.proc.create.return
diff --git a/tapset/LKET/process.stp b/tapset/LKET/process.stp
index fb02614b..41f6d3f1 100755
--- a/tapset/LKET/process.stp
+++ b/tapset/LKET/process.stp
@@ -14,7 +14,8 @@ function log_execve_tracedata(var:long)
long tmp=(long)THIS->var;
_lket_trace(_GROUP_PROCESS, _HOOKID_PROCESS_EXECVE, "%4b%4b%4b%0s",
(_FMT_)current->pid, (_FMT_)current->tgid,
- (_FMT_)current->parent->tgid, (char *)tmp);
+ (_FMT_)current->parent->tgid,
+ (char *)tmp /* FIXME: deref hazard! */);
%}
@@ -26,8 +27,12 @@ function log_fork_tracedata(task:long)
_lket_trace(_GROUP_PROCESS, THIS->var_id, "%4b", (_FMT_)pid);
*/
struct task_struct *task = (struct task_struct *)((long)THIS->task);
- _lket_trace(_GROUP_PROCESS, _HOOKID_PROCESS_FORK, "%4b%4b%4b", (_FMT_)task->pid,
- (_FMT_)task->tgid, (_FMT_)task->parent->tgid);
+ struct task_struct *parent = kread(&(task->parent));
+ _lket_trace(_GROUP_PROCESS, _HOOKID_PROCESS_FORK, "%4b%4b%4b",
+ (_FMT_)kread(&(task->pid)),
+ (_FMT_)kread(&(task->tgid)),
+ (_FMT_)kread(&(parent->tgid)));
+ CATCH_DEREF_FAULT();
%}
@@ -47,6 +52,7 @@ function process_snapshot()
/* iterate all the processes, and record the pid and process
name for each entry */
+ /* FIXME: need some sort of lock before doing this! */
for_each_process(tsk) {
_lket_trace(_GROUP_PROCESS, _HOOKID_PROCESS_SNAPSHOT, "%4b%4b%4b%0s",
(_FMT_)tsk->pid, (_FMT_)tsk->tgid, (_FMT_)tsk->parent->tgid, tsk->comm);
diff --git a/tapset/LKET/timestamp.stp b/tapset/LKET/timestamp.stp
index 471177a9..b450bd67 100755
--- a/tapset/LKET/timestamp.stp
+++ b/tapset/LKET/timestamp.stp
@@ -37,12 +37,11 @@ function set_timing_method(method:long)
%{
if(THIS->method == TIMING_SCHEDCLOCK) {
pfn_schedclock = (pfn_schedclock_type)kallsyms_lookup_name("sched_clock");
- if(!pfn_schedclock) {
+ if(!pfn_schedclock)
_stp_warn("Failed to lookup specified timing method sched_clock()\n");
- return;
- }
- }
- if(THIS->method > 0 && THIS->method <= MAX_TIMING_METHOD)
+ else
+ timing_method = THIS->method;
+ } else if(THIS->method > 0 && THIS->method <= MAX_TIMING_METHOD)
timing_method = THIS->method;
%}
diff --git a/tapset/LKET/tskdispatch.stp b/tapset/LKET/tskdispatch.stp
index eeca9f06..05103f96 100755
--- a/tapset/LKET/tskdispatch.stp
+++ b/tapset/LKET/tskdispatch.stp
@@ -63,8 +63,11 @@ function log_ctxswitch_tracedata(var_id:long, prev:long, next_pid:long)
prev_tsk = (struct task_struct *)((long)THIS->prev);
next_tsk = (struct task_struct *)((long)THIS->next_pid);
- _lket_trace(_GROUP_TASK, THIS->var_id, "%4b%4b%1b", (_FMT_)prev_tsk->pid,
- (_FMT_)next_tsk->pid, (_FMT_)prev_tsk->state);
+ _lket_trace(_GROUP_TASK, THIS->var_id, "%4b%4b%1b",
+ (_FMT_)kread(&(prev_tsk->pid)),
+ (_FMT_)kread(&(next_tsk->pid)),
+ (_FMT_)kread(&(prev_tsk->state)));
+ CATCH_DEREF_FAULT();
%}
function log_cpuidle_tracedata(var_id:long)
diff --git a/tapset/LKET/utils.stp b/tapset/LKET/utils.stp
index 5bff6a9f..8edab81e 100755
--- a/tapset/LKET/utils.stp
+++ b/tapset/LKET/utils.stp
@@ -23,13 +23,10 @@ function filter_by_pid:long()
*/
if( _stp_target != 0 && cur->tgid != _stp_target) {
THIS->__retvalue = 0;
- return;
- }
-
- THIS->__retvalue = 1;
+ } else
+ THIS->__retvalue = 1;
} else /*skip the events generated by stap itself*/
THIS->__retvalue = 0;
- return;
%}
function reset_maxaction()
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp
index 4d578fd5..b9ff9776 100644
--- a/tapset/aux_syscalls.stp
+++ b/tapset/aux_syscalls.stp
@@ -34,15 +34,13 @@ function _struct_compat_timeval_u:string(uaddr:long)
function _struct_timeval:string(addr:long)
%{ /* pure */
- struct timeval *tv;
- char *ptr = (char *)(unsigned long)THIS->addr;
+ struct timeval *tv = (struct timeval *)(unsigned long)THIS->addr;
- if (ptr == NULL)
+ if (tv == NULL)
strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN);
- else {
- tv=(struct timeval *) ptr;
- snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%ld.%06ld]", tv->tv_sec, tv->tv_usec);
- }
+ else
+ snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%ld.%06ld]",
+ kread(&(tv->tv_sec)), kread(&(tv->tv_usec)));
%}
function _struct_timezone_u:string(uaddr:long)
@@ -166,15 +164,14 @@ function _struct_compat_timespec_u:string(uaddr:long)
function _struct_timespec:string(addr:long)
%{ /* pure */
- struct timespec *ts;
- char *ptr = (char *)(unsigned long)THIS->addr;
+ struct timespec *ts = (struct timespec *)(unsigned long)THIS->addr;
- if (ptr == NULL)
+ if (ts == NULL)
strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN);
else {
- ts = (struct timespec *) ptr;
snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%ld.%09ld]",
- (unsigned long)ts->tv_sec, (unsigned long)ts->tv_nsec);
+ (unsigned long)kread(&(ts->tv_sec)),
+ (unsigned long)kread(&(ts->tv_nsec)));
}
%}
@@ -231,16 +228,16 @@ function _struct_compat_itimerval_u:string(uaddr:long)
function _struct_itimerval:string(addr:long)
%{ /* pure */
- struct itimerval *itv;
- char *ptr = (char *)(unsigned long)THIS->addr;
+ struct itimerval *itv = (char *)(unsigned long)THIS->addr;
- if (ptr == NULL)
+ if (itv == NULL)
strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN);
else {
- itv = (struct itimerval *) ptr;
snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%d.%06d,%d.%06d]",
- (int)itv->it_interval.tv_sec, (int)itv->it_interval.tv_usec,
- (int)itv->it_value.tv_sec, (int)itv->it_value.tv_usec);
+ (int)kread(&(itv->it_interval.tv_sec)),
+ (int)kread(&(itv->it_interval.tv_usec)),
+ (int)kread(&(itv->it_value.tv_sec)),
+ (int)kread(&(itv->it_value.tv_usec)));
}
%}
@@ -637,16 +634,6 @@ function __get_argv:string(a:long)
%}
/*
-* This function is used when a long is really a pointer and we need
-* the string it points to. Should be rarely necessary.
-*/
-function __string:string (a:long)
-%{ /* pure */
- char *str =(char *)(long)THIS->a;
- strlcpy(THIS->__retvalue, str, MAXSTRINGLEN);
-%}
-
-/*
* Return a integer member value of struct
* timezone user space pointer parameter
* CALLERS:
@@ -683,8 +670,7 @@ function __uget_timex_m:long(u_addr:long,member:long)
if(copy_from_user(&tx,ptr,sz)) {
THIS->__retvalue = -EFAULT;
- return;
- }
+ } else
switch(THIS->member) {
case 0: THIS->__retvalue = tx.modes;
break;
diff --git a/tapset/errno.stp b/tapset/errno.stp
index 74634e28..061947b9 100644
--- a/tapset/errno.stp
+++ b/tapset/errno.stp
@@ -357,31 +357,33 @@ function returnstr:string (returnp:long) %{ /* pure */
/* XXX: unfortunate duplication with return.stp:retval() */
- if (CONTEXT->regs) {
+ if (CONTEXT->regs) {
#if defined (__i386__)
- ret = CONTEXT->regs->eax;
+ ret = CONTEXT->regs->eax;
#elif defined (__x86_64__)
- ret = CONTEXT->regs->rax;
+ ret = CONTEXT->regs->rax;
#elif defined (__powerpc64__)
- ret = CONTEXT->regs->gpr[3];
+ ret = CONTEXT->regs->gpr[3];
#elif defined (__ia64__)
- ret = CONTEXT->regs->r8;
+ ret = CONTEXT->regs->r8;
#elif defined (__sparc64__)
- ret = CONTEXT->regs->u_regs[UREG_RETPC];
+ ret = CONTEXT->regs->u_regs[UREG_RETPC];
#elif defined (__s390x__)
ret = CONTEXT->regs->gprs[2];
#else
- return;
-#endif
- } else
- return;
-
- if (ret < 0 && ret > -Maxerrno && errlist[-ret])
- snprintf (THIS->__retvalue, MAXSTRINGLEN, "%ld (%s)", ret, errlist[-ret]);
- else if (THIS->returnp == 2)
- snprintf (THIS->__retvalue, MAXSTRINGLEN, "0x%lx", ret);
- else if (THIS->returnp == 3)
- snprintf (THIS->__retvalue, MAXSTRINGLEN, "%#lo", ret);
- else
- snprintf (THIS->__retvalue, MAXSTRINGLEN, "%ld", ret);
+ goto no_ret;
+#endif
+
+ if (ret < 0 && ret > -Maxerrno && errlist[-ret])
+ snprintf (THIS->__retvalue, MAXSTRINGLEN, "%ld (%s)", ret, errlist[-ret]);
+ else if (THIS->returnp == 2)
+ snprintf (THIS->__retvalue, MAXSTRINGLEN, "0x%lx", ret);
+ else if (THIS->returnp == 3)
+ snprintf (THIS->__retvalue, MAXSTRINGLEN, "%#lo", ret);
+ else
+ snprintf (THIS->__retvalue, MAXSTRINGLEN, "%ld", ret);
+ } else {
+no_ret:
+ strlcpy(THIS->__retvalue, "N/A", MAXSTRINGLEN);
+ }
%}
diff --git a/tapset/inet_sock.stp b/tapset/inet_sock.stp
index 995bdcfb..b3daeb68 100644
--- a/tapset/inet_sock.stp
+++ b/tapset/inet_sock.stp
@@ -25,23 +25,18 @@
// Get local port number
function inet_get_local_port:long(sock:long)
%{
- unsigned long ptr = (unsigned long) THIS->sock;
- struct inet_sock *inet = (struct inet_sock *) ptr;
- THIS->__retvalue = deref(sizeof(LPORT), &(LPORT));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ struct inet_sock *inet = (struct inet_sock *) (long) THIS->sock;
+ THIS->__retvalue = kread(&(LPORT));
+ CATCH_DEREF_FAULT();
%}
// Get IP source address string
function inet_get_ip_source:string(sock:long)
%{
- unsigned long ptr = (unsigned long) THIS->sock;
- struct inet_sock *inet = (struct inet_sock *) ptr;
- unsigned char addr[4];
-
- memcpy(addr, DADDR, sizeof(addr));
+ struct inet_sock *inet = (struct inet_sock *) (long) THIS->sock;
+ union { __u32 d; unsigned char addr[4]; } u;
+ u.d = kread(DADDR);
sprintf(THIS->__retvalue, "%d.%d.%d.%d",
- addr[0], addr[1], addr[2], addr[3]);
+ u.addr[0], u.addr[1], u.addr[2], u.addr[3]);
+ CATCH_DEREF_FAULT();
%}
diff --git a/tapset/ioblock.stp b/tapset/ioblock.stp
index a9be060b..761818fc 100644
--- a/tapset/ioblock.stp
+++ b/tapset/ioblock.stp
@@ -15,102 +15,56 @@
/* get i-node number of mapped file */
function __bio_ino:long(bio:long)
%{
- struct bio *bio;
- struct page *bv_page;
- struct address_space *mapping;
- struct inode *host;
-
- bio = (struct bio *)(long)THIS->bio;
- bv_page = (struct page*)deref(sizeof(bio->bi_io_vec[0].bv_page),
- &(bio->bi_io_vec[0].bv_page));
- if (bv_page == NULL) {
- THIS->__retvalue = -1;
- goto end;
- }
- mapping = (struct address_space*)deref(sizeof(bv_page->mapping),
- &(bv_page->mapping));
- if (mapping == NULL) {
- THIS->__retvalue = -1;
- goto end;
- }
- host = (struct inode*)deref(sizeof(mapping->host),
- &(mapping->host));
- if (host == NULL) {
- THIS->__retvalue = -1;
- goto end;
- }
- THIS->__retvalue = deref(sizeof(host->i_ino), &(host->i_ino));
-
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
-end: ;
+ struct bio *bio = (struct bio *)(long)THIS->bio;
+ struct page *bv_page = bio? kread(&(bio->bi_io_vec[0].bv_page)) : NULL;
+ struct address_space *mapping = bv_page? kread(&(bv_page->mapping)) : NULL;
+ struct inode *host = mapping? kread(&(mapping->host)) : NULL;
+ if (host == NULL)
+ THIS->__retvalue = -1;
+ else
+ THIS->__retvalue = kread(&(host->i_ino));
+ CATCH_DEREF_FAULT();
%}
/* returns 0 for read, 1 for write */
function bio_rw_num:long(rw:long)
%{
- long rw = (long)THIS->rw;
- THIS->__retvalue = (rw & (1 << BIO_RW));
+ long rw = (long)THIS->rw;
+ THIS->__retvalue = (rw & (1 << BIO_RW));
%}
/* returns R for read, W for write */
function bio_rw_str(rw)
{
- return bio_rw_num(rw) == BIO_READ ? "R" : "W"
+ return bio_rw_num(rw) == BIO_READ ? "R" : "W"
}
/* returns start sector */
function __bio_start_sect:long(bio:long)
%{
- struct bio *bio;
- struct block_device *bi_bdev;
- struct hd_struct *bd_part;
-
- bio = (struct bio *)(long)THIS->bio;
- bi_bdev = (struct block_device *)deref(sizeof(bio->bi_bdev),
- &(bio->bi_bdev));
- if (bi_bdev == NULL) {
- THIS->__retvalue = -1;
- goto end;
- }
- bd_part = (struct hd_struct *)deref(sizeof(bi_bdev->bd_part),
- &(bi_bdev->bd_part));
- if (bd_part == NULL) {
- THIS->__retvalue = -1;
- goto end;
- }
-
- /*
- There is a bug in deref() that prevents the code below.
- THIS->__retvalue = deref(sizeof(bd_part->start_sect),
- &(bd_part->start_sect));
- */
-
- THIS->__retvalue = bd_part->start_sect;
-
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
-end: ;
+ struct bio *bio = (struct bio *)(long)THIS->bio;
+ struct block_device *bi_bdev = bio? kread(&(bio->bi_bdev)) : NULL;
+ struct hd_struct *bd_part = bi_bdev? kread(&(bi_bdev->bd_part)) : NULL;
+ if (bd_part == NULL)
+ THIS->__retvalue = -1;
+ else
+ THIS->__retvalue = kread(&(bd_part->start_sect));
+ CATCH_DEREF_FAULT();
%}
/* returns the block device name */
function __bio_devname:string(bio:long)
%{
- char b[BDEVNAME_SIZE];
- struct bio *bio = (struct bio *)(long)THIS->bio;
- if (bio == NULL || bio->bi_bdev == NULL) {
- strlcpy(THIS->__retvalue, "N/A", MAXSTRINGLEN);
- return;
- }
- deref_string(THIS->__retvalue, bdevname(bio->bi_bdev,b), MAXSTRINGLEN);
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ char b[BDEVNAME_SIZE];
+ struct bio *bio = (struct bio *)(long)THIS->bio;
+ struct block_device *bdev = kread(&(bio->bi_bdev));
+ if (bdev == NULL) {
+ strlcpy(THIS->__retvalue, "N/A", MAXSTRINGLEN);
+ } else {
+ const char *name = bdevname(bdev, b); /* FIXME: deref hazard! */
+ deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
+ }
+ CATCH_DEREF_FAULT();
%}
global BIO_READ, BIO_WRITE
diff --git a/tapset/ioscheduler.stp b/tapset/ioscheduler.stp
index ba732b65..49be6217 100644
--- a/tapset/ioscheduler.stp
+++ b/tapset/ioscheduler.stp
@@ -109,30 +109,30 @@ probe ioscheduler.elv_completed_request
function disk_major_from_request:long(var_q:long)
%{ /* pure */
- struct request_queue *q;
- struct request *rq;
+ struct request_queue *q = (struct request_queue *)((long)THIS->var_q);
+ struct list_head *queue_head = &(q->queue_head);
- q = (struct request_queue *)((long)THIS->var_q);
-
- if(list_empty(&(q->queue_head)))
+ if (list_empty(&(q->queue_head))) /* FIXME: deref hazard! */
THIS->__retvalue = -1;
else {
- rq = list_entry_rq(q->queue_head.next);
- THIS->__retvalue = rq->rq_disk->first_minor;
+ struct request *rq = list_entry_rq(q->queue_head.next); /* FIXME: deref hazard! */
+ struct gendisk *rq_disk = kread(&(rq->rq_disk));
+ THIS->__retvalue = kread(&(rq_disk->major));
}
+ CATCH_DEREF_FAULT();
%}
function disk_minor_from_request:long(var_q:long)
%{ /* pure */
- struct request_queue *q;
- struct request *rq;
-
- q = (struct request_queue *)((long)THIS->var_q);
+ struct request_queue *q = (struct request_queue *)((long)THIS->var_q);
+ struct list_head *queue_head = &(q->queue_head);
- if(list_empty(&(q->queue_head)))
+ if (list_empty(&(q->queue_head))) /* FIXME: deref hazard! */
THIS->__retvalue = -1;
else {
- rq = list_entry_rq(q->queue_head.next);
- THIS->__retvalue = rq->rq_disk->first_minor;
+ struct request *rq = list_entry_rq(q->queue_head.next); /* FIXME: deref hazard! */
+ struct gendisk *rq_disk = kread(&(rq->rq_disk));
+ THIS->__retvalue = kread(&(rq_disk->first_minor));
}
+ CATCH_DEREF_FAULT();
%}
diff --git a/tapset/nfs.stp b/tapset/nfs.stp
index 39040c68..083688ca 100644
--- a/tapset/nfs.stp
+++ b/tapset/nfs.stp
@@ -2,282 +2,245 @@
#include <linux/kernel.h>
#include <linux/nfs_fs.h>
%}
-/*Get struct nfs_inode from struct inode*/
-%{
- struct nfs_inode * __nfs_i (struct inode *inode)
- {
- struct nfs_inode * nfsi = NFS_I(inode);
-
- return (nfsi);
- }
-%}
/*Get cache_validity flag from struct inode*/
function __nfsi_cache_valid:long(inode:long) %{ /* pure */
- struct inode * inode = (struct inode *)(THIS->inode);
- struct nfs_inode * nfsi;
+ struct inode * inode = (struct inode *)(long)(THIS->inode);
if(inode == NULL)
- {
THIS->__retvalue = -1;
- return;
+ else {
+ struct nfs_inode * nfsi = NFS_I(inode);
+ THIS->__retvalue = kread(&(nfsi->cache_validity));
}
- nfsi = __nfs_i(inode);
- THIS->__retvalue = nfsi->cache_validity;
+ CATCH_DEREF_FAULT();
%}
/*Get read_cache_jiffies from struct inode*/
function __nfsi_rcache_time :long (inode:long) %{ /* pure */
- struct inode * inode = (struct inode *)(THIS->inode);
- struct nfs_inode * nfsi ;
+ struct inode * inode = (struct inode *)(long)(THIS->inode);
if(inode == NULL)
- {
THIS->__retvalue = -1;
- return;
+ else {
+ struct nfs_inode * nfsi = NFS_I(inode);
+ THIS->__retvalue = kread(&(nfsi->read_cache_jiffies));
}
-
- nfsi = (struct nfs_inode *) __nfs_i(inode);
-
- THIS->__retvalue = nfsi->read_cache_jiffies;
+ CATCH_DEREF_FAULT();
%}
/*Get attrtimeo from struct inode*/
function __nfsi_attr_time :long (inode:long) %{ /* pure */
- struct inode * inode = (struct inode *)(THIS->inode);
- struct nfs_inode * nfsi ;
+ struct inode * inode = (struct inode *)(long)(THIS->inode);
if(inode == NULL)
- {
THIS->__retvalue = -1;
- return;
+ else {
+ struct nfs_inode * nfsi = NFS_I(inode);
+ THIS->__retvalue = kread(&(nfsi->attrtimeo));
}
- nfsi= (struct nfs_inode *) __nfs_i(inode);
-
- THIS->__retvalue = nfsi->attrtimeo;
+ CATCH_DEREF_FAULT();
%}
/*Get ndirty from struct inode*/
function __nfsi_ndirty:long (inode:long) %{ /* pure */
- struct inode *inode = (struct inode *)((long)THIS->inode);
- struct nfs_inode *nfsi ;
-
- if(inode == NULL)
- {
- THIS->__retvalue = -1;
- return;
- }
- nfsi = NFS_I(inode);
-
- THIS->__retvalue = nfsi->ndirty;
+ struct inode * inode = (struct inode *)(long)(THIS->inode);
+
+ if(inode == NULL)
+ THIS->__retvalue = -1;
+ else {
+ struct nfs_inode * nfsi = NFS_I(inode);
+ THIS->__retvalue = kread(&(nfsi->ndirty));
+ }
+ CATCH_DEREF_FAULT();
%}
/*Get rsize from struct inode*/
function __nfs_server_rsize:long (inode:long) %{ /* pure */
- struct inode * inode = (struct inode *)((long)THIS->inode);
-
- if(inode == NULL)
- {
- THIS->__retvalue = -1;
- return;
- }
- THIS->__retvalue = NFS_SERVER(inode)->rsize;
+ struct inode * inode = (struct inode *)(long)(THIS->inode);
+
+ if(inode == NULL)
+ THIS->__retvalue = -1;
+ else {
+ struct nfs_server * nfs_srv = NFS_SERVER(inode); /* FIXME: deref hazard! */
+ THIS->__retvalue = kread(&(nfs_srv->rsize));
+ }
+ CATCH_DEREF_FAULT();
%}
/*Get version from struct inode*/
function __nfs_version:long (inode:long) %{ /* pure */
- struct inode * inode = (struct inode *)((long)THIS->inode);
-
- if(inode == NULL)
- {
- THIS->__retvalue = -1;
- return;
- }
- THIS->__retvalue = NFS_PROTO(inode)->version;
+ struct inode * inode = (struct inode *)(long)(THIS->inode);
+
+ if(inode == NULL)
+ THIS->__retvalue = -1;
+ else {
+ const struct nfs_rpc_ops *rpc_ops = NFS_PROTO(inode); /* FIXME: deref hazard! */
+ THIS->__retvalue = kread(&(rpc_ops->version));
+ }
+ CATCH_DEREF_FAULT();
%}
/*Get wsize from struct inode*/
function __nfs_server_wsize:long (inode:long) %{ /* pure */
- struct inode * inode = (struct inode *)((long)THIS->inode);
-
- if(inode == NULL)
- {
- THIS->__retvalue = -1;
- return;
- }
- THIS->__retvalue = NFS_SERVER(inode)->wsize;
+ struct inode * inode = (struct inode *)(long)(THIS->inode);
+
+ if(inode == NULL)
+ THIS->__retvalue = -1;
+ else {
+ struct nfs_server * nfs_srv = NFS_SERVER(inode); /* FIXME: deref hazard! */
+ THIS->__retvalue = kread(&(nfs_srv->wsize));
+ }
+ CATCH_DEREF_FAULT();
%}
/*Get rpages from struct inode*/
function __nfs_rpages:long (inode:long) %{ /* pure */
- struct inode * inode = (struct inode *)((long)THIS->inode);
-
- if(inode == NULL)
- {
- THIS->__retvalue = -1;
- return;
- }
- THIS->__retvalue = NFS_SERVER(inode)->rpages;
+ struct inode * inode = (struct inode *)(long)(THIS->inode);
+
+ if(inode == NULL)
+ THIS->__retvalue = -1;
+ else {
+ struct nfs_server * nfs_srv = NFS_SERVER(inode); /* FIXME: deref hazard! */
+ THIS->__retvalue = kread(&(nfs_srv->rpages));
+ }
+ CATCH_DEREF_FAULT();
%}
/*Get wpages from struct inode*/
function __nfs_wpages:long(inode:long) %{ /* pure */
- struct inode *inode = (struct inode*)((long)THIS->inode);
- if(inode == NULL)
- {
- THIS->__retvalue = -1;
- return;
- }
- THIS->__retvalue = NFS_SERVER(inode)->wpages;
+ struct inode * inode = (struct inode *)(long)(THIS->inode);
+
+ if(inode == NULL)
+ THIS->__retvalue = -1;
+ else {
+ struct nfs_server * nfs_srv = NFS_SERVER(inode); /* FIXME: deref hazard! */
+ THIS->__retvalue = kread(&(nfs_srv->wpages));
+ }
+ CATCH_DEREF_FAULT();
%}
/*Get struct inode from struct page*/
function __p2i :long(page:long) %{ /* pure */
- struct page *page = (struct page *)((long)THIS->page);
-
- if ((page == NULL) || (page->mapping == NULL)) {
- THIS->__retvalue = 0;
- return;
- }
-
- THIS->__retvalue = deref(sizeof(page->mapping->host),
- &(page->mapping->host));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ struct page *page = (struct page *)((long)THIS->page);
+ struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
+
+ if (mapping == NULL)
+ THIS->__retvalue = 0;
+ else
+ THIS->__retvalue = (long)kread(&(mapping->host));
+ CATCH_DEREF_FAULT();
%}
/*Get i_flags from struct page*/
function __p2i_flag : long (page:long) %{ /* pure */
- struct page *page = (struct page *) (THIS->page);
-
- if ((page == NULL) || (page->mapping == NULL) \
- ||(page->mapping->host == NULL)) {
- THIS->__retvalue = -1;
- return;
- }
+ struct page *page = (struct page *)((long)THIS->page);
+ struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
+ struct inode *host = mapping? kread(&(mapping->host)) : NULL;
- THIS->__retvalue = deref(sizeof(page->mapping->host->i_flags),
- &(page->mapping->host->i_flags));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ if (host == NULL)
+ THIS->__retvalue = -1;
+ else
+ THIS->__retvalue = kread(&(host->i_flags));
+ CATCH_DEREF_FAULT();
%}
/*Get i_state from struct page*/
function __p2i_state :long (page:long) %{ /* pure */
- struct page *page = (struct page *) (THIS->page);
-
- if ((page == NULL) || (page->mapping == NULL) \
- ||(page->mapping->host == NULL)) {
- THIS->__retvalue = -1;
- return;
- }
+ struct page *page = (struct page *)((long)THIS->page);
+ struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
+ struct inode *host = mapping? kread(&(mapping->host)) : NULL;
- THIS->__retvalue = deref(sizeof(page->mapping->host->i_state),
- &(page->mapping->host->i_state));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ if (host == NULL)
+ THIS->__retvalue = -1;
+ else
+ THIS->__retvalue = kread(&(host->i_state));
+ CATCH_DEREF_FAULT();
%}
/*Get i_size from struct page*/
function __p2i_size :long (page:long) %{ /* pure */
- struct page *page = (struct page *) (THIS->page);
-
- if ((page == NULL) || (page->mapping == NULL) \
- ||(page->mapping->host == NULL)) {
- THIS->__retvalue = -1;
- return;
- }
+ struct page *page = (struct page *)((long)THIS->page);
+ struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
+ struct inode *host = mapping? kread(&(mapping->host)) : NULL;
- THIS->__retvalue = deref(sizeof(page->mapping->host->i_size),
- &(page->mapping->host->i_size));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ if (host == NULL)
+ THIS->__retvalue = -1;
+ else
+ THIS->__retvalue = kread(&(host->i_size));
+ CATCH_DEREF_FAULT();
%}
/*Get s_flags from struct page*/
function __p2sb_flag:long (page:long) %{ /* pure */
- struct page *page = (struct page *)(THIS->page);
-
- if ((page == NULL) || (page->mapping == NULL) \
- ||(page->mapping->host == NULL)) {
- THIS->__retvalue = -1;
- return;
- }
+ struct page *page = (struct page *)((long)THIS->page);
+ struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
+ struct inode *host = mapping? kread(&(mapping->host)) : NULL;
+ struct super_block *i_sb = host? kread(&(host->i_sb)) : NULL;
- THIS->__retvalue = deref(sizeof(page->mapping->host->i_flags),
- &(page->mapping->host->i_flags));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ if (i_sb == NULL)
+ THIS->__retvalue = -1;
+ else
+ THIS->__retvalue = kread(&(i_sb->s_flags));
+ CATCH_DEREF_FAULT();
%}
function __d_loff_t :long (ppos :long) %{ /* pure */
- loff_t * ppos = (loff_t *) ((long)THIS->ppos);
-
- if (ppos == NULL)
- {
- THIS->__retvalue = -1;
- return;
- }
+ loff_t * ppos = (loff_t *) ((long)THIS->ppos);
- THIS->__retvalue = *ppos;
+ if (ppos == NULL)
+ THIS->__retvalue = -1;
+ else
+ THIS->__retvalue = kread(ppos);
+ CATCH_DEREF_FAULT();
%}
function __file_inode:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL) || (file->f_dentry == NULL)) {
- THIS->__retvalue = 0;
- return;
- }
- THIS->__retvalue = deref(sizeof(file->f_dentry->d_inode),
- &(file->f_dentry->d_inode));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ struct file *file = (struct file *)(long)THIS->file;
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ if (f_dentry == NULL)
+ THIS->__retvalue = 0;
+ else
+ THIS->__retvalue = (long)kread(&(f_dentry->d_inode));
+ CATCH_DEREF_FAULT();
%}
function __file_id:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL) || (file->f_dentry == NULL)) {
- THIS->__retvalue = 0;
- return;
- }
- THIS->__retvalue = (long)&(file->f_dentry->d_inode->i_sb->s_id);
+ struct file *file = (struct file *)(long)THIS->file;
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ if (f_dentry == NULL)
+ THIS->__retvalue = 0;
+ else {
+ struct inode *d_inode = kread(&(f_dentry->d_inode));
+ struct super_block *i_sb = kread(&(d_inode->i_sb));
+ THIS->__retvalue = (long)&(i_sb->s_id);
+ }
+ CATCH_DEREF_FAULT();
%}
function __file_mode:long (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL) || (file->f_dentry == NULL)) {
- THIS->__retvalue = 0;
- return;
- }
- THIS->__retvalue = deref(sizeof(file->f_dentry->d_inode->i_mode),
- &(file->f_dentry->d_inode->i_mode));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ struct file *file = (struct file *)(long)THIS->file;
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ if (f_dentry == NULL)
+ THIS->__retvalue = 0;
+ else {
+ struct inode *d_inode = kread(&(f_dentry->d_inode));
+ THIS->__retvalue = kread(&(d_inode->i_mode));
+ }
+ CATCH_DEREF_FAULT();
%}
function __file_parentname:string (file:long) %{ /* pure */
- struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL)
- || (file->f_dentry == NULL)
- || (file->f_dentry->d_parent == NULL))
- strlcpy(THIS->__retvalue, "NULL", MAXSTRINGLEN);
- else {
- strlcpy(THIS->__retvalue, file->f_dentry->d_parent->d_name->name, MAXSTRINGLEN);
- }
+ struct file *file = (struct file *)(long)THIS->file;
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ struct dentry *d_parent = f_dentry? kread(&(f_dentry->d_parent)) : NULL;
+ if (d_parent == NULL)
+ strlcpy(THIS->__retvalue, "NULL", MAXSTRINGLEN);
+ else {
+ const unsigned char *name = kread(&(d_parent->d_name.name));
+ deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
+ }
+ CATCH_DEREF_FAULT();
%}
probe nfs.fop.entries = nfs.fop.llseek,
diff --git a/tapset/nfs_proc.stp b/tapset/nfs_proc.stp
index b8226630..21e5371e 100644
--- a/tapset/nfs_proc.stp
+++ b/tapset/nfs_proc.stp
@@ -12,6 +12,7 @@
%{
__u32 get_ip(struct rpc_task * task)
{
+ /* FIXME: deref hazards! */
struct rpc_clnt * tk_client;
struct rpc_xprt * cl_xprt;
struct sockaddr_in *addr;
@@ -25,6 +26,7 @@
}
int get_prot(struct rpc_task * task)
{
+ /* FIXME: deref hazards! */
struct rpc_clnt * tk_client;
struct rpc_xprt * cl_xprt;
tk_client = task->tk_client;
@@ -40,18 +42,18 @@
function __i2n_ip_proto :long(dir:long,index:long) %{ /* pure */
int index = (int) (THIS->index);
struct inode * dir = (struct inode *)(THIS->dir);
- struct rpc_clnt * clnt = NFS_CLIENT(dir);
- struct rpc_xprt * cl_xprt = clnt->cl_xprt;
- struct sockaddr_in * addr = (struct sockaddr_in *)&(cl_xprt->addr);
+ struct rpc_clnt * clnt = NFS_CLIENT(dir); /* FIXME: deref hazard! */
+ struct rpc_xprt * cl_xprt = kread(&(clnt->cl_xprt));
if(index == 0) {
- if (addr->sin_family == AF_INET) {
+ if (kread(&(cl_xprt->addr.sin_family)) == AF_INET) {
/* Now consider ipv4 only */
- THIS->__retvalue = addr->sin_addr.s_addr;
+ THIS->__retvalue = kread(&(cl_xprt->addr.sin_addr.s_addr));
} else
THIS->__retvalue = 0;
} else
- THIS->__retvalue = cl_xprt->prot;
+ THIS->__retvalue = kread(&(cl_xprt->prot));
+ CATCH_DEREF_FAULT();
%}
/*
@@ -75,20 +77,23 @@ function __nfs_read_data_info:long (rdata :long,index :long) %{ /* pure */
THIS->__retvalue = get_prot(task);
break;
case 2:
- THIS->__retvalue = rres->count;
+ THIS->__retvalue = kread(&(rres->count));
break;
- case 3:
- THIS->__retvalue = rres->fattr->valid;
+ case 3: {
+ struct nfs_fattr *fattr = kread(&(rres->fattr));
+ THIS->__retvalue = kread(&(fattr->valid));
break;
+ }
#ifdef CONFIG_NFS_V4
case 4:
- THIS->__retvalue = rdata->timestamp;
+ THIS->__retvalue = kread(&(rdata->timestamp));
break;
#endif
default:
THIS->__retvalue = 0;
break;
}
+ CATCH_DEREF_FAULT();
%}
/*
@@ -114,16 +119,17 @@ function __nfs_write_data_info:long (wdata :long,index :long) %{ /* pure */
function __nfsv4_bitmask :long(dir:long,i:long) %{ /* pure */
int i = (int) (THIS->i);
- struct inode * dir = (struct inode *)(THIS->dir);
- struct nfs_server * server = NFS_SERVER(dir);
+ struct inode * dir = (struct inode *)(long)(THIS->dir);
+ struct nfs_server * server = NFS_SERVER(dir); /* FIXME: deref hazard! */
- THIS->__retvalue = server->attr_bitmask[i];
+ THIS->__retvalue = kread(&(server->attr_bitmask[i]));
+ CATCH_DEREF_FAULT();
%}
function __getfh_inode :long(dir:long) %{ /* pure */
- struct inode * dir = (struct inode *)(THIS->dir);
- struct nfs_fh * fh = NFS_FH(dir);
+ struct inode * dir = (struct inode *)(long)(THIS->dir);
+ struct nfs_fh * fh = NFS_FH(dir); /* FIXME: deref hazard! */
THIS->__retvalue =(long) fh;
%}
diff --git a/tapset/nfsd.stp b/tapset/nfsd.stp
index 8d8a09a0..49f04f51 100644
--- a/tapset/nfsd.stp
+++ b/tapset/nfsd.stp
@@ -6,26 +6,6 @@
#include <linux/nfsd/xdr3.h>
%}
-%{
-/*Get file handle from struct svc_fh */
-char * fh_fmt(struct svc_fh * fhp)
-{
- struct knfsd_fh *fh = &fhp->fh_handle;
-
- static char buf[80];
- sprintf(buf, "%d: %08x %08x %08x %08x %08x %08x",
- fh->fh_size,
- fh->fh_base.fh_pad[0],
- fh->fh_base.fh_pad[1],
- fh->fh_base.fh_pad[2],
- fh->fh_base.fh_pad[3],
- fh->fh_base.fh_pad[4],
- fh->fh_base.fh_pad[5]);
- return buf;
-}
-
-%}
-
/*
*1 : nfsd.proc2.lookup
*2 : nfsd.proc3.lookup
@@ -61,7 +41,6 @@ function __get_fh:long(argp:long,index:long) %{ /* pure */
struct nfsd_renameargs *argpren = NULL;
struct nfsd3_renameargs *argpren3 = NULL;
struct svc_fh * fhp = NULL;
- char * buf;
switch(index)
{
@@ -112,32 +91,30 @@ function __get_fh:long(argp:long,index:long) %{ /* pure */
break;
}
- if(fhp == NULL)
- {
- _stp_printf("the fhp is NULL");
- return;
- }
- else
- {
- /* buf = fh_fmt(fhp);
- strlcpy (THIS->__retvalue,buf,80);*/
- THIS->__retvalue = (long)fhp;
- }
+ THIS->__retvalue = (long)fhp;
%}
-/*Get file handler from struct svc_fh , it will call
-fh_fmt function*/
+/*Get file handler from struct svc_fh */
function __svc_fh:string(fh :long) %{ /* pure */
- struct svc_fh * fhp = (struct svc_fh *) (THIS->fh);
- char * buf ;
-
- buf = fh_fmt(fhp);
- strlcpy (THIS->__retvalue,buf,80);
+ struct svc_fh * fhp = (struct svc_fh *) (long)(THIS->fh);
+ struct knfsd_fh *fh = &fhp->fh_handle;
+
+ snprintf(THIS->__retvalue, MAXSTRINGLEN,
+ "%d: %08x %08x %08x %08x %08x %08x",
+ kread(&(fh->fh_size)),
+ kread(&(fh->fh_base.fh_pad[0])),
+ kread(&(fh->fh_base.fh_pad[1])),
+ kread(&(fh->fh_base.fh_pad[2])),
+ kread(&(fh->fh_base.fh_pad[3])),
+ kread(&(fh->fh_base.fh_pad[4])),
+ kread(&(fh->fh_base.fh_pad[5])))
+ CATCH_DEREF_FAULT();
%}
function p_long:long(cnt:long) %{ /* pure */
unsigned long * count = (unsigned long *)((long)THIS->cnt);
- THIS->__retvalue = *count;
+ THIS->__retvalue = kread(count);
+ CATCH_DEREF_FAULT();
%}
/*
*probe nfsd.dispatch
diff --git a/tapset/rpc.stp b/tapset/rpc.stp
index ef001e9e..7a1c978d 100644
--- a/tapset/rpc.stp
+++ b/tapset/rpc.stp
@@ -822,79 +822,111 @@ probe sunrpc.sched.delay.return = kernel.function("rpc_delay").return ?,
function xid_from_clnt:long(clnt:long)
%{
struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
- THIS->__retvalue = clnt ? clnt->cl_xprt->xid : 0;
+ if (clnt == NULL)
+ THIS->__retvalue = 0;
+ else {
+ struct rpc_xprt *cl_xprt = kread(&(clnt->cl_xprt));
+ THIS->__retvalue = kread(&(cl_xprt->xid));
+ }
+ CATCH_DEREF_FAULT();
%}
function prog_from_clnt:long(clnt:long)
%{
struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
+ if (clnt == NULL)
+ THIS->__retvalue = 0;
+ else {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
- THIS->__retvalue = clnt ? clnt->cl_prog : 0;
+ THIS->__retvalue = kread(&(clnt->cl_prog));
#else
- THIS->__retvalue = clnt ? clnt->cl_pmap->pm_prog : 0;
+ struct rpc_portmap *cl_pmap = kread(&(clnt->cl_pmap));
+ THIS->__retvalue = kread(&(cl_pmap->pm_prog));
#endif
+ }
+ CATCH_DEREF_FAULT();
%}
function vers_from_clnt:long(clnt:long)
%{
struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
+ if (clnt == NULL)
+ THIS->__retvalue = 0;
+ else {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
- THIS->__retvalue = clnt ? clnt->cl_vers : 0;
+ THIS->__retvalue = kread(&(clnt->cl_vers));
#else
- THIS->__retvalue = clnt ? clnt->cl_pmap->pm_vers : 0;
+ struct rpc_portmap *cl_pmap = kread(&(clnt->cl_pmap));
+ THIS->__retvalue = kread(&(cl_pmap->pm_vers));
#endif
+ }
+ CATCH_DEREF_FAULT();
%}
function prot_from_clnt:long(clnt:long)
%{
struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
- THIS->__retvalue = clnt ? clnt->cl_xprt->prot : 0;
+ if (clnt == NULL)
+ THIS->__retvalue = 0;
+ else {
+ struct rpc_xprt *cl_xprt = kread(&(clnt->cl_xprt));
+ THIS->__retvalue = kread(&(cl_xprt->prot));
+ }
+ CATCH_DEREF_FAULT();
%}
function port_from_clnt:long(clnt:long)
%{
struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
- if(clnt != NULL) {
- struct sockaddr_in *addr = (struct sockaddr_in *)&(clnt->cl_xprt->addr);
- if(addr != NULL && addr->sin_family == AF_INET) {
- /* Now consider ipv4 only */
- THIS->__retvalue = ntohs(addr->sin_port);
- return;
- }
- }
- THIS->__retvalue = 0;
+ struct rpc_xprt *cl_xprt = clnt? kread(&(clnt->cl_xprt)) : NULL;
+ if (cl_xprt && kread(&(cl_xprt->addr.sin_family)) == AF_INET) {
+ /* Now consider ipv4 only */
+ THIS->__retvalue = ntohs(kread(&(cl_xprt->addr.sin_port)));
+ } else
+ THIS->__retvalue = 0;
+ CATCH_DEREF_FAULT();
%}
function clones_from_clnt:long(clnt:long)
%{
struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
- THIS->__retvalue = atomic_read(&clnt->cl_count);
+ THIS->__retvalue = atomic_read(&clnt->cl_count); /* FIXME: deref hazard! */
%}
function tasks_from_clnt:long(clnt:long)
%{
struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
- THIS->__retvalue = atomic_read(&clnt->cl_users);
+ THIS->__retvalue = atomic_read(&clnt->cl_users); /* FIXME: deref hazard! */
%}
function proc_from_msg:long(msg:long)
%{
struct rpc_message *msg = (struct rpc_message *)(long)THIS->msg;
- THIS->__retvalue = msg ? msg->rpc_proc->p_proc : 0;
+ if (msg == NULL)
+ THIS->__retvalue = 0;
+ else {
+ struct rpc_procinfo *rpc_proc = kread(&(msg->rpc_proc));
+ THIS->__retvalue = kread(&(rpc_proc->p_proc));
+ }
+ CATCH_DEREF_FAULT();
%}
function vers_from_prog:long(program:long, vers:long)
%{
struct rpc_program *program = (struct rpc_program *)(long)THIS->program;
- if (!program || THIS->vers >= program->nrvers || !program->version[THIS->vers])
+ if (program && THIS->vers < kread(&(program->nrvers))) {
+ struct rpc_version **version_array = kread(&(program->version));
+ struct rpc_version *version = kread(&(version_array[THIS->vers]));
+ THIS->__retvalue = kread(&(version->number));
+ } else
THIS->__retvalue = 0;
- else
- THIS->__retvalue = program->version[THIS->vers]->number;
+ CATCH_DEREF_FAULT();
%}
function addr_from_rqst:long(rqstp:long)
%{
struct svc_rqst *rqstp = (struct svc_rqst *)(long)THIS->rqstp;
- THIS->__retvalue = rqstp ? rqstp->rq_addr.sin_addr.s_addr : 0;
+ THIS->__retvalue = rqstp ? kread(&(rqstp->rq_addr.sin_addr.s_addr)) : 0;
+ CATCH_DEREF_FAULT();
%}
diff --git a/tapset/scsi.stp b/tapset/scsi.stp
index 23256893..5e467686 100644
--- a/tapset/scsi.stp
+++ b/tapset/scsi.stp
@@ -77,12 +77,13 @@ probe scsi.iocompleted
function scsi_timer_pending:long(var:long)
%{
struct scsi_cmnd *cmd = (struct scsi_cmnd *)((long)THIS->var);
- THIS->__retvalue = timer_pending(&cmd->eh_timeout);
+ THIS->__retvalue = timer_pending(&cmd->eh_timeout); /* FIXME: deref hazard! */
%}
function get_devstate_from_req:long(var:long)
%{
struct request_queue *q = (struct request_queue *)((long)THIS->var);
- struct scsi_device *sdev = (struct scsi_device *)(q->queuedata);
- THIS->__retvalue = sdev->sdev_state;
+ struct scsi_device *sdev = (struct scsi_device *)kread(&(q->queuedata));
+ THIS->__retvalue = kread(&(sdev->sdev_state));
+ CATCH_DEREF_FAULT();
%}
diff --git a/tapset/signal.stp b/tapset/signal.stp
index da220bab..33a2202c 100644
--- a/tapset/signal.stp
+++ b/tapset/signal.stp
@@ -450,19 +450,14 @@ probe signal.procmask = kernel.function("sigprocmask")
}
function get_sigset:long(sigset:long) %{ /* pure */
-
+ int i;
sigset_t *sigset = (sigset_t *)((long)THIS->sigset);
-
-if(_NSIG_BPW == 64)
- THIS->__retvalue = deref(sizeof(sigset_t), sigset);
-else if(_NSIG_BPW == 32)
- THIS->__retvalue = deref(sizeof(int), &(sigset->sig[0])) |
- ((u_int64_t)deref(sizeof(int), &(sigset->sig[1])))<<32;
-
- if(0) {
-deref_fault:
- CONTEXT->last_error = "pointer deref error";
+ THIS->__retvalue = kread(&(sigset->sig[0]));
+ for (i=1; i<_NSIG_WORDS; ++i) {
+ uint64_t part = kread(&(sigset->sig[i]));
+ THIS->__retvalue |= part << (_NSIG_BPW*i);
}
+ CATCH_DEREF_FAULT();
%}
probe signal.procmask.return = kernel.function("sigprocmask").return
diff --git a/tapset/socket.stp b/tapset/socket.stp
index 451dd36e..58732185 100644
--- a/tapset/socket.stp
+++ b/tapset/socket.stp
@@ -513,17 +513,18 @@ function sock_flags_num2str:string (flags:long)
#define SOCK_PASSSEC 4 /* introduced in 2.6.18 */
#endif
char str[60];
+ unsigned long flags = THIS->flags;
str[0] = '\0';
- if (test_bit (SOCK_ASYNC_NOSPACE, &THIS->flags))
+ if (test_bit (SOCK_ASYNC_NOSPACE, &flags))
strcat (str, "ASYNC_NOSPACE|");
- if (test_bit (SOCK_ASYNC_WAITDATA, &THIS->flags))
+ if (test_bit (SOCK_ASYNC_WAITDATA, &flags))
strcat (str, "ASYNC_WAITDATA|");
- if (test_bit (SOCK_NOSPACE, &THIS->flags))
+ if (test_bit (SOCK_NOSPACE, &flags))
strcat (str, "NOSPACE|");
- if (test_bit (SOCK_PASSCRED, &THIS->flags))
+ if (test_bit (SOCK_PASSCRED, &flags))
strcat (str, "PASSCRED|");
- if (test_bit (SOCK_PASSSEC, &THIS->flags))
+ if (test_bit (SOCK_PASSSEC, &flags))
strcat (str, "PASSSEC|");
if (str[0] != '\0') str[strlen(str)-1] = '\0';
strlcpy (THIS->__retvalue, str, MAXSTRINGLEN);
@@ -938,147 +939,77 @@ function _success_check(ret:long)
function _get_sock_addr:long (file:long)
%{
- struct socket *sockp;
- struct file *filep;
-
- filep = (struct file *) deref (sizeof(struct file *), &(THIS->file));
- if (filep == NULL) {
+ struct file *filep = (struct file *)(long)(THIS->file);
+ struct socket *sockp = filep? kread(&(filep->private_data)) : NULL;
+ if (sockp == NULL)
THIS->__retvalue = -1;
- goto end;
- }
- sockp = (struct socket *) deref (sizeof(filep->private_data),
- &(filep->private_data));
- if (sockp == NULL) {
- THIS->__retvalue = -1;
- goto end;
- }
- THIS->__retvalue = (long) sockp;
-
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
-end: ;
+ else
+ THIS->__retvalue = (long) sockp;
+ CATCH_DEREF_FAULT();
%}
function _get_sock_size:long (iov:long, nr_segs:long)
%{
- struct iovec *iovp;
- long size = 0;
- int i;
-
- iovp = (struct iovec *) deref (sizeof(struct iov *), &(THIS->iov));
- if (iovp == NULL) {
+ struct iovec *iovp = (struct iovec *)(long)(THIS->iov);
+ if (iovp == NULL)
THIS->__retvalue = -1;
- goto end;
- }
-
- for (i = 0 ; i < THIS->nr_segs ; i++)
- size += iovp[i].iov_len;
-
- THIS->__retvalue = size;
-
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
+ else {
+ int i;
+ THIS->__retvalue = 0;
+ for (i = 0 ; i < THIS->nr_segs ; i++)
+ THIS->__retvalue += kread(&(iovp[i].iov_len));
}
-end: ;
+ CATCH_DEREF_FAULT();
%}
function _sock_prot_num:long (sock:long)
%{
- struct socket *sktp;
- struct sock *skp;
-
- sktp = (struct socket *) deref (sizeof (struct socket *), &(THIS->sock));
- if (sktp == NULL) {
- THIS->__retvalue = -1;
- goto end;
- }
- skp = (struct sock *) deref (sizeof (sktp->sk), &(sktp->sk));
- if (skp == NULL) {
+ struct socket *sktp = (struct socket *)(long)(THIS->sock);
+ struct sock *skp = sktp? kread(&(sktp->sk)) : NULL;
+ if (skp == NULL)
THIS->__retvalue = -1;
- goto end;
- }
- THIS->__retvalue = (long) skp->sk_protocol;
-
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
-end: ;
+ else
+ THIS->__retvalue = kread(&(skp->sk_protocol));
+ CATCH_DEREF_FAULT();
%}
function _sock_fam_num:long (sock:long)
%{
- struct socket *sockp;
- struct proto_ops *ops;
-
- sockp = (struct socket *) deref (sizeof (struct socket *), &(THIS->sock));
- if (sockp == NULL) {
+ struct socket *sockp = (struct socket *)(long)(THIS->sock);
+ const struct proto_ops *ops = sockp? kread(&(sockp->ops)) : NULL;
+ if (ops == NULL)
THIS->__retvalue = -1;
- goto end;
- }
- ops = (struct proto_ops *) deref (sizeof (sockp->ops), &(sockp->ops));
- if (ops == NULL) {
- THIS->__retvalue = -1;
- goto end;
- }
- THIS->__retvalue = (long) ops->family;
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
-end: ;
+ else
+ THIS->__retvalue = kread(&(ops->family));
+ CATCH_DEREF_FAULT();
%}
function _sock_state_num:long (sock:long)
%{
- struct socket *sockp;
-
- sockp = (struct socket *) deref (sizeof (struct sock *), &(THIS->sock));
- if (sockp == NULL) {
+ struct socket *sockp = (struct socket *)(long)(THIS->sock);
+ if (sockp == NULL)
THIS->__retvalue = -1;
- goto end;
- }
- THIS->__retvalue = sockp->state;
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
-end: ;
+ else
+ THIS->__retvalue = kread(&(sockp->state));
+ CATCH_DEREF_FAULT();
%}
function _sock_type_num:long (sock:long)
%{
- struct socket *sockp;
-
- sockp = (struct socket *) deref (sizeof(struct socket *), &(THIS->sock));
- if (sockp == NULL) {
+ struct socket *sockp = (struct socket *)(long)(THIS->sock);
+ if (sockp == NULL)
THIS->__retvalue = -1;
- goto end;
- }
- THIS->__retvalue = (long) sockp->type;
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
-end: ;
+ else
+ THIS->__retvalue = kread(&(sockp->type));
+ CATCH_DEREF_FAULT();
%}
function _sock_flags_num:long (sock:long)
%{
- struct socket *sockp;
-
- sockp = (struct socket *) deref (sizeof(struct socket *), &(THIS->sock));
- if (sockp == NULL) {
+ struct socket *sockp = (struct socket *)(long)(THIS->sock);
+ if (sockp == NULL)
THIS->__retvalue = -1;
- goto end;
- }
- THIS->__retvalue = sockp->flags;
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
-end: ;
+ else
+ THIS->__retvalue = kread(&(sockp->flags));
+ CATCH_DEREF_FAULT();
%}
diff --git a/tapset/string.stp b/tapset/string.stp
index 15791134..2f43aecc 100644
--- a/tapset/string.stp
+++ b/tapset/string.stp
@@ -20,10 +20,8 @@ function strlen:long(s:string) %{ /* pure */
* @return Returns the substring.
*/
function substr:string(str:string,start:long, length:long) %{ /* pure */
- int length = THIS->length + 1 > MAXSTRINGLEN ? MAXSTRINGLEN : THIS->length + 1;
- if (THIS->start < 0 || length < 1) {
- return;
- } else
+ int length = THIS->length >= MAXSTRINGLEN ? MAXSTRINGLEN : THIS->length + 1;
+ if (THIS->start >= 0 && length > 0 && THIS->start < strlen(THIS->str))
strlcpy(THIS->__retvalue, THIS->str + THIS->start, length);
%}
diff --git a/tapset/syscalls.stp b/tapset/syscalls.stp
index 6601a229..f3d9a581 100644
--- a/tapset/syscalls.stp
+++ b/tapset/syscalls.stp
@@ -488,7 +488,7 @@ probe syscall.epoll_wait.return = kernel.function("sys_epoll_wait").return {
# struct pt_regs * regs)
probe syscall.execve = kernel.function("do_execve") {
name = "execve"
- filename = __string($filename)
+ filename = kernel_string($filename)
args = __get_argv($argv)
argstr = sprintf("%s %s", filename, args)
}
diff --git a/tapset/task.stp b/tapset/task.stp
index cbf61f3a..2f183838 100644
--- a/tapset/task.stp
+++ b/tapset/task.stp
@@ -16,11 +16,8 @@ function task_current:long () %{ /* pure */
// Return the parent task_struct of the given task
function task_parent:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = deref(sizeof(t->parent), &(t->parent));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = (long)kread(&(t->parent));
+ CATCH_DEREF_FAULT();
%}
@@ -34,11 +31,8 @@ deref_fault:
// EXIT_DEAD 32
function task_state:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = deref(sizeof(t->state), &(t->state));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = kread(&(t->state));
+ CATCH_DEREF_FAULT();
%}
@@ -46,111 +40,78 @@ deref_fault:
function task_execname:string (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
deref_string(THIS->__retvalue, t->comm, MAXSTRINGLEN);
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ CATCH_DEREF_FAULT();
%}
// Return the process id of the given task
function task_pid:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = deref(sizeof(t->tgid), &(t->tgid));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = kread(&(t->tgid));
+ CATCH_DEREF_FAULT();
%}
// Return the thread id of the given task
function task_tid:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = deref(sizeof(t->pid), &(t->pid));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = kread(&(t->pid));
+ CATCH_DEREF_FAULT();
%}
// Return the group id of the given task
function task_gid:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = deref(sizeof(t->gid), &(t->gid));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = kread(&(t->gid));
+ CATCH_DEREF_FAULT();
%}
// Return the effective group id of the given task
function task_egid:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = deref(sizeof(t->egid), &(t->egid));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = kread(&(t->egid));
+ CATCH_DEREF_FAULT();
%}
// Return the user id of the given task
function task_uid:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = deref(sizeof(t->uid), &(t->uid));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = kread(&(t->uid));
+ CATCH_DEREF_FAULT();
%}
// Return the effective user id of the given task
function task_euid:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- THIS->__retvalue = deref(sizeof(t->euid), &(t->euid));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = kread(&(t->euid));
+ CATCH_DEREF_FAULT();
%}
// Return the priority value of the given task
function task_prio:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- int prio = deref(sizeof(t->prio), &(t->prio));
- THIS->__retvalue = prio - MAX_RT_PRIO;
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = kread(&(t->prio)) - MAX_RT_PRIO;
+ CATCH_DEREF_FAULT();
%}
// Return the nice value of the given task
function task_nice:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- int static_prio = deref(sizeof(t->static_prio), &(t->static_prio));
- THIS->__retvalue = static_prio - MAX_RT_PRIO - 20;
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ THIS->__retvalue = kread(&(t->static_prio)) - MAX_RT_PRIO - 20;
+ CATCH_DEREF_FAULT();
%}
// Return the scheduled cpu for the given task
function task_cpu:long (task:long) %{ /* pure */
struct task_struct *t = (struct task_struct *)(long)THIS->task;
- struct thread_info *ti =
- (struct thread_info *)deref(sizeof(t->thread_info), &(t->thread_info));
- THIS->__retvalue = deref(sizeof(ti->cpu), &(ti->cpu));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ struct thread_info *ti = kread(&(t->thread_info));
+ THIS->__retvalue = kread(&(ti->cpu));
+ CATCH_DEREF_FAULT();
%}
diff --git a/tapset/tcp.stp b/tapset/tcp.stp
index 01adad77..b09c74cb 100644
--- a/tapset/tcp.stp
+++ b/tapset/tcp.stp
@@ -20,14 +20,15 @@
// timeout (TCP_RTO_MAX)
function tcp_get_info_rto:long(sock:long)
%{
- unsigned long ptr = (unsigned long) THIS->sock;
+ struct sock *sk = (struct sock *)(long) THIS->sock;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
- struct tcp_opt *tp = tcp_sk((struct sock *)ptr);
- THIS->__retvalue = (int64_t) jiffies_to_usecs(tp->rto);
+ struct tcp_opt *tp = tcp_sk(sk);
+ THIS->__retvalue = (int64_t) jiffies_to_usecs(kread(&(tp->rto)));
#else
- const struct inet_connection_sock *icsk = inet_csk((struct sock *)ptr);
- THIS->__retvalue = (int64_t) jiffies_to_usecs(icsk->icsk_rto);
+ const struct inet_connection_sock *icsk = inet_csk(sk);
+ THIS->__retvalue = (int64_t) jiffies_to_usecs(kread(&(icsk->icsk_rto)));
#endif
+ CATCH_DEREF_FAULT();
%}
//Get congestion window segment size. Initial value of congestion window size
@@ -36,13 +37,14 @@ function tcp_get_info_rto:long(sock:long)
//is performing slow start or congestion avoidance.
function tcp_get_info_snd_cwnd:long(sock:long)
%{
- unsigned long ptr = (unsigned long) THIS->sock;
+ struct sock *sk = (struct sock *)(long) THIS->sock;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
- struct tcp_opt *tp = tcp_sk((struct sock *)ptr);
+ struct tcp_opt *tp = tcp_sk(sk);
#else
- struct tcp_sock *tp = tcp_sk((struct sock *)ptr);
+ struct tcp_sock *tp = tcp_sk(sk);
#endif
- THIS->__retvalue = (int64_t) tp->snd_cwnd;
+ THIS->__retvalue = (int64_t) kread(&(tp->snd_cwnd));
+ CATCH_DEREF_FAULT();
%}
//
@@ -63,10 +65,9 @@ function tcp_get_info_snd_cwnd:long(sock:long)
//
function tcp_ts_get_info_state:long(sock:long)
%{
- unsigned long ptr = (unsigned long) THIS->sock;
- struct sock * sk = (struct sock *) ptr;
-
- THIS->__retvalue = (int64_t) sk->sk_state;
+ struct sock *sk = (struct sock *)(long) THIS->sock;
+ THIS->__retvalue = (int64_t) kread(&(sk->sk_state));
+ CATCH_DEREF_FAULT();
%}
@@ -75,28 +76,29 @@ function tcp_ts_get_info_state:long(sock:long)
// avoidance.
function tcp_ts_get_info_snd_ssthresh:long(sock:long)
%{
- unsigned long ptr = (unsigned long) THIS->sock;
+ struct sock *sk = (struct sock *)(long) THIS->sock;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
- struct tcp_opt *tp = tcp_sk((struct sock *)ptr);
+ struct tcp_opt *tp = tcp_sk(sk);
#else
- struct tcp_sock *tp = tcp_sk((struct sock *)ptr);
+ struct tcp_sock *tp = tcp_sk(sk);
#endif
-
- THIS->__retvalue = (int64_t) tp->snd_ssthresh;
+ THIS->__retvalue = (int64_t) kread(&(tp->snd_ssthresh));
+ CATCH_DEREF_FAULT();
%}
// Get receiver's advertised segment size. TCP typically never sends more
// than what receiver can accept.
function tcp_ts_get_info_rcv_mss:long(sock:long)
%{
- unsigned long ptr = (unsigned long) THIS->sock;
+ struct sock *sk = (struct sock *)(long) THIS->sock;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
- struct tcp_opt *tp = tcp_sk((struct sock *)ptr);
- THIS->__retvalue = (int64_t) tp->ack.rcv_mss;
+ struct tcp_opt *tp = tcp_sk(sk);
+ THIS->__retvalue = (int64_t) kread(&(tp->ack.rcv_mss));
#else
- const struct inet_connection_sock *icsk = inet_csk((struct sock *)ptr);
- THIS->__retvalue = (int64_t) icsk->icsk_ack.rcv_mss;
+ const struct inet_connection_sock *icsk = inet_csk(sk);
+ THIS->__retvalue = (int64_t) kread(&(icsk->icsk_ack.rcv_mss));
#endif
+ CATCH_DEREF_FAULT();
%}
// probe tcp.sendmsg
diff --git a/tapset/vfs.stp b/tapset/vfs.stp
index 6b66624e..e10a2ed5 100644
--- a/tapset/vfs.stp
+++ b/tapset/vfs.stp
@@ -6,20 +6,20 @@ function __bdevname:string (bdev:long) %{ /* pure */
struct block_device *bdev = (struct block_device *)(long)THIS->bdev;
if (bdev == NULL) {
strlcpy(THIS->__retvalue, "N/A", MAXSTRINGLEN);
- return;
+ } else {
+ const char *name = bdevname(bdev, b); /* FIXME: deref hazard! */
+ deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
}
- deref_string(THIS->__retvalue, bdevname(bdev,b), MAXSTRINGLEN);
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ CATCH_DEREF_FAULT();
%}
/*
We don't want to have to do a bdevname() call every time
we want a devname, so we'll hash them here.
*/
+/* XXX: Is this hashing really that helpful? The call to bdevname()
+ * isn't very involved... */
global __devnames
function __find_bdevname(dev, bdev)
{
@@ -38,120 +38,108 @@ function __find_bdevname(dev, bdev)
function ppos_pos:long (ppos:long) %{ /* pure */
loff_t *ppos = (loff_t *)(long)THIS->ppos;
THIS->__retvalue = (int64_t) kread(ppos);
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
- }
+ CATCH_DEREF_FAULT();
%}
function __page_ino:long (page:long) %{ /* pure */
struct page *page = (struct page *)(long)THIS->page;
- if ((page == NULL) || (page->mapping == NULL)) {
+ struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
+ if (mapping == NULL) {
THIS->__retvalue = -1;
- return;
- }
-
- THIS->__retvalue = deref(sizeof(page->mapping->host->i_ino),
- &(page->mapping->host->i_ino));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
+ } else {
+ struct inode *host = kread(&(mapping->host));
+ THIS->__retvalue = kread(&(host->i_ino));
}
+ CATCH_DEREF_FAULT();
%}
function __page_dev:long (page:long) %{ /* pure */
struct page *page = (struct page *)(long)THIS->page;
- if ((page == NULL) || (page->mapping == NULL)) {
+ struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
+ if (mapping == NULL) {
THIS->__retvalue = -1;
- return;
- }
- THIS->__retvalue = deref(sizeof(page->mapping->host->i_sb->s_dev),
- &(page->mapping->host->i_sb->s_dev));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
+ } else {
+ struct inode *host = kread(&(mapping->host));
+ struct super_block *i_sb = kread(&(host->i_sb));
+ THIS->__retvalue = kread(&(i_sb->s_dev));
}
+ CATCH_DEREF_FAULT();
%}
function __page_bdev:long (page:long) %{ /* pure */
struct page *page = (struct page *)(long)THIS->page;
- if ((page == NULL) || (page->mapping == NULL)) {
+ struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
+ if (mapping == NULL) {
THIS->__retvalue = 0;
- return;
- }
- THIS->__retvalue = deref(sizeof(page->mapping->host->i_sb->s_bdev),
- &(page->mapping->host->i_sb->s_bdev));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
+ } else {
+ struct inode *host = kread(&(mapping->host));
+ struct super_block *i_sb = kread(&(host->i_sb));
+ THIS->__retvalue = (long)kread(&(i_sb->s_bdev));
}
+ CATCH_DEREF_FAULT();
%}
function __file_dev:long (file:long) %{ /* pure */
struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL) || (file->f_dentry == NULL)) {
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ if (f_dentry == NULL) {
THIS->__retvalue = 0;
- return;
- }
- THIS->__retvalue = deref(sizeof(file->f_dentry->d_inode->i_sb->s_dev),
- &(file->f_dentry->d_inode->i_sb->s_dev));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
+ } else {
+ struct inode *d_inode = kread(&(f_dentry->d_inode));
+ struct super_block *i_sb = kread(&(d_inode->i_sb));
+ THIS->__retvalue = kread(&(i_sb->s_dev));
}
+ CATCH_DEREF_FAULT();
%}
function __file_bdev:long (file:long) %{ /* pure */
struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL) || (file->f_dentry == NULL)) {
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ if (f_dentry == NULL) {
THIS->__retvalue = 0;
- return;
- }
- THIS->__retvalue = deref(sizeof(file->f_dentry->d_inode->i_sb->s_bdev),
- &(file->f_dentry->d_inode->i_sb->s_bdev));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
+ } else {
+ struct inode *d_inode = kread(&(f_dentry->d_inode));
+ struct super_block *i_sb = kread(&(d_inode->i_sb));
+ THIS->__retvalue = (long)kread(&(i_sb->s_bdev));
}
+ CATCH_DEREF_FAULT();
%}
function __file_ino:long (file:long) %{ /* pure */
struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL) || (file->f_dentry == NULL)) {
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ if (f_dentry == NULL) {
THIS->__retvalue = 0;
- return;
- }
- THIS->__retvalue = deref(sizeof(file->f_dentry->d_inode->i_ino),
- &(file->f_dentry->d_inode->i_ino));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
+ } else {
+ struct inode *d_inode = kread(&(f_dentry->d_inode));
+ THIS->__retvalue = kread(&(d_inode->i_ino));
}
+ CATCH_DEREF_FAULT();
%}
function __file_maxbytes:long (file:long) %{ /* pure */
struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL) || (file->f_dentry == NULL)) {
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ if (f_dentry == NULL) {
THIS->__retvalue = 0;
- return;
- }
- THIS->__retvalue = deref(sizeof(file->f_dentry->d_inode->i_sb->s_maxbytes),
- &(file->f_dentry->d_inode->i_sb->s_maxbytes));
- if (0) {
-deref_fault:
- CONTEXT->last_error = "pointer dereference fault";
+ } else {
+ struct inode *d_inode = kread(&(f_dentry->d_inode));
+ struct super_block *i_sb = kread(&(d_inode->i_sb));
+ THIS->__retvalue = kread(&(i_sb->s_maxbytes));
}
+ CATCH_DEREF_FAULT();
%}
function __file_filename:string (file:long) %{ /* pure */
struct file *file = (struct file *)(long)THIS->file;
- if ((file == NULL)
- || (file->f_dentry == NULL)
- || (file->f_dentry->d_name.name == NULL))
+ struct dentry *f_dentry = file? kread(&(file->f_dentry)) : NULL;
+ const unsigned char *name = f_dentry? kread(&(f_dentry->d_name.name)) : NULL;
+ if (name == NULL) {
strlcpy(THIS->__retvalue, "NULL", MAXSTRINGLEN);
- else {
- strlcpy(THIS->__retvalue, file->f_dentry->d_name.name, MAXSTRINGLEN);
+ } else {
+ deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
}
+ CATCH_DEREF_FAULT();
%}
probe generic.fop.llseek = kernel.function ("generic_file_llseek")