Skip to content

Commit 60ba656

Browse files
committed
feat: avoid redundant UDP session clones and improve validation
Reduces unnecessary cloning by reusing the locked UDP sessions object. Moves address validation before packet send to streamline logic and prevent misuse. Improves performance and code clarity by minimizing locking and cloning overhead.
1 parent 3aaf06e commit 60ba656

1 file changed

Lines changed: 13 additions & 17 deletions

File tree

asport-server/src/connection/handle_task.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,17 @@ impl Connection {
101101
dst_addr = addr,
102102
);
103103

104-
let sessions = match self.udp_sessions.lock().await.clone() {
104+
let socket_addr = match addr {
105+
Address::None => {
106+
return Err(Error::from(IoError::new(ErrorKind::NotFound, "no address")));
107+
}
108+
Address::SocketAddress(addr) => addr,
109+
};
110+
111+
// Validate destination address and send packet in one step
112+
// This avoids cloning the sessions object multiple times
113+
let udp_sessions_lock = self.udp_sessions.lock().await;
114+
let sessions = match udp_sessions_lock.as_ref() {
105115
Some(sessions) => sessions,
106116
None => {
107117
return Err(Error::from(IoError::new(
@@ -111,31 +121,17 @@ impl Connection {
111121
}
112122
};
113123

114-
let socket_addr = match addr {
115-
Address::None => {
116-
return Err(Error::from(IoError::new(ErrorKind::NotFound, "no address")));
117-
}
118-
Address::SocketAddress(addr) => addr,
119-
};
120-
121124
// Validate destination address
122125
// Because client can send packet with any address, we need to validate it.
123126
// If not, it can be used for proxy.
124-
if !self
125-
.udp_sessions
126-
.lock()
127-
.await
128-
.clone()
129-
.unwrap()
130-
.validate(assoc_id, socket_addr)
131-
{
132-
// unwrap() is safe because of it's checked.
127+
if !sessions.validate(assoc_id, socket_addr) {
133128
return Err(Error::from(IoError::new(
134129
ErrorKind::InvalidInput,
135130
"destination address is not valid",
136131
)));
137132
}
138133

134+
// Send packet without additional cloning
139135
sessions.send_to(pkt, socket_addr).await
140136
};
141137

0 commit comments

Comments
 (0)