Skip to content

Commit e3d9b3d

Browse files
committed
fix safe_io bug
1 parent 90f1499 commit e3d9b3d

File tree

5 files changed

+49
-27
lines changed

5 files changed

+49
-27
lines changed

example/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ rustls = {version = "0.20", features = ["tls12"]}
99
rustls-pemfile = "1"
1010
webpki-roots = "0.22"
1111

12-
monoio-rustls = {version = "0.0.5", path = "../monoio-rustls", features = ["tls12"]}
12+
monoio-rustls = {version = "0.0.6", path = "../monoio-rustls", features = ["tls12"]}
1313

1414
[[bin]]
1515
name = "server"

monoio-rustls/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ license = "MIT/Apache-2.0"
88
name = "monoio-rustls"
99
readme = "README.md"
1010
repository = "https://github.com/monoio-rs/monoio-tls"
11-
version = "0.0.5"
11+
version = "0.0.6"
1212

1313
[dependencies]
1414
bytes = {version = "1"}
15-
monoio = {version = "0.0.8", default-features = false, features = ["bytes"]}
15+
monoio = {version = "0.0.8", default-features = false}
1616
rustls = {version = "0.20", default-features = false}
1717
thiserror = {version = "1"}
1818

@@ -26,5 +26,5 @@ tls12 = ["rustls/tls12"]
2626
unsafe_io = []
2727

2828
[dev-dependencies]
29-
monoio = {version = "0.0.8", features = ["bytes"]}
29+
monoio = {version = "0.0.8"}
3030
webpki-roots = "0.22"

monoio-rustls/src/safe_io.rs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{hint::unreachable_unchecked, io};
1+
use std::{fmt::Debug, hint::unreachable_unchecked, io};
22

33
use monoio::{
44
buf::{IoBuf, IoBufMut},
@@ -39,7 +39,7 @@ impl Buffer {
3939
}
4040

4141
fn advance(&mut self, n: usize) {
42-
assert!(self.write - self.read <= n);
42+
assert!(self.write - self.read >= n);
4343
self.read += n;
4444
if self.read == self.write {
4545
self.read = 0;
@@ -78,6 +78,15 @@ pub(crate) struct SafeRead {
7878
status: ReadStatus,
7979
}
8080

81+
impl Debug for SafeRead {
82+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
83+
f.debug_struct("SafeRead")
84+
.field("status", &self.status)
85+
.finish()
86+
}
87+
}
88+
89+
#[derive(Debug)]
8190
enum ReadStatus {
8291
Eof,
8392
Err(io::Error),
@@ -108,16 +117,16 @@ impl SafeRead {
108117
match result {
109118
Ok(0) => {
110119
self.status = ReadStatus::Eof;
111-
return result;
120+
result
112121
}
113122
Ok(_) => {
114123
self.status = ReadStatus::Ok;
115-
return result;
124+
result
116125
}
117126
Err(e) => {
118127
let rerr = e.kind().into();
119128
self.status = ReadStatus::Err(e);
120-
return Err(rerr);
129+
Err(rerr)
121130
}
122131
}
123132
}
@@ -153,6 +162,15 @@ pub(crate) struct SafeWrite {
153162
status: WriteStatus,
154163
}
155164

165+
impl Debug for SafeWrite {
166+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
167+
f.debug_struct("SafeWrite")
168+
.field("status", &self.status)
169+
.finish()
170+
}
171+
}
172+
173+
#[derive(Debug)]
156174
enum WriteStatus {
157175
Err(io::Error),
158176
Ok,

monoio-rustls/src/stream.rs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,24 @@ use crate::split::{ReadHalf, WriteHalf};
1919
pub struct Stream<IO, C> {
2020
pub(crate) io: IO,
2121
pub(crate) session: C,
22+
#[cfg(not(feature = "unsafe_io"))]
23+
r_buffer: crate::safe_io::SafeRead,
24+
#[cfg(not(feature = "unsafe_io"))]
25+
w_buffer: crate::safe_io::SafeWrite,
26+
#[cfg(feature = "unsafe_io")]
27+
r_buffer: crate::unsafe_io::UnsafeRead,
28+
#[cfg(feature = "unsafe_io")]
29+
w_buffer: crate::unsafe_io::UnsafeWrite,
2230
}
2331

2432
impl<IO, C> Stream<IO, C> {
2533
pub fn new(io: IO, session: C) -> Self {
26-
Self { io, session }
34+
Self {
35+
io,
36+
session,
37+
r_buffer: Default::default(),
38+
w_buffer: Default::default(),
39+
}
2740
}
2841

2942
pub fn split(self) -> (ReadHalf<IO, C>, WriteHalf<IO, C>) {
@@ -46,20 +59,15 @@ where
4659
C: DerefMut + Deref<Target = ConnectionCommon<SD>>,
4760
{
4861
pub(crate) async fn read_io(&mut self, splitted: bool) -> io::Result<usize> {
49-
#[cfg(feature = "unsafe_io")]
50-
let mut reader = crate::unsafe_io::UnsafeRead::default();
51-
#[cfg(not(feature = "unsafe_io"))]
52-
let mut reader = crate::safe_io::SafeRead::default();
53-
5462
let n = loop {
55-
match self.session.read_tls(&mut reader) {
63+
match self.session.read_tls(&mut self.r_buffer) {
5664
Ok(n) => {
5765
break n;
5866
}
5967
Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => {
6068
#[allow(unused_unsafe)]
6169
unsafe {
62-
reader.do_io(&mut self.io).await?
70+
self.r_buffer.do_io(&mut self.io).await?
6371
};
6472
continue;
6573
}
@@ -92,20 +100,15 @@ where
92100
}
93101

94102
pub(crate) async fn write_io(&mut self) -> io::Result<usize> {
95-
#[cfg(feature = "unsafe_io")]
96-
let mut writer = crate::unsafe_io::UnsafeWrite::default();
97-
#[cfg(not(feature = "unsafe_io"))]
98-
let mut writer = crate::safe_io::SafeWrite::default();
99-
100103
let n = loop {
101-
match self.session.write_tls(&mut writer) {
104+
match self.session.write_tls(&mut self.w_buffer) {
102105
Ok(n) => {
103106
break n;
104107
}
105108
Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => {
106109
#[allow(unused_unsafe)]
107110
unsafe {
108-
writer.do_io(&mut self.io).await?
111+
self.w_buffer.do_io(&mut self.io).await?
109112
};
110113
continue;
111114
}
@@ -114,7 +117,7 @@ where
114117
};
115118
// Flush buffered data, only needed for safe_io.
116119
#[cfg(not(feature = "unsafe_io"))]
117-
writer.do_io(&mut self.io).await?;
120+
self.w_buffer.do_io(&mut self.io).await?;
118121

119122
Ok(n)
120123
}

monoio-rustls/src/unsafe_io.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use monoio::{
66
};
77

88
/// Used by both UnsafeRead and UnsafeWrite.
9+
#[derive(Debug)]
910
enum Status {
1011
/// We haven't do real io, and maybe the dest is recorded.
1112
WaitFill(Option<(*const u8, usize)>),
@@ -27,7 +28,7 @@ impl Default for Status {
2728
/// Note that this action is an unsafe hack to avoid data copy.
2829
/// You can only use this wrapper when you make sure the read dest is always
2930
/// a valid buffer.
30-
#[derive(Default)]
31+
#[derive(Default, Debug)]
3132
pub(crate) struct UnsafeRead {
3233
status: Status,
3334
}
@@ -72,7 +73,7 @@ impl io::Read for UnsafeRead {
7273
}
7374

7475
/// UnsafeWrite behaves like `UnsafeRead`.
75-
#[derive(Default)]
76+
#[derive(Default, Debug)]
7677
pub(crate) struct UnsafeWrite {
7778
status: Status,
7879
}

0 commit comments

Comments
 (0)