summaryrefslogtreecommitdiffstats
path: root/runtime/loc2c-runtime.h
diff options
context:
space:
mode:
authorDave Brolley <brolley@redhat.com>2009-09-03 17:19:05 -0400
committerDave Brolley <brolley@redhat.com>2009-09-03 17:19:05 -0400
commitd0822e28934cd0387c2af4349cf52c52c368c55a (patch)
tree183ad07b7c064d885b1a0327d7aae09953dae3dc /runtime/loc2c-runtime.h
parent5e8a3b7b558273fa06525f642fdf2d678dde85eb (diff)
downloadsystemtap-steved-d0822e28934cd0387c2af4349cf52c52c368c55a.tar.gz
systemtap-steved-d0822e28934cd0387c2af4349cf52c52c368c55a.tar.xz
systemtap-steved-d0822e28934cd0387c2af4349cf52c52c368c55a.zip
Disallow kernel space memory access when unprivileged.
2009-09-03 Dave Brolley <brolley@redhat.com> * runtime/addr-map.c (lookup_addr_aux): Now takes size argument. Consider the size when looking for overlapping range with the map entries. (lookup_bad_addr): Now takes size argument. Disallow kernel space access when STP_PRIVILEGED is not defined. Pass size to lookup_addr_aux. <asm/processor.h>: #include it when STP_PRIVILEGED is not defined. (add_bad_addr_entry): Supply a size of 1 to calls to lookup_addr_aux. * runtime/loc2c-runtime.h (kread): Pass sizeof (*(ptr)) to lookup_bad_addr. (kwrite): Likewise. (deref): Pass size to lookup_bad_addr. (store_deref): Likewise.
Diffstat (limited to 'runtime/loc2c-runtime.h')
-rw-r--r--runtime/loc2c-runtime.h28
1 files changed, 14 insertions, 14 deletions
diff --git a/runtime/loc2c-runtime.h b/runtime/loc2c-runtime.h
index 620e1615..e9e5a071 100644
--- a/runtime/loc2c-runtime.h
+++ b/runtime/loc2c-runtime.h
@@ -192,7 +192,7 @@
#define kread(ptr) ({ \
typeof(*(ptr)) _v = 0; \
- if (lookup_bad_addr((unsigned long)(ptr)) || \
+ if (lookup_bad_addr((unsigned long)(ptr), sizeof (*(ptr))) || \
probe_kernel_read((void *)&_v, (void *)(ptr), sizeof(*(ptr)))) \
DEREF_FAULT(ptr); \
_v; \
@@ -201,7 +201,7 @@
#define kwrite(ptr, value) ({ \
typeof(*(ptr)) _v; \
_v = (typeof(*(ptr)))(value); \
- if (lookup_bad_addr((unsigned long)addr) || \
+ if (lookup_bad_addr((unsigned long)addr, sizeof (*(ptr))) || \
probe_kernel_write((void *)(ptr), (void *)&_v, sizeof(*(ptr)))) \
STORE_DEREF_FAULT(ptr); \
})
@@ -240,7 +240,7 @@ extern void __store_deref_bad(void);
int _bad = 0; \
u8 _b; u16 _w; u32 _l; \
intptr_t _v = 0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size) \
@@ -258,7 +258,7 @@ extern void __store_deref_bad(void);
#define store_deref(size, addr, value) \
({ \
int _bad = 0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size) \
@@ -280,7 +280,7 @@ extern void __store_deref_bad(void);
int _bad = 0; \
u8 _b; u16 _w; u32 _l; u64 _q; \
intptr_t _v = 0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size) \
@@ -299,7 +299,7 @@ extern void __store_deref_bad(void);
#define store_deref(size, addr, value) \
({ \
int _bad = 0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size) \
@@ -319,7 +319,7 @@ extern void __store_deref_bad(void);
({ \
int _bad = 0; \
intptr_t _v=0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size){ \
@@ -337,7 +337,7 @@ extern void __store_deref_bad(void);
#define store_deref(size, addr, value) \
({ \
int _bad=0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size){ \
@@ -397,7 +397,7 @@ extern void __store_deref_bad(void);
({ \
int _bad = 0; \
intptr_t _v = 0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size) \
@@ -416,7 +416,7 @@ extern void __store_deref_bad(void);
#define store_deref(size, addr, value) \
({ \
int _bad = 0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size) \
@@ -571,7 +571,7 @@ extern void __store_deref_bad(void);
({ \
int _bad = 0; \
intptr_t _v=0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size){ \
@@ -588,7 +588,7 @@ extern void __store_deref_bad(void);
#define store_deref(size, addr, value) \
({ \
int _bad=0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size){ \
@@ -660,7 +660,7 @@ extern void __store_deref_bad(void);
u8 _b; u16 _w; u32 _l; u64 _q; \
int _bad = 0; \
intptr_t _v = 0; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
switch (size) { \
@@ -696,7 +696,7 @@ extern void __store_deref_bad(void);
({ \
int _bad = 0; \
int i; \
- if (lookup_bad_addr((unsigned long)addr)) \
+ if (lookup_bad_addr((unsigned long)addr, size)) \
_bad = 1; \
else \
for(i=0;i<size;i++){ \