diff options
Diffstat (limited to 'lib/vsprintf.c')
| -rw-r--r-- | lib/vsprintf.c | 9 | 
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index b8a2f549ab0..4ee19d0d391 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -980,6 +980,11 @@ char *uuid_string(char *buf, char *end, const u8 *addr,   *             [0][1][2][3]-[4][5]-[6][7]-[8][9]-[10][11][12][13][14][15]   *           little endian output byte order is:   *             [3][2][1][0]-[5][4]-[7][6]-[8][9]-[10][11][12][13][14][15] + * - 'V' For a struct va_format which contains a format string * and va_list *, + *       call vsnprintf(->format, *->va_list). + *       Implements a "recursive vsnprintf". + *       Do not use this feature without some mechanism to verify the + *       correctness of the format string and va_list arguments.   *   * Note: The difference between 'S' and 'F' is that on ia64 and ppc64   * function pointers are really function descriptors, which contain a @@ -1025,6 +1030,10 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,  		break;  	case 'U':  		return uuid_string(buf, end, ptr, spec, fmt); +	case 'V': +		return buf + vsnprintf(buf, end - buf, +				       ((struct va_format *)ptr)->fmt, +				       *(((struct va_format *)ptr)->va));  	}  	spec.flags |= SMALL;  	if (spec.field_width == -1) {  |