diff options
Diffstat (limited to 'lib/vsprintf.c')
| -rw-r--r-- | lib/vsprintf.c | 23 | 
1 files changed, 22 insertions, 1 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index be71a03c936a..40f560959b16 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -2052,6 +2052,25 @@ char *format_page_flags(char *buf, char *end, unsigned long flags)  	return buf;  } +static +char *format_page_type(char *buf, char *end, unsigned int page_type) +{ +	buf = number(buf, end, page_type, default_flag_spec); + +	if (buf < end) +		*buf = '('; +	buf++; + +	if (page_type_has_type(page_type)) +		buf = format_flags(buf, end, ~page_type, pagetype_names); + +	if (buf < end) +		*buf = ')'; +	buf++; + +	return buf; +} +  static noinline_for_stack  char *flags_string(char *buf, char *end, void *flags_ptr,  		   struct printf_spec spec, const char *fmt) @@ -2065,6 +2084,8 @@ char *flags_string(char *buf, char *end, void *flags_ptr,  	switch (fmt[1]) {  	case 'p':  		return format_page_flags(buf, end, *(unsigned long *)flags_ptr); +	case 't': +		return format_page_type(buf, end, *(unsigned int *)flags_ptr);  	case 'v':  		flags = *(unsigned long *)flags_ptr;  		names = vmaflag_names; @@ -3621,7 +3642,7 @@ int vsscanf(const char *buf, const char *fmt, va_list args)  		if (!digit  		    || (base == 16 && !isxdigit(digit))  		    || (base == 10 && !isdigit(digit)) -		    || (base == 8 && (!isdigit(digit) || digit > '7')) +		    || (base == 8 && !isodigit(digit))  		    || (base == 0 && !isdigit(digit)))  			break;  |