summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2009-04-14 20:58:26 +0200
committerMark Wielaard <mjw@redhat.com>2009-04-14 20:58:26 +0200
commitc1af604e1c626b90834113ba7d71c4a2ea1bda68 (patch)
treeb4cc6a723c0d69b70697da8e29d28097e6b0bf61
parent4787e8398f4d0376f31cffc0771b71f5bbdd9d52 (diff)
downloadsystemtap-steved-c1af604e1c626b90834113ba7d71c4a2ea1bda68.tar.gz
systemtap-steved-c1af604e1c626b90834113ba7d71c4a2ea1bda68.tar.xz
systemtap-steved-c1af604e1c626b90834113ba7d71c4a2ea1bda68.zip
Make sure addr falls inside section in _stp_mod_sec_lookup.
* runtime/sym.c (_stp_mod_sec_lookup): Use section size to match addr. Only return exact matches, not just closes offset.
-rw-r--r--runtime/sym.c24
1 files changed, 10 insertions, 14 deletions
diff --git a/runtime/sym.c b/runtime/sym.c
index fc9b2e80..f6f97ac2 100644
--- a/runtime/sym.c
+++ b/runtime/sym.c
@@ -136,9 +136,7 @@ static struct _stp_module *_stp_mod_sec_lookup(unsigned long addr,
struct _stp_section **sec)
{
void *user = NULL;
- struct _stp_module *m = NULL;
unsigned midx = 0;
- unsigned long closest_section_offset = ~0;
// Try vma matching first if task given.
if (task)
@@ -149,7 +147,7 @@ static struct _stp_module *_stp_mod_sec_lookup(unsigned long addr,
NULL, &user) == 0)
if (user != NULL)
{
- m = (struct _stp_module *)user;
+ struct _stp_module *m = (struct _stp_module *)user;
if (sec)
*sec = &m->sections[0]; // XXX check actual section and relocate
dbug_sym(1, "found section %s in module %s at 0x%lx\n",
@@ -165,21 +163,19 @@ static struct _stp_module *_stp_mod_sec_lookup(unsigned long addr,
unsigned secidx;
for (secidx = 0; secidx < _stp_modules[midx]->num_sections; secidx++)
{
- unsigned long this_section_addr;
- unsigned long this_section_offset;
- this_section_addr = _stp_modules[midx]->sections[secidx].addr;
- if (addr < this_section_addr) continue;
- this_section_offset = addr - this_section_addr;
- if (this_section_offset < closest_section_offset)
- {
- closest_section_offset = this_section_offset;
- m = _stp_modules[midx];
+ unsigned long sec_addr;
+ unsigned long sec_size;
+ sec_addr = _stp_modules[midx]->sections[secidx].addr;
+ sec_size = _stp_modules[midx]->sections[secidx].size;
+ if (addr >= sec_addr && addr < sec_addr + sec_size)
+ {
if (sec)
- *sec = & m->sections[secidx];
+ *sec = & _stp_modules[midx]->sections[secidx];
+ return _stp_modules[midx];
}
}
}
- return m;
+ return NULL;
}