about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2022-09-07 18:41:09 -0400
committerRich Felker <dalias@aerifal.cx>2022-09-07 19:38:32 -0400
commit25085c85a0055a94919bf522c96803db7c885431 (patch)
tree93f0ddb17ccefb1981375e99a1d810d8ff746b98
parenta636fd630f70da01665c5cfaf01b8a657ef6c2fe (diff)
downloadmusl-25085c85a0055a94919bf522c96803db7c885431.tar.gz
musl-25085c85a0055a94919bf522c96803db7c885431.tar.xz
musl-25085c85a0055a94919bf522c96803db7c885431.zip
fix fwprintf missing output to open_wmemstream FILEs
open_wmemstream's write method was written assuming no buffering,
since it sets the FILE up with buf_len of zero in order to avoid
issues with position/seeking. however, as a consequence of commit
bd57e2b43a5b56c00a82adbde0e33e5820c81164, a FILE being written to by
the printf core has a temporary local buffer for the duration of the
operation if it was unbuffered to begin with. since this was
disregarded by the wide memstream's write method, output produced
through this code path, particularly numeric fields, was missing from
the output wchar buffer.

copy the equivalent logic for using the buffered data from the
byte-oriented open_memstream.
-rw-r--r--src/stdio/open_wmemstream.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/stdio/open_wmemstream.c b/src/stdio/open_wmemstream.c
index ed1b561d..b8ae4a79 100644
--- a/src/stdio/open_wmemstream.c
+++ b/src/stdio/open_wmemstream.c
@@ -40,8 +40,12 @@ fail:
 static size_t wms_write(FILE *f, const unsigned char *buf, size_t len)
 {
 	struct cookie *c = f->cookie;
-	size_t len2;
+	size_t len2 = f->wpos - f->wbase;
 	wchar_t *newbuf;
+	if (len2) {
+		f->wpos = f->wbase;
+		if (wms_write(f, f->wbase, len2) < len2) return 0;
+	}
 	if (len + c->pos >= c->space) {
 		len2 = 2*c->space+1 | c->pos+len+1;
 		if (len2 > SSIZE_MAX/4) return 0;