Skip to content

Commit 09a108a

Browse files
committed
stream_to_fd: always consume the stream until the end
1 parent 4e7329c commit 09a108a

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

src/vmm_unix.ml

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -543,33 +543,39 @@ let stream_to_fd ?(byte_size = Int.max_int) fd stream name =
543543
let open Lwt.Infix in
544544
let exception Malformed_data of string in
545545
Lwt.catch (fun () ->
546-
let rec read_more size =
546+
let rec read_more fd stream size =
547547
Lwt_stream.get stream >>= function
548548
| None -> Lwt.return (Ok ())
549549
| Some `Data data ->
550550
if String.length data > byte_size - size then begin
551551
Logs.err (fun m -> m "stream exceeds size");
552552
Lwt.return (Error (`Msg "stream exceeds size"))
553553
end else
554-
let rec write off =
555-
Lwt_unix.write fd (Bytes.unsafe_of_string data) off
556-
(String.length data - off) >>= fun written ->
557-
if written = String.length data - off then
558-
read_more (size + String.length data)
554+
let rec write fd data off len =
555+
let to_write = len - off in
556+
Lwt_unix.write fd data off to_write >>= fun written ->
557+
if written = to_write then
558+
read_more fd stream (size + len)
559559
else
560-
write (off + written)
560+
write fd data (off + written) len
561561
in
562-
write 0
562+
write fd (Bytes.unsafe_of_string data) 0 (String.length data)
563563
| Some `Malformed msg ->
564564
raise (Malformed_data msg)
565565
in
566-
read_more 0 >>= fun r ->
566+
read_more fd stream 0 >>= fun r ->
567567
safe_close fd >|= fun () ->
568568
r)
569569
(fun e ->
570570
Logs.err (fun m -> m "error writing %a: %s"
571571
Fpath.pp name (Printexc.to_string e));
572-
safe_close fd >|= fun () ->
572+
safe_close fd >>= fun () ->
573+
let rec drop_stream s =
574+
Lwt_stream.get s >>= function
575+
| None -> Lwt.return_unit
576+
| Some _ -> drop_stream s
577+
in
578+
drop_stream stream >|= fun () ->
573579
Error (`Msg "error writing to file descriptor"))
574580

575581
let stream_to_block ~size ~byte_size stream name =

0 commit comments

Comments
 (0)