[PATCH] alpha: objstrip: fix partial write() buffer pointer not advancing

Maximilian Pezzullo via B4 Relay <[email protected]>
Newsgroups org.kernel.vger.linux-alpha,org.kernel.feeds.b4-sent,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
From: Maximilian Pezzullo <[email protected]>

In the main copy loop, on a partial write() the inner do-while
retried write(ofd, buf, n) always from the start of buf, while
only n was decremented.  This caused already-written data to be
re-written, corrupting the output file on systems where write()
returns less than the requested byte count.

Fix by introducing a pointer 'p' that tracks the current write
position within buf and advances it by nwritten on each iteration.

Closes: https://bugzilla.kernel.org/show_bug.cgi?id=221159
Signed-off-by: Maximilian Pezzullo <[email protected]>
---
 arch/alpha/boot/tools/objstrip.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/arch/alpha/boot/tools/objstrip.c b/arch/alpha/boot/tools/objstrip.c
index 7cf92d172dc..8da25c2584f 100644
--- a/arch/alpha/boot/tools/objstrip.c
+++ b/arch/alpha/boot/tools/objstrip.c
@@ -246,14 +246,18 @@ main (int argc, char *argv[])
 	    perror("read");
 	    exit(1);
 	}
-	do {
-	    nwritten = write(ofd, buf, n);
-	    if ((ssize_t) nwritten == -1) {
-		perror("write");
-		exit(1);
-	    }
-	    n -= nwritten;
-	} while (n > 0);
+	{
+	    char *p = buf;
+	    do {
+		nwritten = write(ofd, p, n);
+		if ((ssize_t) nwritten == -1) {
+		    perror("write");
+		    exit(1);
+		}
+		p += nwritten;
+		n -= nwritten;
+	    } while (n > 0);
+	}
     }
 
     if (pad) {

---
base-commit: af4e9ef3d78420feb8fe58cd9a1ab80c501b3c08
change-id: 20260303-alpha-fix-ce5f70ee801d

Best regards,
-- 
Maximilian Pezzullo <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.