Commit 8695b9fbe7

daurnimator <quae@daurnimator.com>
2020-11-18 16:10:14
std: use reader.skipBytes to avoid infinite loop in writeFileAllUnseekable
skipBytes correctly handles EOF for us
1 parent 0ab8ae9
Changed files (1)
lib
std
lib/std/fs/file.zig
@@ -698,7 +698,7 @@ pub const File = struct {
         header_count: usize = 0,
     };
 
-    pub const WriteFileError = ReadError || WriteError;
+    pub const WriteFileError = ReadError || error{EndOfStream} || WriteError;
 
     pub fn writeFileAll(self: File, in_file: File, args: WriteFileOptions) WriteFileError!void {
         return self.writeFileAllSendfile(in_file, args) catch |err| switch (err) {
@@ -722,16 +722,9 @@ pub const File = struct {
 
         try self.writevAll(headers);
 
+        try in_file.reader().skipBytes(args.in_offset, .{ .buf_size = 4096 });
+
         var buffer: [4096]u8 = undefined;
-        {
-            var index: usize = 0;
-            // Skip in_offset bytes.
-            while (index < args.in_offset) {
-                const ask = math.min(buffer.len, args.in_offset - index);
-                const amt = try in_file.read(buffer[0..ask]);
-                index += amt;
-            }
-        }
         const in_len = args.in_len orelse math.maxInt(u64);
         var index: usize = 0;
         while (index < in_len) {