[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]>