Skip to content

Commit d4acd49

Browse files
committed
Make read_packet cancel safe.
This places updating the packet counter to after the IO, ensuring it is only done when all the IO related operations are finished, ensuring no overcounting.
1 parent 0853244 commit d4acd49

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

src/proto.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,6 @@ impl<R: AsyncReadExt + Unpin> DecryptingReader<R> {
153153
self.decrypted_buf.clear();
154154
self.unread_start = 0;
155155

156-
let packet_number = self.packet_number;
157-
self.packet_number = self.packet_number.wrapping_add(1);
158-
159156
if let Some((decrypting_key, integrity_key)) = &mut self.decryption_key {
160157
let block_len = decrypting_key.algorithm().block_len();
161158

@@ -193,6 +190,11 @@ impl<R: AsyncReadExt + Unpin> DecryptingReader<R> {
193190
)
194191
.await?;
195192

193+
// Note: this needs to be done AFTER the IO to ensure
194+
// this async function is cancel-safe
195+
let packet_number = self.packet_number;
196+
self.packet_number = self.packet_number.wrapping_add(1);
197+
196198
let update = decrypting_key
197199
.update(
198200
&self.buf[self.unread_start + block_len
@@ -249,6 +251,10 @@ impl<R: AsyncReadExt + Unpin> DecryptingReader<R> {
249251
)
250252
.await?;
251253

254+
// Note: this needs to be done AFTER the IO to ensure
255+
// this async function is cancel-safe
256+
self.packet_number = self.packet_number.wrapping_add(1);
257+
252258
let Decoded {
253259
value: packet,
254260
next,

0 commit comments

Comments
 (0)