Crates.io | pf-rs |
lib.rs | pf-rs |
version | 0.2.4 |
source | src |
created_at | 2021-08-06 00:55:58.568471 |
updated_at | 2024-02-06 16:44:37.549262 |
description | FreeBSD lib to access OpenBSD's implementation of the PF (Packet Filter) directly via /dev/pf |
homepage | |
repository | https://repo.4neko.org/4NEKO/pf-rs |
max_upload_size | |
id | 432236 |
size | 102,186 |
#pf-rs
V 0.2.2 - updated to support FREEBSD 14.0-RELEASE.
A crate which provides userspace interface to FreeBSD port of the OpendBSD's PF (Packet Filter) which allows to control PF directly without executing pfctl(8)
every time when it is required to block network host or to check the list.
This crate uses a lot of unsafe code because it is using a lot of C-structures.
Probably some approaches like std::mem::zeroed() can be dodgy but it is true only on some cases.
So, below is a list of which code-approaches were used and why it is considered safe enough.
std::mem::zeroed() on structure initialization
In most cases, all structures required to be initialized with zeroes. Also it is usefull because it may contain fixed string buffer where in C, string is always null-terminated and pointers which are required to be pointed to NULL in some cases.
This method can be used on structires which does not contain references!
Working with pointers
When working with raw pointers it is better to keep track when any C code is initializing memory on its side and deallocate it with either
free()
or specially provided function.
Padding
In some cases rust may leave structure padded not to n^2 but for example to 44 when C will pad it to 48.
fn test()
{
let pf = Pf::new(false).unwrap();
let res = pf.pfctl_table("table_test", PfCmd::Add{ hosts: vec!["192.168.2.44".to_string()] }).unrap();
if res == 1
{
println!("added!");
}
else
{
println!("was not added, but no error generated");
}
}