Fix io::default_read_to_end uses of read_buf
This commit is contained in:
parent
04710e27d2
commit
bf768886d1
1 changed files with 14 additions and 10 deletions
|
|
@ -474,18 +474,28 @@ pub(crate) fn default_read_to_end<R: Read + ?Sized>(
|
|||
}
|
||||
|
||||
let mut cursor = read_buf.unfilled();
|
||||
loop {
|
||||
let result = loop {
|
||||
match r.read_buf(cursor.reborrow()) {
|
||||
Ok(()) => break,
|
||||
Err(e) if e.is_interrupted() => continue,
|
||||
Err(e) => return Err(e),
|
||||
// Do not stop now in case of error: we might have received both data
|
||||
// and an error
|
||||
res => break res,
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let unfilled_but_initialized = cursor.init_ref().len();
|
||||
let bytes_read = cursor.written();
|
||||
let was_fully_initialized = read_buf.init_len() == buf_len;
|
||||
|
||||
// SAFETY: BorrowedBuf's invariants mean this much memory is initialized.
|
||||
unsafe {
|
||||
let new_len = bytes_read + buf.len();
|
||||
buf.set_len(new_len);
|
||||
}
|
||||
|
||||
// Now that all data is pushed to the vector, we can fail without data loss
|
||||
result?;
|
||||
|
||||
if bytes_read == 0 {
|
||||
return Ok(buf.len() - start_len);
|
||||
}
|
||||
|
|
@ -499,12 +509,6 @@ pub(crate) fn default_read_to_end<R: Read + ?Sized>(
|
|||
// store how much was initialized but not filled
|
||||
initialized = unfilled_but_initialized;
|
||||
|
||||
// SAFETY: BorrowedBuf's invariants mean this much memory is initialized.
|
||||
unsafe {
|
||||
let new_len = bytes_read + buf.len();
|
||||
buf.set_len(new_len);
|
||||
}
|
||||
|
||||
// Use heuristics to determine the max read size if no initial size hint was provided
|
||||
if size_hint.is_none() {
|
||||
// The reader is returning short reads but it doesn't call ensure_init().
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue