X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fkallsyms.c;h=d0db188488e2af17299a1dca42d8e81257c31752;hb=1be35e94e1da3669db492995cd2c8b1a37016b11;hp=bf19d1215fc0ea5b18a46d3a5252201b7b2573ba;hpb=a91482bdcc2e0f6035702e46f1b99043a0893346;p=linux-2.6.git diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index bf19d1215..d0db18848 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -40,14 +40,14 @@ static inline int is_kernel_text(unsigned long addr) /* Lookup the address for this symbol. Returns 0 if not found. */ unsigned long kallsyms_lookup_name(const char *name) { - char namebuf[KSYM_NAME_LEN+1]; + char namebuf[128]; unsigned long i; char *knames; for (i = 0, knames = kallsyms_names; i < kallsyms_num_syms; i++) { unsigned prefix = *knames++; - strlcpy(namebuf + prefix, knames, KSYM_NAME_LEN - prefix); + strlcpy(namebuf + prefix, knames, 127 - prefix); if (strcmp(namebuf, name) == 0) return kallsyms_addresses[i]; @@ -67,7 +67,7 @@ const char *kallsyms_lookup(unsigned long addr, /* This kernel should never had been booted. */ BUG_ON(!kallsyms_addresses); - namebuf[KSYM_NAME_LEN] = 0; + namebuf[127] = 0; namebuf[0] = 0; if (is_kernel_text(addr) || is_kernel_inittext(addr)) { @@ -84,7 +84,7 @@ const char *kallsyms_lookup(unsigned long addr, /* Grab name */ for (i = 0; i <= best; i++) { unsigned prefix = *name++; - strncpy(namebuf + prefix, name, KSYM_NAME_LEN - prefix); + strncpy(namebuf + prefix, name, 127 - prefix); name += strlen(name) + 1; } @@ -117,22 +117,34 @@ void __print_symbol(const char *fmt, unsigned long address) char *modname; const char *name; unsigned long offset, size; - char namebuf[KSYM_NAME_LEN+1]; - char buffer[sizeof("%s+%#lx/%#lx [%s]") + KSYM_NAME_LEN + - 2*(BITS_PER_LONG*3/10) + MODULE_NAME_LEN + 1]; + char namebuf[128]; name = kallsyms_lookup(address, &size, &offset, &modname, namebuf); - if (!name) - sprintf(buffer, "0x%lx", address); - else { - if (modname) - sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset, - size, modname); - else - sprintf(buffer, "%s+%#lx/%#lx", name, offset, size); + if (!name) { + char addrstr[sizeof("0x%lx") + (BITS_PER_LONG*3/10)]; + + sprintf(addrstr, "0x%lx", address); + printk(fmt, addrstr); + return; + } + + if (modname) { + /* This is pretty small. */ + char buffer[sizeof("%s+%#lx/%#lx [%s]") + + strlen(name) + 2*(BITS_PER_LONG*3/10) + + strlen(modname)]; + + sprintf(buffer, "%s+%#lx/%#lx [%s]", + name, offset, size, modname); + printk(fmt, buffer); + } else { + char buffer[sizeof("%s+%#lx/%#lx") + + strlen(name) + 2*(BITS_PER_LONG*3/10)]; + + sprintf(buffer, "%s+%#lx/%#lx", name, offset, size); + printk(fmt, buffer); } - printk(fmt, buffer); } /* To avoid O(n^2) iteration, we carry prefix along. */ @@ -143,7 +155,7 @@ struct kallsym_iter unsigned long value; unsigned int nameoff; /* If iterating in core kernel symbols */ char type; - char name[KSYM_NAME_LEN+1]; + char name[128]; }; /* Only label it "global" if it is exported. */ @@ -174,8 +186,7 @@ static unsigned long get_ksymbol_core(struct kallsym_iter *iter) shared with previous name (stem compression). */ stemlen = kallsyms_names[off++]; - strlcpy(iter->name+stemlen, kallsyms_names + off, - KSYM_NAME_LEN+1-stemlen); + strlcpy(iter->name+stemlen, kallsyms_names + off, 128-stemlen); off += strlen(kallsyms_names + off) + 1; iter->owner = NULL; iter->value = kallsyms_addresses[iter->pos];