From 055ef8cbe9cbbbee4042602d0ee6cc172f953cdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Sobala?= Date: Mon, 15 Sep 2025 13:43:57 +0200 Subject: [PATCH 1/2] Rust: fix unsetting source udp address when not specified by the user --- src/rust/src/parser.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/rust/src/parser.rs b/src/rust/src/parser.rs index 818ab6227..f0121cbfa 100644 --- a/src/rust/src/parser.rs +++ b/src/rust/src/parser.rs @@ -1332,10 +1332,11 @@ impl OptionsExt for Options { let addr = &udp[0..colon]; let port = get_atoi_hex(&udp[colon + 1..]); - self.udpsrc = Some(udp.clone()); + self.udpsrc = None; self.udpaddr = Some(addr.to_owned()); self.udpport = port; } else { + self.udpsrc = None; self.udpaddr = None; self.udpport = udp.parse().unwrap(); } From d35d53a8df1f771d01e71e8f8c11534df883652b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Sobala?= Date: Mon, 15 Sep 2025 14:48:24 +0200 Subject: [PATCH 2/2] Rust: Fix `--udp [[src@]host:]port` parameter --- src/rust/src/args.rs | 7 +++---- src/rust/src/parser.rs | 35 ++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/rust/src/args.rs b/src/rust/src/args.rs index bdc6bcca5..7c73f2379 100644 --- a/src/rust/src/args.rs +++ b/src/rust/src/args.rs @@ -174,10 +174,9 @@ pub struct Args { pub segmentonkeyonly: bool, /// Read the input via UDP (listening in the specified port) /// instead of reading a file. - /// Host can be a - /// hostname or IPv4 address. If host is not specified - /// then listens on the local host. - #[arg(long, value_name="[host:]port", verbatim_doc_comment, help_heading=NETWORK_SUPPORT)] + /// Host and src can be a hostname or IPv4 address. + /// If host is not specified then listens on the local host. + #[arg(long, value_name="[[src@]host:]port", verbatim_doc_comment, help_heading=NETWORK_SUPPORT)] pub udp: Option, /// Can be a hostname or IPv4 address. #[arg(long, value_name="port", verbatim_doc_comment, help_heading=NETWORK_SUPPORT)] diff --git a/src/rust/src/parser.rs b/src/rust/src/parser.rs index f0121cbfa..613183360 100644 --- a/src/rust/src/parser.rs +++ b/src/rust/src/parser.rs @@ -1321,24 +1321,33 @@ impl OptionsExt for Options { // Network stuff if let Some(ref udp) = args.udp { - if let Some(at) = udp.find('@') { - let addr = &udp[0..at]; - let port = &udp[at + 1..]; + let mut remaining_udp = udp.as_str(); - self.udpsrc = Some(udp.clone()); - self.udpaddr = Some(addr.to_owned()); - self.udpport = port.parse().unwrap(); - } else if let Some(colon) = udp.find(':') { - let addr = &udp[0..colon]; - let port = get_atoi_hex(&udp[colon + 1..]); + if let Some(at) = remaining_udp.find('@') { + let src = &remaining_udp[0..at]; + self.udpsrc = Some(src.to_owned()); + + remaining_udp = &remaining_udp[at + 1..]; + } + + if let Some(colon) = remaining_udp.find(':') { + let addr = &remaining_udp[0..colon]; + let port = get_atoi_hex(&remaining_udp[colon + 1..]); - self.udpsrc = None; self.udpaddr = Some(addr.to_owned()); self.udpport = port; } else { - self.udpsrc = None; - self.udpaddr = None; - self.udpport = udp.parse().unwrap(); + match remaining_udp.parse() { + Ok(port) => { + self.udpport = port; + } + Err(_) => { + fatal!( + cause = ExitCause::MalformedParameter; + "Invalid UDP parameter\n" + ); + } + } } self.input_source = DataSource::Network;