diff options
Diffstat (limited to 'lib/vsprintf.c')
| -rw-r--r-- | lib/vsprintf.c | 164 | 
1 files changed, 12 insertions, 152 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index bba9caa375d..dba35d1985c 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -120,147 +120,6 @@ long long simple_strtoll(const char *cp, char **endp, unsigned int base)  }  EXPORT_SYMBOL(simple_strtoll); -/** - * strict_strtoul - convert a string to an unsigned long strictly - * @cp: The string to be converted - * @base: The number base to use - * @res: The converted result value - * - * strict_strtoul converts a string to an unsigned long only if the - * string is really an unsigned long string, any string containing - * any invalid char at the tail will be rejected and -EINVAL is returned, - * only a newline char at the tail is acceptible because people generally - * change a module parameter in the following way: - * - * 	echo 1024 > /sys/module/e1000/parameters/copybreak - * - * echo will append a newline to the tail. - * - * It returns 0 if conversion is successful and *res is set to the converted - * value, otherwise it returns -EINVAL and *res is set to 0. - * - * simple_strtoul just ignores the successive invalid characters and - * return the converted value of prefix part of the string. - */ -int strict_strtoul(const char *cp, unsigned int base, unsigned long *res) -{ -	char *tail; -	unsigned long val; - -	*res = 0; -	if (!*cp) -		return -EINVAL; - -	val = simple_strtoul(cp, &tail, base); -	if (tail == cp) -		return -EINVAL; - -	if ((tail[0] == '\0') || (tail[0] == '\n' && tail[1] == '\0')) { -		*res = val; -		return 0; -	} - -	return -EINVAL; -} -EXPORT_SYMBOL(strict_strtoul); - -/** - * strict_strtol - convert a string to a long strictly - * @cp: The string to be converted - * @base: The number base to use - * @res: The converted result value - * - * strict_strtol is similiar to strict_strtoul, but it allows the first - * character of a string is '-'. - * - * It returns 0 if conversion is successful and *res is set to the converted - * value, otherwise it returns -EINVAL and *res is set to 0. - */ -int strict_strtol(const char *cp, unsigned int base, long *res) -{ -	int ret; -	if (*cp == '-') { -		ret = strict_strtoul(cp + 1, base, (unsigned long *)res); -		if (!ret) -			*res = -(*res); -	} else { -		ret = strict_strtoul(cp, base, (unsigned long *)res); -	} - -	return ret; -} -EXPORT_SYMBOL(strict_strtol); - -/** - * strict_strtoull - convert a string to an unsigned long long strictly - * @cp: The string to be converted - * @base: The number base to use - * @res: The converted result value - * - * strict_strtoull converts a string to an unsigned long long only if the - * string is really an unsigned long long string, any string containing - * any invalid char at the tail will be rejected and -EINVAL is returned, - * only a newline char at the tail is acceptible because people generally - * change a module parameter in the following way: - * - * 	echo 1024 > /sys/module/e1000/parameters/copybreak - * - * echo will append a newline to the tail of the string. - * - * It returns 0 if conversion is successful and *res is set to the converted - * value, otherwise it returns -EINVAL and *res is set to 0. - * - * simple_strtoull just ignores the successive invalid characters and - * return the converted value of prefix part of the string. - */ -int strict_strtoull(const char *cp, unsigned int base, unsigned long long *res) -{ -	char *tail; -	unsigned long long val; - -	*res = 0; -	if (!*cp) -		return -EINVAL; - -	val = simple_strtoull(cp, &tail, base); -	if (tail == cp) -		return -EINVAL; -	if ((tail[0] == '\0') || (tail[0] == '\n' && tail[1] == '\0')) { -		*res = val; -		return 0; -	} - -	return -EINVAL; -} -EXPORT_SYMBOL(strict_strtoull); - -/** - * strict_strtoll - convert a string to a long long strictly - * @cp: The string to be converted - * @base: The number base to use - * @res: The converted result value - * - * strict_strtoll is similiar to strict_strtoull, but it allows the first - * character of a string is '-'. - * - * It returns 0 if conversion is successful and *res is set to the converted - * value, otherwise it returns -EINVAL and *res is set to 0. - */ -int strict_strtoll(const char *cp, unsigned int base, long long *res) -{ -	int ret; -	if (*cp == '-') { -		ret = strict_strtoull(cp + 1, base, (unsigned long long *)res); -		if (!ret) -			*res = -(*res); -	} else { -		ret = strict_strtoull(cp, base, (unsigned long long *)res); -	} - -	return ret; -} -EXPORT_SYMBOL(strict_strtoll); -  static noinline_for_stack  int skip_atoi(const char **s)  { @@ -574,7 +433,9 @@ char *symbol_string(char *buf, char *end, void *ptr,  	unsigned long value = (unsigned long) ptr;  #ifdef CONFIG_KALLSYMS  	char sym[KSYM_SYMBOL_LEN]; -	if (ext != 'f' && ext != 's') +	if (ext == 'B') +		sprint_backtrace(sym, value); +	else if (ext != 'f' && ext != 's')  		sprint_symbol(sym, value);  	else  		kallsyms_lookup(value, NULL, NULL, NULL, sym); @@ -949,6 +810,7 @@ int kptr_restrict = 1;   * - 'f' For simple symbolic function names without offset   * - 'S' For symbolic direct pointers with offset   * - 's' For symbolic direct pointers without offset + * - 'B' For backtraced symbolic direct pointers with offset   * - 'R' For decoded struct resource, e.g., [mem 0x0-0x1f 64bit pref]   * - 'r' For raw struct resource, e.g., [mem 0x0-0x1f flags 0x201]   * - 'M' For a 6-byte MAC address, it prints the address in the @@ -991,7 +853,7 @@ static noinline_for_stack  char *pointer(const char *fmt, char *buf, char *end, void *ptr,  	      struct printf_spec spec)  { -	if (!ptr) { +	if (!ptr && *fmt != 'K') {  		/*  		 * Print (null) with the same width as a pointer so it makes  		 * tabular output look nice. @@ -1008,6 +870,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,  		/* Fallthrough */  	case 'S':  	case 's': +	case 'B':  		return symbol_string(buf, end, ptr, spec, *fmt);  	case 'R':  	case 'r': @@ -1047,16 +910,12 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,  			if (spec.field_width == -1)  				spec.field_width = 2 * sizeof(void *);  			return string(buf, end, "pK-error", spec); -		} else if ((kptr_restrict == 0) || -			 (kptr_restrict == 1 && -			  has_capability_noaudit(current, CAP_SYSLOG))) -			break; - -		if (spec.field_width == -1) { -			spec.field_width = 2 * sizeof(void *); -			spec.flags |= ZEROPAD;  		} -		return number(buf, end, 0, spec); +		if (!((kptr_restrict == 0) || +		      (kptr_restrict == 1 && +		       has_capability_noaudit(current, CAP_SYSLOG)))) +			ptr = NULL; +		break;  	}  	spec.flags |= SMALL;  	if (spec.field_width == -1) { @@ -1279,6 +1138,7 @@ qualifier:   * %ps output the name of a text symbol without offset   * %pF output the name of a function pointer with its offset   * %pf output the name of a function pointer without its offset + * %pB output the name of a backtrace symbol with its offset   * %pR output the address range in a struct resource with decoded flags   * %pr output the address range in a struct resource with raw flags   * %pM output a 6-byte MAC address with colons  |