about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2018-01-10 20:45:02 -0500
committerRich Felker <dalias@aerifal.cx>2018-01-10 20:45:02 -0500
commitb64539ae06aa91a407359238f4e909adb9bfab3d (patch)
tree674464329da63ee231670c74cd07e44f42481e3b
parent32482f61da7650ff10741bd5aedd66bbc3ea165b (diff)
downloadmusl-b64539ae06aa91a407359238f4e909adb9bfab3d.tar.gz
musl-b64539ae06aa91a407359238f4e909adb9bfab3d.tar.xz
musl-b64539ae06aa91a407359238f4e909adb9bfab3d.zip
fix printf alt-form octal with value 0 and no explicit precision
commit 78897b0dc00b7cd5c29af5e0b7eebf2396d8dce0 wrongly simplified
Dmitry Levin's original submitted patch fixing alt-form octal with the
zero flag and field width present, omitting the special case where the
value is zero. as a result, printf("%#o",0) wrongly prints "00" rather
than "0".

the logic prior to this commit was actually better, in that it was
aligned with how the alt-form flag (#) for printf is specified ("it
shall increase the precision"). at the time there was no good way to
avoid the zero flag issue with the old logic, but commit
167dfe9672c116b315e72e57a55c7769f180dffa added tracking of whether an
explicit precision was provided.

revert commit 78897b0dc00b7cd5c29af5e0b7eebf2396d8dce0 and switch to
using the explicit precision indicator for suppressing the zero flag.
-rw-r--r--src/stdio/vfprintf.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
index 15356f53..50fb55c1 100644
--- a/src/stdio/vfprintf.c
+++ b/src/stdio/vfprintf.c
@@ -559,7 +559,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
 			if (0) {
 		case 'o':
 			a = fmt_o(arg.i, z);
-			if ((fl&ALT_FORM) && p<z-a+1) prefix+=5, pl=1;
+			if ((fl&ALT_FORM) && p<z-a+1) p=z-a+1;
 			} if (0) {
 		case 'd': case 'i':
 			pl=1;
@@ -574,7 +574,7 @@ static int printf_core(FILE *f, const char *fmt, va_list *ap, union arg *nl_arg,
 			a = fmt_u(arg.i, z);
 			}
 			if (xp && p<0) goto overflow;
-			if (p>=0) fl &= ~ZERO_PAD;
+			if (xp) fl &= ~ZERO_PAD;
 			if (!arg.i && !p) {
 				a=z;
 				break;