pijul nest
guest [sign in]

Correct usage of `tokio::select!`

[?]
Nov 26, 2020, 3:30 PM
KNLLUDOIG47X7V7SMRTKBCLZ6SCKEETLNKBNS5ARCYCD2RJLIEQAC

Dependencies

  • [2] Y5HHIQXV Wait for the connection to be encrypted in `connect`
  • [3] SJBZKVM5 Debug messages
  • [4] 7FRJYUI6 Reboot because of a bad change

Change contents

  • replacement in thrussh/src/ssh_read.rs at line 45
    [4.167813][4.167813:167823]()
    r: R,
    [4.167813]
    [4.167823]
    pub r: R,
    }
    impl<R: AsyncRead + AsyncWrite> SshRead<R> {
    pub fn split(self) -> (SshRead<tokio::io::ReadHalf<R>>, tokio::io::WriteHalf<R>) {
    let (r, w) = tokio::io::split(self.r);
    (SshRead {
    id: self.id,
    r
    }, w)
    }
  • edit in thrussh/src/ssh_read.rs at line 58
    [4.167826]
    [4.167826]
  • edit in thrussh/src/server/mod.rs at line 25
    [4.204219]
    [4.204219]
    use tokio::pin;
  • edit in thrussh/src/server/mod.rs at line 443
    [4.217871]
    [4.217871]
    }
    async fn start_reading<R: AsyncRead + Unpin>(mut stream_read: R, mut buffer: SSHBuffer, cipher: Arc<crate::cipher::CipherPair>) -> Result<(usize, R, SSHBuffer), anyhow::Error> {
    buffer.buffer.clear();
    let n = cipher::read(&mut stream_read, &mut buffer, &cipher).await?;
    Ok((n, stream_read, buffer))
  • replacement in thrussh/src/server/mod.rs at line 482
    [4.218911][4.218911:218950]()
    let mut buffer = SSHBuffer::new();
    [4.218911]
    [4.218950]
    let (stream_read, mut stream_write) = stream.split();
    let buffer = SSHBuffer::new();
    let reading = start_reading(stream_read, buffer, session.common.cipher.clone());
    pin!(reading);
  • replacement in thrussh/src/server/mod.rs at line 490
    [4.219017][4.219017:219101]()
    _ = cipher::read(&mut stream, &mut buffer, &session.common.cipher) => {
    [4.219017]
    [4.219101]
    Ok((_, stream_read, buffer)) = &mut reading => {
  • edit in thrussh/src/server/mod.rs at line 524
    [4.220266]
    [4.220266]
    reading.set(start_reading(stream_read, buffer, session.common.cipher.clone()));
  • replacement in thrussh/src/server/mod.rs at line 563
    [4.221994][4.221994:222009]()
    stream
    [4.221994]
    [4.222009]
    stream_write
  • edit in thrussh/src/server/mod.rs at line 566
    [4.222090][4.222090:222121]()
    buffer.buffer.clear();
  • replacement in thrussh/src/server/mod.rs at line 570
    [4.222223][4.222223:222398]()
    stream.shutdown().await?;
    buffer.buffer.clear();
    while cipher::read(&mut stream, &mut buffer, &session.common.cipher).await? != 0 {
    buffer.buffer.clear();
    [4.222223]
    [4.222398]
    stream_write.shutdown().await?;
    loop {
    let (n, r, b) = (&mut reading).await?;
    if n == 0 {
    break
    } else {
    reading.set(start_reading(r, b, session.common.cipher.clone()))
    }
  • edit in thrussh/src/client/mod.rs at line 36
    [4.336202]
    [4.336202]
    use tokio::pin;
  • edit in thrussh/src/client/mod.rs at line 809
    [4.358296]
    [4.358296]
    async fn start_reading<R: AsyncRead + Unpin>(mut stream_read: R, mut buffer: SSHBuffer, cipher: Arc<crate::cipher::CipherPair>) -> Result<(usize, R, SSHBuffer), anyhow::Error> {
    buffer.buffer.clear();
    let n = cipher::read(&mut stream_read, &mut buffer, &cipher).await?;
    Ok((n, stream_read, buffer))
    }
  • replacement in thrussh/src/client/mod.rs at line 818
    [4.358408][4.358408:358431]()
    mut stream: R,
    [4.358408]
    [4.358431]
    mut stream: SshRead<R>,
  • edit in thrussh/src/client/mod.rs at line 829
    [4.358814][4.358814:358857]()
    let mut buffer = SSHBuffer::new();
  • edit in thrussh/src/client/mod.rs at line 831
    [4.358941]
    [4.358941]
    let (stream_read, mut stream_write) = stream.split();
    let buffer = SSHBuffer::new();
    let reading = start_reading(stream_read, buffer, self.common.cipher.clone());
    pin!(reading);
  • replacement in thrussh/src/client/mod.rs at line 839
    [4.359012][4.359012:359160]()
    n = cipher::read(&mut stream, &mut buffer, &self.common.cipher) => {
    if n.is_err() || buffer.buffer.len() < 5 {
    [4.359012]
    [4.359160]
    Ok((_, stream_read, buffer)) = &mut reading => {
    if buffer.buffer.len() < 5 {
  • edit in thrussh/src/client/mod.rs at line 864
    [2.384]
    [4.360055]
    reading.set(start_reading(stream_read, buffer, self.common.cipher.clone()));
  • replacement in thrussh/src/client/mod.rs at line 930
    [3.298][4.364252:364366](),[4.364252][4.364252:364366]()
    stream.write_all(&self.common.write_buffer.buffer).await?;
    stream.flush().await?;
    [3.298]
    [4.364366]
    stream_write.write_all(&self.common.write_buffer.buffer).await?;
    stream_write.flush().await?;
  • edit in thrussh/src/client/mod.rs at line 933
    [4.364380][4.364380:364415]()
    buffer.buffer.clear();
  • replacement in thrussh/src/client/mod.rs at line 943
    [4.364852][4.364852:365095]()
    stream.shutdown().await?;
    // Shutdown
    buffer.buffer.clear();
    while cipher::read(&mut stream, &mut buffer, &self.common.cipher).await? != 0 {
    buffer.buffer.clear();
    }
    [4.364852]
    [4.365095]
    stream_write.shutdown().await?;