From 0a99823be1b0ca022e48e941e09487bd41ec123b Mon Sep 17 00:00:00 2001 From: Ruben Serrano Izquierdo Date: Mon, 3 Apr 2023 19:40:25 +0200 Subject: [PATCH] Fix flag wrong comparison Bump sys version Make clippy happy --- CHANGELOG.md | 11 ++- windivert-sys/Cargo.toml | 2 +- windivert-sys/build/gnu.rs | 18 ++--- windivert-sys/build/main.rs | 2 +- windivert-sys/build/msvc.rs | 2 +- windivert-sys/src/bindings/header.rs | 95 ++++++++------------------ windivert-sys/src/bindings/newtypes.rs | 4 +- windivert/src/address.rs | 6 +- windivert/src/divert/blocking.rs | 4 +- windivert/src/divert/mod.rs | 9 ++- windivert/src/packet.rs | 6 +- 11 files changed, 61 insertions(+), 98 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af61b65..40d0359 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,15 +8,13 @@ and this project adheres to ## [Unreleased] -### Added - -- Add `wait` method variants to windivert +## [Unreleased-sys] -### Changed +## [sys-0.9.2] - 2023-03-23 -- Handle `MAX_BATCH` limit in `send_ex` +### Fixed -## [Unreleased-sys] +- Fix `close` errors due to double inner close call ## [0.5.5] - 2023-03-23 @@ -76,6 +74,7 @@ and this project adheres to [unreleased]: https://github.com/Rubensei/windivert-rust/compare/windivert-0.5.5...HEAD [unreleased-sys]: https://github.com/Rubensei/windivert-rust/compare/windivert-sys-0.9.2...HEAD +[sys-0.9.3]: https://github.com/Rubensei/windivert-rust/compare/windivert-sys-0.9.2...windivert-sys-0.9.3 [sys-0.9.2]: https://github.com/Rubensei/windivert-rust/compare/windivert-sys-0.9.1...windivert-sys-0.9.2 [0.5.5]: https://github.com/Rubensei/windivert-rust/compare/windivert-0.5.4...windivert-0.5.5 [sys-0.9.1]: https://github.com/Rubensei/windivert-rust/compare/windivert-sys-0.9.0...windivert-sys-0.9.1 diff --git a/windivert-sys/Cargo.toml b/windivert-sys/Cargo.toml index c1c3e1d..e2923c7 100644 --- a/windivert-sys/Cargo.toml +++ b/windivert-sys/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windivert-sys" -version = "0.9.2" +version = "0.9.3" description = "Raw FFI bindings for WinDivert user mode library" authors = ["Ruben Serrano Izquierdo "] repository = "https://github.com/Rubensei/windivert-rust.git" diff --git a/windivert-sys/build/gnu.rs b/windivert-sys/build/gnu.rs index 0ced0a3..4e24449 100644 --- a/windivert-sys/build/gnu.rs +++ b/windivert-sys/build/gnu.rs @@ -21,14 +21,14 @@ pub fn compile(build: Build) { }; set_gnu_c_options(&mut cmd); cmd.arg(format!("-Wl,--entry=${mangle}WinDivertDllEntry")); - cmd.args(&["-c", "vendor/dll/windivert.c"]); - cmd.args(&["-o", &format!("{out_dir}/WinDivert.o")]); + cmd.args(["-c", "vendor/dll/windivert.c"]); + cmd.args(["-o", &format!("{out_dir}/WinDivert.o")]); cmd.output().expect("Error compiling windivert c library"); let mut cmd = build.get_compiler().to_command(); set_gnu_c_options(&mut cmd); - cmd.args(&["-o", &format!("{out_dir}/WinDivert.dll")]); - cmd.args(&[ + cmd.args(["-o", &format!("{out_dir}/WinDivert.dll")]); + cmd.args([ &format!("{out_dir}/WinDivert.o"), "vendor/dll/windivert.def", "-nostdlib", @@ -56,16 +56,16 @@ pub fn compile(build: Build) { let mut dlltool = Command::new(dlltool); dlltool.stdout(Stdio::inherit()).stderr(Stdio::inherit()); - dlltool.args(&["--dllname", &format!("{out_dir}/WinDivert.dll")]); - dlltool.args(&["--def", "vendor/dll/windivert.def"]); - dlltool.args(&["--output-lib", &format!("{out_dir}/WinDivert.lib")]); + dlltool.args(["--dllname", &format!("{out_dir}/WinDivert.dll")]); + dlltool.args(["--def", "vendor/dll/windivert.def"]); + dlltool.args(["--output-lib", &format!("{out_dir}/WinDivert.lib")]); let _ = dlltool.output().expect("Error building windivert lib"); let _ = fs::remove_file(format!("{out_dir}/WinDivert.o")); } fn set_gnu_c_options(cmd: &mut Command) { - cmd.args(&[ + cmd.args([ "-fno-ident", "-shared", "-Wall", @@ -77,5 +77,5 @@ fn set_gnu_c_options(cmd: &mut Command) { } fn set_gnu_c_libs(cmd: &mut Command) { - cmd.args(&["-lkernel32", "-ladvapi32"]); + cmd.args(["-lkernel32", "-ladvapi32"]); } diff --git a/windivert-sys/build/main.rs b/windivert-sys/build/main.rs index 2d7eefd..7f303de 100644 --- a/windivert-sys/build/main.rs +++ b/windivert-sys/build/main.rs @@ -46,7 +46,7 @@ fn main() { _ => panic!("Unsupported target architecture!"), }; - if let Err(_) = fs::metadata(format!("{out_dir}\\WinDivert{arch}.sys")) { + if fs::metadata(format!("{out_dir}\\WinDivert{arch}.sys")).is_err() { println!( "cargo:warning=WinDivert{arch}.sys not found on the same directory as the dll." ) diff --git a/windivert-sys/build/msvc.rs b/windivert-sys/build/msvc.rs index 9590eea..4d8232c 100644 --- a/windivert-sys/build/msvc.rs +++ b/windivert-sys/build/msvc.rs @@ -14,7 +14,7 @@ pub fn compile(build: Build) { cmd.arg(format!(r#"/Fo{out_dir}\WinDivert.obj"#)); cmd.arg(format!(r#"/Fd{out_dir}\WinDivert.pdb"#)); - cmd.args(MSVC_ARGS.split(" ")); + cmd.args(MSVC_ARGS.split(' ')); let arch = match env::var("CARGO_CFG_TARGET_ARCH").unwrap().as_ref() { "x86" => "x86", diff --git a/windivert-sys/src/bindings/header.rs b/windivert-sys/src/bindings/header.rs index b29aa43..0be2a32 100644 --- a/windivert-sys/src/bindings/header.rs +++ b/windivert-sys/src/bindings/header.rs @@ -32,25 +32,19 @@ pub struct WINDIVERT_IPHDR { impl WINDIVERT_IPHDR { #[inline] pub fn header_length(&self) -> u8 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(0usize, 4u8) as u8) } + self.addr_bitfield.get(0usize, 4u8) as u8 } #[inline] pub fn set_header_length(&mut self, val: u8) { - unsafe { - let val: u8 = ::std::mem::transmute(val); - self.addr_bitfield.set(0usize, 4u8, val as u64) - } + self.addr_bitfield.set(0usize, 4u8, val as u64) } #[inline] pub fn version(&self) -> u8 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(4usize, 4u8) as u8) } + self.addr_bitfield.get(4usize, 4u8) as u8 } #[inline] pub fn set_version(&mut self, val: u8) { - unsafe { - let val: u8 = ::std::mem::transmute(val); - self.addr_bitfield.set(4usize, 4u8, val as u64) - } + self.addr_bitfield.set(4usize, 4u8, val as u64) } #[inline] pub fn length(&self) -> u16 { @@ -79,7 +73,7 @@ impl WINDIVERT_IPHDR { } #[inline] pub fn MF(&self) -> bool { - self.fragment_offset_and_flags & 0x0020 == 1 + self.fragment_offset_and_flags & 0x0020 != 0 } #[inline] pub fn set_MF(&mut self, value: bool) { @@ -88,7 +82,7 @@ impl WINDIVERT_IPHDR { } #[inline] pub fn DF(&self) -> bool { - self.fragment_offset_and_flags & 0x0040 == 1 + self.fragment_offset_and_flags & 0x0040 != 0 } #[inline] pub fn set_DF(&mut self, value: bool) { @@ -159,14 +153,11 @@ pub struct WINDIVERT_IPV6HDR { impl WINDIVERT_IPV6HDR { #[inline] pub fn version(&self) -> u8 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(4usize, 4u8) as u8) } + self.addr_bitfield.get(4usize, 4u8) as u8 } #[inline] pub fn set_version(&mut self, val: u8) { - unsafe { - let val: u8 = ::std::mem::transmute(val); - self.addr_bitfield.set(4usize, 4u8, val as u64) - } + self.addr_bitfield.set(4usize, 4u8, val as u64) } #[inline] pub fn traffic_class(&self) -> u8 { @@ -179,25 +170,19 @@ impl WINDIVERT_IPV6HDR { } #[inline] fn traffic_class0(&self) -> u8 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(0usize, 4u8) as u8) } + self.addr_bitfield.get(0usize, 4u8) as u8 } #[inline] fn set_traffic_class0(&mut self, val: u8) { - unsafe { - let val: u8 = ::std::mem::transmute(val); - self.addr_bitfield.set(0usize, 4u8, val as u64) - } + self.addr_bitfield.set(0usize, 4u8, val as u64) } #[inline] fn traffic_class1(&self) -> u8 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(12usize, 4u8) as u8) } + self.addr_bitfield.get(12usize, 4u8) as u8 } #[inline] fn set_traffic_class1(&mut self, val: u8) { - unsafe { - let val: u8 = ::std::mem::transmute(val); - self.addr_bitfield.set(12usize, 4u8, val as u64) - } + self.addr_bitfield.set(12usize, 4u8, val as u64) } #[inline] pub fn flow_label(&self) -> u32 { @@ -211,14 +196,11 @@ impl WINDIVERT_IPV6HDR { } #[inline] fn flow_label0(&self) -> u8 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(8usize, 4u8) as u8) } + self.addr_bitfield.get(8usize, 4u8) as u8 } #[inline] fn set_flow_label0(&mut self, val: u8) { - unsafe { - let val: u8 = ::std::mem::transmute(val); - self.addr_bitfield.set(8usize, 4u8, val as u64) - } + self.addr_bitfield.set(8usize, 4u8, val as u64) } #[inline] pub fn length(&self) -> u16 { @@ -438,80 +420,59 @@ impl WINDIVERT_TCPHDR { } #[inline] pub fn header_length(&self) -> u16 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(4usize, 4u8) as u16) } + self.addr_bitfield.get(4usize, 4u8) as u16 } #[inline] pub fn set_header_length(&mut self, val: u16) { - unsafe { - let val: u16 = ::std::mem::transmute(val); - self.addr_bitfield.set(4usize, 4u8, val as u64) - } + self.addr_bitfield.set(4usize, 4u8, val as u64) } #[inline] pub fn FIN(&self) -> u16 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(8usize, 1u8) as u16) } + self.addr_bitfield.get(8usize, 1u8) as u16 } #[inline] pub fn set_FIN(&mut self, val: u16) { - unsafe { - let val: u16 = ::std::mem::transmute(val); - self.addr_bitfield.set(8usize, 1u8, val as u64) - } + self.addr_bitfield.set(8usize, 1u8, val as u64) } #[inline] pub fn SYN(&self) -> u16 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(9usize, 1u8) as u16) } + self.addr_bitfield.get(9usize, 1u8) as u16 } #[inline] pub fn set_SYN(&mut self, val: u16) { - unsafe { - let val: u16 = ::std::mem::transmute(val); - self.addr_bitfield.set(9usize, 1u8, val as u64) - } + self.addr_bitfield.set(9usize, 1u8, val as u64) } #[inline] pub fn RST(&self) -> u16 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(10usize, 1u8) as u16) } + self.addr_bitfield.get(10usize, 1u8) as u16 } #[inline] pub fn set_RST(&mut self, val: u16) { - unsafe { - let val: u16 = ::std::mem::transmute(val); - self.addr_bitfield.set(10usize, 1u8, val as u64) - } + self.addr_bitfield.set(10usize, 1u8, val as u64) } #[inline] pub fn PSH(&self) -> u16 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(11usize, 1u8) as u16) } + self.addr_bitfield.get(11usize, 1u8) as u16 } #[inline] pub fn set_PSH(&mut self, val: u16) { - unsafe { - let val: u16 = ::std::mem::transmute(val); - self.addr_bitfield.set(11usize, 1u8, val as u64) - } + self.addr_bitfield.set(11usize, 1u8, val as u64) } #[inline] pub fn ACK(&self) -> u16 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(12usize, 1u8) as u16) } + self.addr_bitfield.get(12usize, 1u8) as u16 } #[inline] pub fn set_ACK(&mut self, val: u16) { - unsafe { - let val: u16 = ::std::mem::transmute(val); - self.addr_bitfield.set(12usize, 1u8, val as u64) - } + self.addr_bitfield.set(12usize, 1u8, val as u64) } #[inline] pub fn URG(&self) -> u16 { - unsafe { ::std::mem::transmute(self.addr_bitfield.get(13usize, 1u8) as u16) } + self.addr_bitfield.get(13usize, 1u8) as u16 } #[inline] pub fn set_URG(&mut self, val: u16) { - unsafe { - let val: u16 = ::std::mem::transmute(val); - self.addr_bitfield.set(13usize, 1u8, val as u64) - } + self.addr_bitfield.set(13usize, 1u8, val as u64) } #[inline] pub fn window(&self) -> u16 { diff --git a/windivert-sys/src/bindings/newtypes.rs b/windivert-sys/src/bindings/newtypes.rs index 0d1a88a..4d19cd1 100644 --- a/windivert-sys/src/bindings/newtypes.rs +++ b/windivert-sys/src/bindings/newtypes.rs @@ -294,7 +294,7 @@ impl WinDivertFlags { /// Sets `sniff` flag to `value`. pub fn set_sniff_value(&mut self, value: bool) { - self.0 = (self.0 & !0x0001) | ((value as u64) << 0); + self.0 = (self.0 & !0x0001) | (value as u64); } /// Sets `drop` flag. @@ -425,7 +425,7 @@ impl ChecksumFlags { /// Sets `no_ip` flag to `value`. pub fn set_no_ip_value(&mut self, value: bool) { - self.0 = (self.0 & !0x0001) | ((value as u64) << 0); + self.0 = (self.0 & !0x0001) | (value as u64); } /// Sets `no_icmp` flag diff --git a/windivert/src/address.rs b/windivert/src/address.rs index 58acb8c..f896e03 100644 --- a/windivert/src/address.rs +++ b/windivert/src/address.rs @@ -136,7 +136,8 @@ impl AsMut for WinDivertAddres impl WinDivertAddress { /// Create a new [`WinDivertAddress`] to inject new packets. - /// SAFETY: The default value for address is zeroed memory, caller must fill with valid data before sending. + /// # Safety + /// The default value for address is zeroed memory, caller must fill with valid data before sending. pub unsafe fn new() -> Self { Self { data: Default::default(), @@ -183,7 +184,8 @@ impl WinDivertAddress { impl WinDivertAddress { /// Create a new [`WinDivertAddress`] to inject new packets. - /// SAFETY: The default value for address is zeroed memory, caller must fill with valid data before sending. + /// # Safety + /// The default value for address is zeroed memory, caller must fill with valid data before sending. pub unsafe fn new() -> Self { Self { data: Default::default(), diff --git a/windivert/src/divert/blocking.rs b/windivert/src/divert/blocking.rs index 1b97359..c003246 100644 --- a/windivert/src/divert/blocking.rs +++ b/windivert/src/divert/blocking.rs @@ -166,7 +166,7 @@ impl WinDivert { address: WinDivertAddress::::from_raw(addr), data: buffer .map(|inner_buffer| { - let headers = SlicedPacket::from_ip(&inner_buffer) + let headers = SlicedPacket::from_ip(inner_buffer) .expect("WinDivert can't capture anything below ip"); let offset = match headers.ip.unwrap() { InternetSlice::Ipv4(ip_header, _) => ip_header.total_len() as usize, @@ -225,7 +225,7 @@ impl WinDivert { address: WinDivertAddress::::from_raw(addr), data: buffer .map(|inner_buffer| { - let headers = SlicedPacket::from_ip(&inner_buffer) + let headers = SlicedPacket::from_ip(inner_buffer) .expect("WinDivert can't capture anything below ip"); let offset = match headers.ip.unwrap() { InternetSlice::Ipv4(ip_header, _) => ip_header.total_len() as usize, diff --git a/windivert/src/divert/mod.rs b/windivert/src/divert/mod.rs index 4d846c5..66e65a9 100644 --- a/windivert/src/divert/mod.rs +++ b/windivert/src/divert/mod.rs @@ -44,8 +44,7 @@ impl WinDivert { ) -> Result { let filter = CString::new(filter)?; let windivert_tls_idx = unsafe { TlsAlloc() }; - let handle = - unsafe { sys::WinDivertOpen(filter.as_ptr(), layer.into(), priority, flags.into()) }; + let handle = unsafe { sys::WinDivertOpen(filter.as_ptr(), layer, priority, flags) }; if handle.is_invalid() { let open_err = WinDivertOpenError::try_from(std::io::Error::last_os_error())?; Err(open_err.into()) @@ -73,7 +72,7 @@ impl WinDivert { /// Methods that allows to query the driver for parameters. pub fn get_param(&self, param: WinDivertParam) -> Result { let mut value = 0; - let res = unsafe { sys::WinDivertGetParam(self.handle, param.into(), &mut value) }; + let res = unsafe { sys::WinDivertGetParam(self.handle, param, &mut value) }; if !res.as_bool() { return Err(std::io::Error::last_os_error().into()); } @@ -86,7 +85,7 @@ impl WinDivert { WinDivertParam::VersionMajor | WinDivertParam::VersionMinor => { Err(WinDivertError::Parameter(param, value)) } - _ => unsafe { sys::WinDivertSetParam(self.handle, param.into(), value) } + _ => unsafe { sys::WinDivertSetParam(self.handle, param, value) } .ok() .map_err(|_| std::io::Error::last_os_error().into()), } @@ -106,7 +105,7 @@ impl WinDivert { /// Shutdown function. pub fn shutdown(&mut self, mode: WinDivertShutdownMode) -> WinResult<()> { - let res = unsafe { sys::WinDivertShutdown(self.handle, mode.into()) }; + let res = unsafe { sys::WinDivertShutdown(self.handle, mode) }; if !res.as_bool() { return Err(WinError::from(unsafe { GetLastError() })); } diff --git a/windivert/src/packet.rs b/windivert/src/packet.rs index 603a4eb..ea81fe9 100644 --- a/windivert/src/packet.rs +++ b/windivert/src/packet.rs @@ -19,7 +19,8 @@ pub struct WinDivertPacket<'a, L: layer::WinDivertLayerTrait> { impl<'a> WinDivertPacket<'a, layer::NetworkLayer> { /// Create a new network packet from a raw buffer - /// SAFETY: `address` is zeroed, user must fill it with correct data before sending. + /// # Safety + /// `address` is zeroed, user must fill it with correct data before sending. pub unsafe fn new(data: Vec) -> Self { Self { address: WinDivertAddress::::new(), @@ -49,7 +50,8 @@ impl<'a> WinDivertPacket<'a, layer::NetworkLayer> { impl<'a> WinDivertPacket<'a, layer::ForwardLayer> { /// Create a new network forward packet from a raw buffer - /// SAFETY: `address` is zeroed, user must fill it with correct data before sending. + /// # Safety + /// `address` is zeroed, user must fill it with correct data before sending. pub unsafe fn new(data: Vec) -> Self { Self { address: WinDivertAddress::::new(),