From bac9e77be1c524a1a86163383ab31d913ee51c42 Mon Sep 17 00:00:00 2001 From: chyyuu Date: Thu, 25 Apr 2019 23:14:23 +0800 Subject: [PATCH] fix bug: sys_sendfile: wrong length of written file --- kernel/src/syscall/fs.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/kernel/src/syscall/fs.rs b/kernel/src/syscall/fs.rs index e859eb9..a236bb7 100644 --- a/kernel/src/syscall/fs.rs +++ b/kernel/src/syscall/fs.rs @@ -684,7 +684,7 @@ pub fn sys_sendfile( count: usize, ) -> SysResult { info!( - "sendfile: out: {}, in: {}, offset_ptr: {:?}, count: {}", + "sendfile:BEG out: {}, in: {}, offset_ptr: {:?}, count: {}", out_fd, in_fd, offset_ptr, count ); let proc = process(); @@ -705,6 +705,7 @@ pub fn sys_sendfile( // read from specified offset and write new offset back let mut bytes_read = 0; + let mut bytes_written = 0; while bytes_read < count { let len = min(buffer.len(), count - bytes_read); let read_len = in_file.read_at(read_offset, &mut buffer[..len])?; @@ -713,13 +714,20 @@ pub fn sys_sendfile( } bytes_read += read_len; read_offset += read_len; - let mut bytes_written = 0; + + bytes_written = 0; + let mut rlen = read_len; while bytes_written < read_len { - let write_len = out_file.write(&buffer[bytes_written..])?; + let write_len = out_file.write(&buffer[bytes_written..(bytes_written+rlen)])?; if write_len == 0 { + info!( + "sendfile:END_ERR out: {}, in: {}, offset_ptr: {:?}, count: {} = bytes_read {}, bytes_written {}", + out_fd, in_fd, offset_ptr, count, bytes_read, bytes_written + ); return Err(SysError::EBADF); } bytes_written += write_len; + rlen-=write_len; } } @@ -730,7 +738,11 @@ pub fn sys_sendfile( } else { in_file.seek(SeekFrom::Current(bytes_read as i64))?; } - return Ok(bytes_read); + info!( + "sendfile:END out: {}, in: {}, offset_ptr: {:?}, count: {} = bytes_read {}, bytes_written {}", + out_fd, in_fd, offset_ptr, count, bytes_read, bytes_written + ); + return Ok(bytes_written); } impl Process {