Skip to content

Commit d37c5d7

Browse files
committed
fix: switch pending replay to new keys after rekey
1 parent 0edb78b commit d37c5d7

2 files changed

Lines changed: 11 additions & 8 deletions

File tree

russh/src/client/mod.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,18 +1612,20 @@ async fn reply<H: Handler>(
16121612
// This is a rekey
16131613
{
16141614
let common = &mut session.common;
1615-
let enc = common.encrypted.as_mut().expect("checked encrypted");
1616-
enc.last_rekey = Instant::now();
1615+
common.newkeys(newkeys);
16171616
common.packet_writer.buffer().bytes = 0;
1618-
enc.flush_all_pending_with_writer(&mut common.packet_writer)?;
1617+
if let Some(enc) = common.encrypted.as_mut() {
1618+
enc.last_rekey = Instant::now();
1619+
enc.flush_all_pending_with_writer(&mut common.packet_writer)?;
1620+
}
16191621
}
1622+
16201623
let mut pending = std::mem::take(&mut session.pending_reads);
16211624
for p in pending.drain(..) {
16221625
session.process_packet(handler, &p).await?;
16231626
}
16241627
session.pending_reads = pending;
16251628
session.pending_len = 0;
1626-
session.common.newkeys(newkeys);
16271629
} else {
16281630
// This is the initial kex
16291631
if let Some(server_host_key) = &server_host_key {

russh/src/server/mod.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,10 +1120,12 @@ async fn reply<H: Handler + Send>(
11201120
// This is a rekey
11211121
{
11221122
let common = &mut session.common;
1123-
let enc = common.encrypted.as_mut().expect("checked encrypted");
1124-
enc.last_rekey = Instant::now();
1123+
common.newkeys(newkeys);
11251124
common.packet_writer.buffer().bytes = 0;
1126-
enc.flush_all_pending_with_writer(&mut common.packet_writer)?;
1125+
if let Some(enc) = common.encrypted.as_mut() {
1126+
enc.last_rekey = Instant::now();
1127+
enc.flush_all_pending_with_writer(&mut common.packet_writer)?;
1128+
}
11271129
}
11281130

11291131
let mut pending = std::mem::take(&mut session.pending_reads);
@@ -1132,7 +1134,6 @@ async fn reply<H: Handler + Send>(
11321134
}
11331135
session.pending_reads = pending;
11341136
session.pending_len = 0;
1135-
session.common.newkeys(newkeys);
11361137
session.flush()?;
11371138
} else {
11381139
// This is the initial kex

0 commit comments

Comments
 (0)