Skip to content

Commit f48f6b2

Browse files
author
silence
committed
Fix: Limit the number in the slab
1 parent e4cf88c commit f48f6b2

File tree

3 files changed

+20
-2
lines changed

3 files changed

+20
-2
lines changed

src/proto/streams/counts.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ impl Counts {
173173
self.max_send_streams
174174
}
175175

176+
/// Returns the maximum number of streams.
177+
pub(crate) fn max_streams(&self) -> usize {
178+
self.max_recv_streams + self.max_reset_streams
179+
}
180+
176181
/// Returns the maximum number of streams that can be initiated by the
177182
/// remote peer.
178183
pub(crate) fn max_recv_streams(&self) -> usize {

src/proto/streams/store.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ impl Store {
212212
self.ids.len()
213213
}
214214

215-
#[cfg(feature = "unstable")]
215+
/// Returns the number of streams that are held in slab.
216216
pub fn num_wired_streams(&self) -> usize {
217217
self.slab.len()
218218
}

src/proto/streams/streams.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,13 @@ where
312312
impl<B> DynStreams<'_, B> {
313313
pub fn recv_headers(&mut self, frame: frame::Headers) -> Result<(), Error> {
314314
let mut me = self.inner.lock().unwrap();
315-
315+
if me.store.num_wired_streams() > me.counts.max_streams() {
316+
tracing::error!("HEADERS: number of streams exceeds the upper limit.");
317+
return Err(Error::remote_go_away(
318+
Bytes::from("out of stream limit"),
319+
Reason::PROTOCOL_ERROR,
320+
));
321+
}
316322
me.recv_headers(self.peer, &self.send_buffer, frame)
317323
}
318324

@@ -349,6 +355,13 @@ impl<B> DynStreams<'_, B> {
349355

350356
pub fn recv_push_promise(&mut self, frame: frame::PushPromise) -> Result<(), Error> {
351357
let mut me = self.inner.lock().unwrap();
358+
if me.store.num_wired_streams() > me.counts.max_streams() {
359+
tracing::error!("PUSH_PROMISE: number of streams exceeds the upper limit.");
360+
return Err(Error::remote_go_away(
361+
Bytes::from("out of stream limit"),
362+
Reason::PROTOCOL_ERROR,
363+
));
364+
}
352365
me.recv_push_promise(&self.send_buffer, frame)
353366
}
354367

0 commit comments

Comments
 (0)