1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

_dl_exception_create_format: Support %x/%lx/%zx

Add support for %x, %lx and %zx to _dl_exception_create_format and pad
to the full width with 0.

	* elf/Makefile (tests-internal): Add tst-create_format1.
	* elf/dl-exception.c (_dl_exception_create_format): Support
	%x, %lx and %zx.
	* elf/tst-create_format1.c: New file.
This commit is contained in:
H.J. Lu
2018-11-29 14:15:01 -08:00
parent 3a67e81d75
commit a5275ba537
4 changed files with 153 additions and 1 deletions

View File

@ -111,6 +111,20 @@ _dl_exception_create_format (struct dl_exception *exception, const char *objname
case 's':
length += strlen (va_arg (ap, const char *));
break;
/* Recognize the l modifier. It is only important on some
platforms where long and int have a different size. We
can use the same code for size_t. */
case 'l':
case 'z':
if (p[1] == 'x')
{
length += LONG_WIDTH / 4;
++p;
break;
}
case 'x':
length += INT_WIDTH / 4;
break;
default:
/* Assumed to be '%'. */
++length;
@ -167,6 +181,32 @@ _dl_exception_create_format (struct dl_exception *exception, const char *objname
*wptr = '%';
++wptr;
break;
case 'x':
{
unsigned long int num = va_arg (ap, unsigned int);
char *start = wptr;
wptr += INT_WIDTH / 4;
char *cp = _itoa (num, wptr, 16, 0);
/* Pad to the full width with 0. */
while (cp != start)
*--cp = '0';
}
break;
case 'l':
case 'z':
if (p[1] == 'x')
{
unsigned long int num = va_arg (ap, unsigned long int);
char *start = wptr;
wptr += LONG_WIDTH / 4;
char *cp = _itoa (num, wptr, 16, 0);
/* Pad to the full width with 0. */
while (cp != start)
*--cp = '0';
++p;
break;
}
/* FALLTHROUGH */
default:
_dl_fatal_printf ("Fatal error:"
" invalid format in exception string\n");