summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWenji Huang <wenji.huang@oracle.com>2008-06-24 10:11:10 -0400
committerWenji Huang <wenji.huang@oracle.com>2008-06-24 10:11:10 -0400
commitae95b1546c45578e0ab56c1842050cd731ec0508 (patch)
tree4df9ee1939d2bb10790f5ed46b0a5ea02f1d7d4a
parentb84f3753b06258c02b768beb586bba3213890fff (diff)
downloadsystemtap-steved-ae95b1546c45578e0ab56c1842050cd731ec0508.tar.gz
systemtap-steved-ae95b1546c45578e0ab56c1842050cd731ec0508.tar.xz
systemtap-steved-ae95b1546c45578e0ab56c1842050cd731ec0508.zip
PR6646: Add checking address in runtime
-rw-r--r--runtime/transport/ChangeLog5
-rw-r--r--runtime/transport/symbols.c34
2 files changed, 38 insertions, 1 deletions
diff --git a/runtime/transport/ChangeLog b/runtime/transport/ChangeLog
index 2ffff58c..2d2fa82f 100644
--- a/runtime/transport/ChangeLog
+++ b/runtime/transport/ChangeLog
@@ -1,3 +1,8 @@
+
+2008-06-23 Wenji Huang <wenji.huang@oracle.com>
+ PR 6646
+ * symbols.c (_stp_validate_addr): Add validating address in runtime.
+
2008-06-13 Wenji Huang <wenji.huang@oracle.com>
* control.c (_stp_ctl_write_dbug): Remove STP_UNWIND support.
diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c
index 4a3c4e17..c272568e 100644
--- a/runtime/transport/symbols.c
+++ b/runtime/transport/symbols.c
@@ -176,6 +176,24 @@ static void _stp_free_modules(void)
_stp_del_module(_stp_modules[i]);
}
+/* validate the addr in runtime kernel*/
+static int _stp_validate_addr(char *name, unsigned long addr)
+{
+
+ char addr_str[KSYM_SYMBOL_LEN];
+ size_t len;
+
+ sprint_symbol(addr_str, addr);
+ len = strlen(name);
+ if (strlen(addr_str) < len+1
+ || strncmp(addr_str, name, len)
+ || addr_str[len]!='+') {
+ errk("Incorrect mapping 0x%lx vs %s.\n", addr, name);
+ return 1;
+ }
+ return 0;
+}
+
static unsigned long _stp_kallsyms_lookup_name(const char *name);
static void _stp_create_unwind_hdr(struct _stp_module *m);
@@ -205,11 +223,22 @@ static int _stp_init_kernel_symbols(void)
_dbug("Lookup of _stext failed. Exiting.\n");
return -1;
}
+
+ #ifdef __powerpc__
+ if (_stp_validate_addr(".__start", (unsigned long)_stp_modules[0]->text))
+ #else
+ if (_stp_validate_addr("_stext", (unsigned long)_stp_modules[0]->text))
+ #endif
+ return -1;
+
_stp_modules[0]->data = _stp_kallsyms_lookup_name("_etext");
if (_stp_modules[0]->data == 0) {
_dbug("Lookup of _etext failed. Exiting.\n");
return -1;
}
+ if (_stp_validate_addr("_etext", (unsigned long)_stp_modules[0]->data))
+ return -1;
+
_stp_modules[0]->text_size = _stp_modules[0]->data - _stp_modules[0]->text;
_stp_modules_by_addr[0] = _stp_modules[0];
@@ -609,12 +638,15 @@ static int _stp_init_modules(void)
void *res;
struct module *mod;
const struct seq_operations *modules_op = (const struct seq_operations *)_stp_kallsyms_lookup_name("modules_op");
-
+
if (modules_op == NULL) {
_dbug("Lookup of modules_op failed.\n");
return -1;
}
+ if (_stp_validate_addr("modules_op", (unsigned long)modules_op))
+ return -1;
+
/* Use the seq_file interface to safely get a list of installed modules */
res = modules_op->start(NULL, &pos);
while (res) {