Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date: Mon, 12 Oct 2020 19:43:42 +0300
From: Jouni Roivas <jouni.roivas@...era.com>
To: <musl@...ts.openwall.com>, <dalias@...c.org>
Subject: [PATCH v2] avoid writing two iov in __stdio_write backend when not needed

formally, calling writev with a zero-length first iov component should
behave identically to calling write on just the second component, but
presence of a zero-length iov component has triggered bugs in some
kernels.
---
 src/stdio/__stdio_write.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/stdio/__stdio_write.c b/src/stdio/__stdio_write.c
index d2d89475..eedce03a 100644
--- a/src/stdio/__stdio_write.c
+++ b/src/stdio/__stdio_write.c
@@ -11,6 +11,10 @@ size_t __stdio_write(FILE *f, const unsigned char *buf, size_t len)
 	size_t rem = iov[0].iov_len + iov[1].iov_len;
 	int iovcnt = 2;
 	ssize_t cnt;
+	if (iov[0].iov_len == 0) {
+		iov++;
+		iovcnt--;
+	}
 	for (;;) {
 		cnt = syscall(SYS_writev, f->fd, iov, iovcnt);
 		if (cnt == rem) {
-- 
2.25.1

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.