summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2003-08-16 01:49:38 +0000
committermarcel <marcel@FreeBSD.org>2003-08-16 01:49:38 +0000
commit0cde071e2fbd00d8fd7bd3c9af274dc1d4f66a32 (patch)
tree198638df72e4097a76698e3016099132ba17e191 /sys
parent52c5328900a6941ae49525fa64862f0842f3f2e9 (diff)
downloadFreeBSD-src-0cde071e2fbd00d8fd7bd3c9af274dc1d4f66a32.zip
FreeBSD-src-0cde071e2fbd00d8fd7bd3c9af274dc1d4f66a32.tar.gz
Fix a range check bug. Don't left-shift the integer argument 'data'.
Sign extension happens after the shift, not before so that boundary cases like 0x40000000 will not be caught properly. Instead, right shift ndirty. It is guaranteed to be a multiple of 8. While here, do some manual code motion and code commoning. Range check bug pointed out by: iedowse
Diffstat (limited to 'sys')
-rw-r--r--sys/ia64/ia64/ptrace_machdep.c19
1 files changed, 7 insertions, 12 deletions
diff --git a/sys/ia64/ia64/ptrace_machdep.c b/sys/ia64/ia64/ptrace_machdep.c
index 90c17c6..0f269e2 100644
--- a/sys/ia64/ia64/ptrace_machdep.c
+++ b/sys/ia64/ia64/ptrace_machdep.c
@@ -40,26 +40,21 @@ cpu_ptrace(struct thread *td, int req, void *addr, int data)
uint64_t *kstack;
int error;
- error = 0;
+ error = EINVAL;
+ tf = td->td_frame;
+
switch (req) {
case PT_GETKSTACK:
- tf = td->td_frame;
- if (data >= 0 && (data << 3) < tf->tf_special.ndirty) {
+ if (data >= 0 && data < (tf->tf_special.ndirty >> 3)) {
kstack = (uint64_t*)td->td_kstack;
error = copyout(kstack + data, addr, 8);
- } else
- error = EINVAL;
+ }
break;
case PT_SETKSTACK:
- tf = td->td_frame;
- if (data >= 0 && (data << 3) < tf->tf_special.ndirty) {
+ if (data >= 0 && data < (tf->tf_special.ndirty >> 3)) {
kstack = (uint64_t*)td->td_kstack;
error = copyin(addr, kstack + data, 8);
- } else
- error = EINVAL;
- break;
- default:
- error = EINVAL;
+ }
break;
}
OpenPOWER on IntegriCloud