diff options
| author | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2013-05-15 10:26:50 -0400 | 
|---|---|---|
| committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2013-05-15 10:26:50 -0400 | 
| commit | 12e04ffcd93b25dfd726d46338c2ee7d23de556e (patch) | |
| tree | f91479a62805619168994fd3ee55e3ffa23fc24e /kernel/kallsyms.c | |
| parent | 9eff37a8713939f218ab8bf0dc93f1d67af7b8b4 (diff) | |
| parent | f722406faae2d073cc1d01063d1123c35425939e (diff) | |
Merge tag 'v3.10-rc1' into stable/for-linus-3.10
Linux 3.10-rc1
* tag 'v3.10-rc1': (12273 commits)
  Linux 3.10-rc1
  [SCSI] qla2xxx: Update firmware link in Kconfig file.
  [SCSI] iscsi class, qla4xxx: fix sess/conn refcounting when find fns are used
  [SCSI] sas: unify the pointlessly separated enums sas_dev_type and sas_device_type
  [SCSI] pm80xx: thermal, sas controller config and error handling update
  [SCSI] pm80xx: NCQ error handling changes
  [SCSI] pm80xx: WWN Modification for PM8081/88/89 controllers
  [SCSI] pm80xx: Changed module name and debug messages update
  [SCSI] pm80xx: Firmware flash memory free fix, with addition of new memory region for it
  [SCSI] pm80xx: SPC new firmware changes for device id 0x8081 alone
  [SCSI] pm80xx: Added SPCv/ve specific hardware functionalities and relevant changes in common files
  [SCSI] pm80xx: MSI-X implementation for using 64 interrupts
  [SCSI] pm80xx: Updated common functions common for SPC and SPCv/ve
  [SCSI] pm80xx: Multiple inbound/outbound queue configuration
  [SCSI] pm80xx: Added SPCv/ve specific ids, variables and modify for SPC
  [SCSI] lpfc: fix up Kconfig dependencies
  [SCSI] Handle MLQUEUE busy response in scsi_send_eh_cmnd
  dm cache: set config value
  dm cache: move config fns
  dm thin: generate event when metadata threshold passed
  ...
Diffstat (limited to 'kernel/kallsyms.c')
| -rw-r--r-- | kernel/kallsyms.c | 26 | 
1 files changed, 18 insertions, 8 deletions
| diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index 2169feeba52..3127ad52cdb 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -84,9 +84,11 @@ static int is_ksym_addr(unsigned long addr)  /*   * Expand a compressed symbol data into the resulting uncompressed string, + * if uncompressed string is too long (>= maxlen), it will be truncated,   * given the offset to where the symbol is in the compressed stream.   */ -static unsigned int kallsyms_expand_symbol(unsigned int off, char *result) +static unsigned int kallsyms_expand_symbol(unsigned int off, +					   char *result, size_t maxlen)  {  	int len, skipped_first = 0;  	const u8 *tptr, *data; @@ -113,15 +115,20 @@ static unsigned int kallsyms_expand_symbol(unsigned int off, char *result)  		while (*tptr) {  			if (skipped_first) { +				if (maxlen <= 1) +					goto tail;  				*result = *tptr;  				result++; +				maxlen--;  			} else  				skipped_first = 1;  			tptr++;  		}  	} -	*result = '\0'; +tail: +	if (maxlen) +		*result = '\0';  	/* Return to offset to the next symbol. */  	return off; @@ -176,7 +183,7 @@ unsigned long kallsyms_lookup_name(const char *name)  	unsigned int off;  	for (i = 0, off = 0; i < kallsyms_num_syms; i++) { -		off = kallsyms_expand_symbol(off, namebuf); +		off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf));  		if (strcmp(namebuf, name) == 0)  			return kallsyms_addresses[i]; @@ -195,7 +202,7 @@ int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,  	int ret;  	for (i = 0, off = 0; i < kallsyms_num_syms; i++) { -		off = kallsyms_expand_symbol(off, namebuf); +		off = kallsyms_expand_symbol(off, namebuf, ARRAY_SIZE(namebuf));  		ret = fn(data, namebuf, NULL, kallsyms_addresses[i]);  		if (ret != 0)  			return ret; @@ -294,7 +301,8 @@ const char *kallsyms_lookup(unsigned long addr,  		pos = get_symbol_pos(addr, symbolsize, offset);  		/* Grab name */ -		kallsyms_expand_symbol(get_symbol_offset(pos), namebuf); +		kallsyms_expand_symbol(get_symbol_offset(pos), +				       namebuf, KSYM_NAME_LEN);  		if (modname)  			*modname = NULL;  		return namebuf; @@ -315,7 +323,8 @@ int lookup_symbol_name(unsigned long addr, char *symname)  		pos = get_symbol_pos(addr, NULL, NULL);  		/* Grab name */ -		kallsyms_expand_symbol(get_symbol_offset(pos), symname); +		kallsyms_expand_symbol(get_symbol_offset(pos), +				       symname, KSYM_NAME_LEN);  		return 0;  	}  	/* See if it's in a module. */ @@ -333,7 +342,8 @@ int lookup_symbol_attrs(unsigned long addr, unsigned long *size,  		pos = get_symbol_pos(addr, size, offset);  		/* Grab name */ -		kallsyms_expand_symbol(get_symbol_offset(pos), name); +		kallsyms_expand_symbol(get_symbol_offset(pos), +				       name, KSYM_NAME_LEN);  		modname[0] = '\0';  		return 0;  	} @@ -463,7 +473,7 @@ static unsigned long get_ksymbol_core(struct kallsym_iter *iter)  	iter->type = kallsyms_get_symbol_type(off); -	off = kallsyms_expand_symbol(off, iter->name); +	off = kallsyms_expand_symbol(off, iter->name, ARRAY_SIZE(iter->name));  	return off - iter->nameoff;  } | 
