diff options
author | Jim Keniston <jkenisto@us.ibm.com> | 2008-05-29 17:13:38 -0700 |
---|---|---|
committer | Jim Keniston <jkenisto@us.ibm.com> | 2008-05-29 17:13:38 -0700 |
commit | af26b140348ba9989c63f36bb553862a0f75ffeb (patch) | |
tree | f0285387a59482c498a80377a7537216c45db2f4 /tapset | |
parent | 8437928b8d07b6b77fc5f886b6900eb9cfd4a0d0 (diff) | |
download | systemtap-steved-af26b140348ba9989c63f36bb553862a0f75ffeb.tar.gz systemtap-steved-af26b140348ba9989c63f36bb553862a0f75ffeb.tar.xz systemtap-steved-af26b140348ba9989c63f36bb553862a0f75ffeb.zip |
Fix PR 6582: verify CONTEXT->regs in [u_]register()
Diffstat (limited to 'tapset')
-rw-r--r-- | tapset/context.stp | 4 | ||||
-rw-r--r-- | tapset/i686/registers.stp | 18 | ||||
-rw-r--r-- | tapset/ppc64/registers.stp | 4 | ||||
-rw-r--r-- | tapset/x86_64/registers.stp | 4 |
4 files changed, 24 insertions, 6 deletions
diff --git a/tapset/context.stp b/tapset/context.stp index dc560316..45e3be30 100644 --- a/tapset/context.stp +++ b/tapset/context.stp @@ -136,6 +136,10 @@ function probemod:string () %{ /* pure */ } %} +function registers_valid:long () %{ /* pure */ + THIS->__retvalue = (CONTEXT->regs != NULL); +%} + function is_return:long () %{ /* pure */ if (CONTEXT->pi) THIS->__retvalue = 1; diff --git a/tapset/i686/registers.stp b/tapset/i686/registers.stp index 52b00973..72114dc9 100644 --- a/tapset/i686/registers.stp +++ b/tapset/i686/registers.stp @@ -1,4 +1,4 @@ -global _reg_offsets, _stp_regs_registered +global _reg_offsets, _stp_regs_registered, _sp_offset, _ss_offset function _stp_register_regs() { /* Same order as pt_regs */ @@ -16,8 +16,10 @@ function _stp_register_regs() { _reg_offsets["eip"] = 44 _reg_offsets["ip"] = 44 _reg_offsets["xcs"] = 48 _reg_offsets["cs"] = 48 _reg_offsets["eflags"] = 52 _reg_offsets["flags"] = 52 - _reg_offsets["esp"] = 56 _reg_offsets["sp"] = 56 sp_offset = 56 - _reg_offsets["xss"] = 60 _reg_offsets["ss"] = 60 ss_offset = 60 + _reg_offsets["esp"] = 56 _reg_offsets["sp"] = 56 + _reg_offsets["xss"] = 60 _reg_offsets["ss"] = 60 + _sp_offset = 56 + _ss_offset = 60 _stp_regs_registered = 1 } @@ -49,6 +51,10 @@ function _stp_kernel_ss:long () %{ /* Return the named register value as a signed value. */ function register:long (name:string) { + if (!registers_valid()) { + error("cannot access CPU registers in this context") + return 0 + } if (!_stp_regs_registered) _stp_register_regs() offset = _reg_offsets[name] @@ -57,9 +63,9 @@ function register:long (name:string) { return 0 } if (_stp_probing_kernel()) { - if (offset == sp_offset) - return _stp_kernel_sp(sp_offset) - else if (offset == ss_offset) + if (offset == _sp_offset) + return _stp_kernel_sp(_sp_offset) + else if (offset == _ss_offset) return _stp_kernel_ss() } return _stp_get_register_by_offset(offset) diff --git a/tapset/ppc64/registers.stp b/tapset/ppc64/registers.stp index f317916b..ea520892 100644 --- a/tapset/ppc64/registers.stp +++ b/tapset/ppc64/registers.stp @@ -75,6 +75,10 @@ function _stp_sign_extend32:long (value:long) { } function _stp_register:long (name:string, sign_extend:long) { + if (!registers_valid()) { + error("cannot access CPU registers in this context") + return 0 + } if (!_stp_regs_registered) _stp_register_regs() offset = _reg_offsets[name] diff --git a/tapset/x86_64/registers.stp b/tapset/x86_64/registers.stp index 8e3c088b..c9728de9 100644 --- a/tapset/x86_64/registers.stp +++ b/tapset/x86_64/registers.stp @@ -54,6 +54,10 @@ function _stp_sign_extend32:long (value:long) %{ function _stp_register:long (name:string, sign_extend:long) { reg32 = 0 + if (!registers_valid()) { + error("cannot access CPU registers in this context") + return 0 + } if (!_stp_regs_registered) _stp_register_regs() offset = _reg_offsets[name] |