Skip to content

Commit aac3dd9

Browse files
author
Adam
authored
Fix cast_bytes(); add unit-tests; use IF_NAMESIZE instead of a hard-coded value (#39)
1 parent b17e411 commit aac3dd9

File tree

5 files changed

+102
-25
lines changed

5 files changed

+102
-25
lines changed

src/bsd/ifconfig.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::{
33
os::fd::AsRawFd,
44
};
55

6-
use libc::{c_char, kld_load};
6+
use libc::{c_char, kld_load, IF_NAMESIZE};
77
use nix::{ioctl_readwrite, ioctl_write_ptr, sys::socket::AddressFamily};
88

99
use super::{
@@ -31,17 +31,17 @@ ioctl_write_ptr!(del_addr_if_in6, b'i', 25, IfReq6);
3131
/// Represent `struct ifreq` as defined in `net/if.h`.
3232
#[repr(C)]
3333
pub struct IfReq {
34-
ifr_name: [u8; 16],
34+
ifr_name: [u8; IF_NAMESIZE],
3535
ifr_ifru: SockAddrIn,
3636
}
3737

3838
impl IfReq {
3939
#[must_use]
4040
pub(super) fn new(if_name: &str) -> Self {
41-
let mut ifr_name = [0u8; 16];
41+
let mut ifr_name = [0u8; IF_NAMESIZE];
4242
if_name
4343
.bytes()
44-
.take(15)
44+
.take(IF_NAMESIZE - 1)
4545
.enumerate()
4646
.for_each(|(i, b)| ifr_name[i] = b);
4747

@@ -94,17 +94,17 @@ impl IfReq {
9494
/// Represent `struct in6_ifreq` as defined in `netinet6/in6_var.h`.
9595
#[repr(C)]
9696
pub struct IfReq6 {
97-
ifr_name: [u8; 16],
97+
ifr_name: [u8; IF_NAMESIZE],
9898
ifr_ifru: SockAddrIn6,
9999
}
100100

101101
impl IfReq6 {
102102
#[must_use]
103103
pub(super) fn new(if_name: &str) -> Self {
104-
let mut ifr_name = [0u8; 16];
104+
let mut ifr_name = [0u8; IF_NAMESIZE];
105105
if_name
106106
.bytes()
107-
.take(15)
107+
.take(IF_NAMESIZE - 1)
108108
.enumerate()
109109
.for_each(|(i, b)| ifr_name[i] = b);
110110

@@ -129,7 +129,7 @@ impl IfReq6 {
129129
/// Respresent `in_aliasreq` as defined in <netinet/in_var.h>.
130130
#[repr(C)]
131131
pub struct InAliasReq {
132-
ifr_name: [u8; 16],
132+
ifr_name: [u8; IF_NAMESIZE],
133133
ifra_addr: SockAddrIn,
134134
ifra_broadaddr: SockAddrIn,
135135
ifra_mask: SockAddrIn,
@@ -144,10 +144,10 @@ impl InAliasReq {
144144
broadcast: &Ipv4Addr,
145145
mask: &Ipv4Addr,
146146
) -> Self {
147-
let mut ifr_name = [0u8; 16];
147+
let mut ifr_name = [0u8; IF_NAMESIZE];
148148
if_name
149149
.bytes()
150-
.take(15)
150+
.take(IF_NAMESIZE - 1)
151151
.enumerate()
152152
.for_each(|(i, b)| ifr_name[i] = b);
153153

@@ -174,7 +174,7 @@ impl InAliasReq {
174174
/// Respresent `in6_aliasreq` as defined in <netinet/in6_var.h>.
175175
#[repr(C)]
176176
pub struct In6AliasReq {
177-
ifr_name: [u8; 16],
177+
ifr_name: [u8; IF_NAMESIZE],
178178
ifra_addr: SockAddrIn6,
179179
ifra_dstaddr: SockAddrIn6,
180180
ifra_prefixmask: SockAddrIn6,
@@ -195,10 +195,10 @@ impl In6AliasReq {
195195
dstaddr: &Ipv6Addr,
196196
prefixmask: &Ipv6Addr,
197197
) -> Self {
198-
let mut ifr_name = [0u8; 16];
198+
let mut ifr_name = [0u8; IF_NAMESIZE];
199199
if_name
200200
.bytes()
201-
.take(15)
201+
.take(IF_NAMESIZE - 1)
202202
.enumerate()
203203
.for_each(|(i, b)| ifr_name[i] = b);
204204

src/bsd/mod.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ mod timespec;
55
mod wgio;
66

77
use std::{
8-
collections::HashMap, mem::size_of, net::IpAddr, os::fd::OwnedFd, ptr::addr_of,
9-
slice::from_raw_parts,
8+
collections::HashMap, mem::size_of, net::IpAddr, os::fd::OwnedFd, slice::from_raw_parts,
109
};
1110

1211
use nix::{
@@ -58,8 +57,7 @@ unsafe fn cast_ref<T>(bytes: &[u8]) -> &T {
5857

5958
/// Cast `T' to bytes.
6059
unsafe fn cast_bytes<T: Sized>(p: &T) -> &[u8] {
61-
let ptr = addr_of!(p).cast::<u8>();
62-
from_raw_parts(ptr, size_of::<T>())
60+
from_raw_parts((p as *const T) as *const u8, size_of::<T>())
6361
}
6462

6563
/// Create socket for ioctl communication.

src/bsd/sockaddr.rs

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,18 +176,96 @@ mod tests {
176176
use super::*;
177177

178178
#[test]
179-
fn ip4() {
179+
fn pack_ip4() {
180+
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(192, 168, 12, 34)), 7301);
181+
let buf = pack_sockaddr(&addr);
182+
assert_eq!(
183+
buf,
184+
[16, 2, 28, 133, 192, 168, 12, 34, 0, 0, 0, 0, 0, 0, 0, 0]
185+
);
186+
}
187+
188+
#[test]
189+
fn unpack_ip4() {
180190
let buf = [16, 2, 28, 133, 192, 168, 12, 34, 0, 0, 0, 0, 0, 0, 0, 0];
181191
let addr = unpack_sockaddr(&buf).unwrap();
182192
assert_eq!(addr.port(), 7301);
183193
assert_eq!(addr.ip(), IpAddr::V4(Ipv4Addr::new(192, 168, 12, 34)));
184194
}
185195

186196
#[test]
187-
fn ip6() {
197+
fn pack_ip6() {
198+
let addr = SocketAddr::new(
199+
IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc0a8, 0x0c22)),
200+
7301,
201+
);
202+
let buf = pack_sockaddr(&addr);
203+
assert_eq!(
204+
buf,
205+
[
206+
28,
207+
AF_INET6 as u8,
208+
28,
209+
133,
210+
0,
211+
0,
212+
0,
213+
0,
214+
0,
215+
0,
216+
0,
217+
0,
218+
0,
219+
0,
220+
0,
221+
0,
222+
0,
223+
0,
224+
255,
225+
255,
226+
192,
227+
168,
228+
12,
229+
34,
230+
0,
231+
0,
232+
0,
233+
0,
234+
]
235+
);
236+
}
237+
238+
#[test]
239+
fn unpack_ip6() {
188240
let buf = [
189-
28, 30, 28, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 192, 168, 12, 34,
190-
0, 0, 0, 0,
241+
28,
242+
AF_INET6 as u8,
243+
28,
244+
133,
245+
0,
246+
0,
247+
0,
248+
0,
249+
0,
250+
0,
251+
0,
252+
0,
253+
0,
254+
0,
255+
0,
256+
0,
257+
0,
258+
0,
259+
255,
260+
255,
261+
192,
262+
168,
263+
12,
264+
34,
265+
0,
266+
0,
267+
0,
268+
0,
191269
];
192270
let addr = unpack_sockaddr(&buf).unwrap();
193271
assert_eq!(addr.port(), 7301);

src/bsd/wgio.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::{
55
slice::from_raw_parts,
66
};
77

8+
use libc::IF_NAMESIZE;
89
use nix::{ioctl_readwrite, sys::socket::AddressFamily};
910

1011
use super::{create_socket, IoError};
@@ -17,7 +18,7 @@ ioctl_readwrite!(read_wireguard_data, b'i', 211, WgDataIo);
1718
/// https://github.com/freebsd/freebsd-src/blob/main/sys/dev/wg/if_wg.h
1819
#[repr(C)]
1920
pub struct WgDataIo {
20-
pub(super) wgd_name: [u8; 16],
21+
pub(super) wgd_name: [u8; IF_NAMESIZE],
2122
pub(super) wgd_data: *mut u8, // *void
2223
pub(super) wgd_size: usize,
2324
}
@@ -26,10 +27,10 @@ impl WgDataIo {
2627
/// Create `WgDataIo` without data buffer.
2728
#[must_use]
2829
pub fn new(if_name: &str) -> Self {
29-
let mut wgd_name = [0u8; 16];
30+
let mut wgd_name = [0u8; IF_NAMESIZE];
3031
if_name
3132
.bytes()
32-
.take(15)
33+
.take(IF_NAMESIZE - 1)
3334
.enumerate()
3435
.for_each(|(i, b)| wgd_name[i] = b);
3536
Self {

src/wgapi_freebsd.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ impl WireguardInterfaceApi for WireguardApiFreebsd {
7878
info!("Removing interface {}", &self.ifname);
7979
bsd::delete_interface(&self.ifname)?;
8080

81-
clear_dns(&self.ifname);
81+
clear_dns(&self.ifname)?;
8282
Ok(())
8383
}
8484

0 commit comments

Comments
 (0)