Skip to content

Commit e54fb26

Browse files
committed
fix(yamux): improve error detection
1 parent 77a9916 commit e54fb26

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

p2p/src/network/scheduler/p2p_network_scheduler_state.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,8 +196,10 @@ pub enum P2pNetworkConnectionError {
196196
StreamReset(StreamId),
197197
#[error("pubsub error: {0}")]
198198
PubSubError(String),
199-
#[error("peer make us keep too much data")]
199+
#[error("peer make us keep too much data at stream {0}")]
200200
YamuxOverflow(StreamId),
201+
#[error("peer should not decrease window size at stream {0}")]
202+
YamuxBadWindowUpdate(StreamId),
201203
}
202204

203205
#[derive(Serialize, Deserialize, Debug, Clone)]

p2p/src/network/yamux/p2p_network_yamux_reducer.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,16 @@ impl P2pNetworkYamuxState {
344344
});
345345
}
346346
}
347-
YamuxFrameInner::WindowUpdate { .. } => {
348-
while let Some(frame) = pending_outgoing.pop_front() {
349-
dispatcher.push(P2pNetworkYamuxAction::OutgoingFrame { addr, frame });
347+
YamuxFrameInner::WindowUpdate { difference } => {
348+
if *difference < 0 {
349+
let error =
350+
P2pNetworkConnectionError::YamuxBadWindowUpdate(frame.stream_id);
351+
dispatcher.push(P2pNetworkSchedulerAction::Error { addr, error });
352+
} else {
353+
while let Some(frame) = pending_outgoing.pop_front() {
354+
dispatcher
355+
.push(P2pNetworkYamuxAction::OutgoingFrame { addr, frame });
356+
}
350357
}
351358
}
352359
_ => {}

0 commit comments

Comments
 (0)