diff options
-rw-r--r-- | runtime/transport/ChangeLog | 5 | ||||
-rw-r--r-- | runtime/transport/symbols.c | 34 |
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) { |