Skip to content

Commit 8e54d99

Browse files
committed
fixed bug. ProxyClientStream write may missed the addr if send() returns EAGAIN
1 parent c4f0687 commit 8e54d99

File tree

1 file changed

+16
-10
lines changed
  • crates/shadowsocks/src/relay/tcprelay/proxy_stream

1 file changed

+16
-10
lines changed

crates/shadowsocks/src/relay/tcprelay/proxy_stream/client.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -177,19 +177,25 @@ where
177177
S: AsyncRead + AsyncWrite + Unpin,
178178
{
179179
fn poll_write(mut self: Pin<&mut Self>, cx: &mut task::Context<'_>, buf: &[u8]) -> Poll<Result<usize, io::Error>> {
180-
if self.addr.is_none() {
181-
// For all subsequence calls, just proxy it to self.stream
182-
return self.stream.poll_write_encrypted(cx, buf);
183-
}
180+
match self.addr {
181+
None => {
182+
// For all subsequence calls, just proxy it to self.stream
183+
return self.stream.poll_write_encrypted(cx, buf);
184+
}
185+
Some(ref addr) => {
186+
let addr_length = addr.serialized_len();
184187

185-
let addr = self.addr.take().unwrap();
186-
let addr_length = addr.serialized_len();
188+
let mut buffer = BytesMut::with_capacity(addr_length + buf.len());
189+
addr.write_to_buf(&mut buffer);
190+
buffer.put_slice(buf);
187191

188-
let mut buffer = BytesMut::with_capacity(addr_length + buf.len());
189-
addr.write_to_buf(&mut buffer);
190-
buffer.put_slice(buf);
192+
ready!(self.stream.poll_write_encrypted(cx, &buffer))?;
193+
194+
// fallthrough. take the self.addr out
195+
}
196+
}
191197

192-
ready!(self.stream.poll_write_encrypted(cx, &buffer))?;
198+
let _ = self.addr.take();
193199

194200
// NOTE:
195201
// poll_write will return Ok(0) if buf.len() == 0

0 commit comments

Comments
 (0)