From ae95b1546c45578e0ab56c1842050cd731ec0508 Mon Sep 17 00:00:00 2001 From: Wenji Huang Date: Tue, 24 Jun 2008 10:11:10 -0400 Subject: PR6646: Add checking address in runtime --- runtime/transport/symbols.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'runtime/transport/symbols.c') 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) { -- cgit From 57286c7da57d75173149c733b00474d256af6b36 Mon Sep 17 00:00:00 2001 From: Wenji Huang Date: Tue, 24 Jun 2008 13:49:01 -0400 Subject: Remove validating _stext due to many aliased symbols --- runtime/transport/symbols.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'runtime/transport/symbols.c') diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c index c272568e..dda6d9ea 100644 --- a/runtime/transport/symbols.c +++ b/runtime/transport/symbols.c @@ -224,13 +224,6 @@ static int _stp_init_kernel_symbols(void) 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"); -- cgit From 7ff47c2c671a4e8a6c80bc0af0b3c04f4e8034b5 Mon Sep 17 00:00:00 2001 From: Wenji Huang Date: Wed, 25 Jun 2008 10:43:35 -0400 Subject: Revert checking address in runtime --- runtime/transport/symbols.c | 23 ----------------------- 1 file changed, 23 deletions(-) (limited to 'runtime/transport/symbols.c') diff --git a/runtime/transport/symbols.c b/runtime/transport/symbols.c index dda6d9ea..9299fc67 100644 --- a/runtime/transport/symbols.c +++ b/runtime/transport/symbols.c @@ -176,24 +176,6 @@ 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); @@ -229,8 +211,6 @@ static int _stp_init_kernel_symbols(void) _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]; @@ -637,9 +617,6 @@ static int _stp_init_modules(void) 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) { -- cgit