Skip to content

Commit efd4d5f

Browse files
authored
fix syn flood crash (#70)
1 parent 3c63f4a commit efd4d5f

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

oryx-tui/src/section/alert/syn_flood.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::{
22
collections::HashMap,
33
net::IpAddr,
4-
sync::{Arc, Mutex, RwLock, atomic::AtomicBool},
4+
sync::{Arc, RwLock, atomic::AtomicBool},
55
thread,
66
time::Duration,
77
};
@@ -25,12 +25,12 @@ const WIN_SIZE: usize = 100_000;
2525
#[derive(Debug)]
2626
pub struct SynFlood {
2727
pub detected: Arc<AtomicBool>,
28-
pub map: Arc<Mutex<HashMap<IpAddr, usize>>>,
28+
pub map: Arc<RwLock<HashMap<IpAddr, usize>>>,
2929
}
3030

3131
impl SynFlood {
3232
pub fn new(packets: Arc<RwLock<Vec<AppPacket>>>) -> Self {
33-
let map: Arc<Mutex<HashMap<IpAddr, usize>>> = Arc::new(Mutex::new(HashMap::new()));
33+
let map: Arc<RwLock<HashMap<IpAddr, usize>>> = Arc::new(RwLock::new(HashMap::new()));
3434

3535
let detected = Arc::new(AtomicBool::new(false));
3636

@@ -41,7 +41,12 @@ impl SynFlood {
4141
move || loop {
4242
let start_index = {
4343
let packets = packets.read().unwrap();
44-
packets.len().saturating_sub(1)
44+
let count = packets
45+
.iter()
46+
.filter(|packet| packet.direction == TrafficDirection::Ingress)
47+
.count();
48+
49+
count.saturating_sub(1)
4550
};
4651

4752
thread::sleep(Duration::from_secs(5));
@@ -56,7 +61,7 @@ impl SynFlood {
5661
.filter(|packet| packet.direction == TrafficDirection::Ingress)
5762
.collect();
5863

59-
let mut map = map.lock().unwrap();
64+
let mut map = map.write().unwrap();
6065
map.clear();
6166

6267
if app_packets.len() < WIN_SIZE {
@@ -116,7 +121,7 @@ impl SynFlood {
116121

117122
pub fn render(&self, frame: &mut Frame, block: Rect) {
118123
let mut ips: Vec<(IpAddr, usize)> = {
119-
let map = self.map.lock().unwrap();
124+
let map = self.map.read().unwrap();
120125
map.clone().into_iter().collect()
121126
};
122127
ips.sort_by(|a, b| b.1.cmp(&a.1));

0 commit comments

Comments
 (0)