Skip to content

Commit 1b97d61

Browse files
committed
io: handle partial writes in splice copy pipe draining
1 parent 9372144 commit 1b97d61

1 file changed

Lines changed: 12 additions & 7 deletions

File tree

main/io/php_io_copy_linux.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -236,14 +236,19 @@ static ssize_t php_io_linux_splice_via_pipe(php_io_fd *src, int dest_fd, size_t
236236
if (drained <= 0) {
237237
break;
238238
}
239-
ssize_t written = write(dest_fd, drain_buf, drained);
240-
if (written <= 0) {
241-
close(pipefd[0]);
242-
close(pipefd[1]);
243-
return total_copied > 0 ? (ssize_t) total_copied : -1;
239+
ssize_t drain_written = 0;
240+
while (drain_written < drained) {
241+
ssize_t written = write(dest_fd, drain_buf + drain_written, drained - drain_written);
242+
if (written <= 0) {
243+
close(pipefd[0]);
244+
close(pipefd[1]);
245+
total_copied += drain_written;
246+
return total_copied > 0 ? (ssize_t) total_copied : -1;
247+
}
248+
drain_written += written;
244249
}
245-
pipe_remaining -= written;
246-
total_copied += written;
250+
pipe_remaining -= drain_written;
251+
total_copied += drain_written;
247252
}
248253
close(pipefd[0]);
249254
close(pipefd[1]);

0 commit comments

Comments
 (0)