fixed string handling
This commit is contained in:
parent
b239ecf87a
commit
0febcbea09
@ -10,7 +10,6 @@ fn llmp_test_clientloop(client: *mut llmp_client, _data: *mut c_void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
||||||
let thread_count = 1;
|
let thread_count = 1;
|
||||||
|
|
||||||
/* The main node has a broker, a tcp server, and a few worker threads */
|
/* The main node has a broker, a tcp server, and a few worker threads */
|
||||||
@ -24,45 +23,20 @@ fn main() {
|
|||||||
llmp_client_count: 0,
|
llmp_client_count: 0,
|
||||||
llmp_clients: ptr::null_mut(),
|
llmp_clients: ptr::null_mut(),
|
||||||
};
|
};
|
||||||
unsafe {llmp_broker_init(&mut broker).expect("Could not init")};
|
let thread_count = 4;
|
||||||
|
unsafe {
|
||||||
unsafe {llmp_broker_register_childprocess_clientloop(&mut broker, llmp_test_clientloop, ptr::null_mut()).expect("could not add child clientloop")};
|
llmp_broker_init(&mut broker).expect("Could not init");
|
||||||
|
for i in 0..thread_count {
|
||||||
/*unsafe {llmp_broker_register_threaded_clientloop(broker, llmp_clientloop_print_u32, NULL)) {
|
println!("Adding client {}", i);
|
||||||
|
llmp_broker_register_childprocess_clientloop(
|
||||||
FATAL("error adding threaded client");
|
&mut broker,
|
||||||
|
llmp_test_clientloop,
|
||||||
|
ptr::null_mut(),
|
||||||
|
)
|
||||||
|
.expect("could not add child clientloop");
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("Spawning broker");
|
||||||
|
llmp_broker_run(&mut broker);
|
||||||
}
|
}
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < thread_count; i++) {
|
|
||||||
|
|
||||||
if (!llmp_broker_register_threaded_clientloop(broker, llmp_clientloop_rand_u32, NULL)) {
|
|
||||||
|
|
||||||
FATAL("error adding threaded client");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
OKF("Spawning main on port %d", port);
|
|
||||||
llmp_broker_run(broker);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if (thread_count > 1) { WARNF("Multiple threads not supported for clients."); }
|
|
||||||
|
|
||||||
OKF("Client will connect to port %d", port);
|
|
||||||
// Worker only needs to spawn client threads.
|
|
||||||
llmp_client_t *client_state = llmp_client_new(port);
|
|
||||||
if (!client_state) { FATAL("Error connecting to broker at port %d", port); }
|
|
||||||
llmp_clientloop_rand_u32(client_state, NULL);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
FATAL("Unreachable");
|
|
||||||
|
|
||||||
|
|
||||||
println!("Hello, world!");
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ use ::libc;
|
|||||||
use core::sync::atomic::{compiler_fence, Ordering};
|
use core::sync::atomic::{compiler_fence, Ordering};
|
||||||
use libc::{c_int, c_uint, c_ulong, c_ushort, c_void};
|
use libc::{c_int, c_uint, c_ulong, c_ushort, c_void};
|
||||||
use std::process::exit;
|
use std::process::exit;
|
||||||
use std::str;
|
use std::ffi::CStr;
|
||||||
|
|
||||||
use crate::AflError;
|
use crate::AflError;
|
||||||
use crate::utils::next_pow2;
|
use crate::utils::next_pow2;
|
||||||
@ -680,7 +680,7 @@ pub unsafe extern "C" fn llmp_broker_alloc_next(
|
|||||||
Be careful: Intenral realloc may change the location of the client map */
|
Be careful: Intenral realloc may change the location of the client map */
|
||||||
unsafe fn llmp_broker_register_client(
|
unsafe fn llmp_broker_register_client(
|
||||||
mut broker: *mut llmp_broker_state,
|
mut broker: *mut llmp_broker_state,
|
||||||
shm_str: &str,
|
shm_str: &CStr,
|
||||||
map_size: c_ulong,
|
map_size: c_ulong,
|
||||||
) -> *mut llmp_broker_client_metadata {
|
) -> *mut llmp_broker_client_metadata {
|
||||||
/* make space for a new client and calculate its id */
|
/* make space for a new client and calculate its id */
|
||||||
@ -780,7 +780,7 @@ unsafe fn llmp_broker_handle_new_msgs(
|
|||||||
afl_shmem_deinit(client_map);
|
afl_shmem_deinit(client_map);
|
||||||
if afl_shmem_by_str(
|
if afl_shmem_by_str(
|
||||||
client_map,
|
client_map,
|
||||||
str::from_utf8(&(*pageinfo).shm_str).unwrap(),
|
CStr::from_bytes_with_nul(&(*pageinfo).shm_str).expect("Illegal shm_str"),
|
||||||
(*pageinfo).map_size,
|
(*pageinfo).map_size,
|
||||||
)
|
)
|
||||||
.is_null()
|
.is_null()
|
||||||
@ -811,7 +811,7 @@ unsafe fn llmp_broker_handle_new_msgs(
|
|||||||
let client_id: u32 = (*(*client).client_state).id;
|
let client_id: u32 = (*(*client).client_state).id;
|
||||||
if llmp_broker_register_client(
|
if llmp_broker_register_client(
|
||||||
broker,
|
broker,
|
||||||
str::from_utf8(&(*pageinfo).shm_str).unwrap(),
|
CStr::from_bytes_with_nul(&(*pageinfo).shm_str).expect("Illegal shm_str"),
|
||||||
(*pageinfo).map_size,
|
(*pageinfo).map_size,
|
||||||
)
|
)
|
||||||
.is_null()
|
.is_null()
|
||||||
@ -901,8 +901,7 @@ pub unsafe extern "C" fn llmp_broker_once(broker: *mut llmp_broker_state) {
|
|||||||
}
|
}
|
||||||
/* The broker walks all pages and looks for changes, then broadcasts them on
|
/* The broker walks all pages and looks for changes, then broadcasts them on
|
||||||
* its own shared page */
|
* its own shared page */
|
||||||
#[no_mangle]
|
pub unsafe fn llmp_broker_loop(broker: *mut llmp_broker_state) -> !{
|
||||||
pub unsafe extern "C" fn llmp_broker_loop(broker: *mut llmp_broker_state) {
|
|
||||||
loop {
|
loop {
|
||||||
compiler_fence(Ordering::SeqCst);
|
compiler_fence(Ordering::SeqCst);
|
||||||
llmp_broker_once(broker);
|
llmp_broker_once(broker);
|
||||||
@ -1000,8 +999,8 @@ pub unsafe extern "C" fn llmp_broker_launch_client(
|
|||||||
}
|
}
|
||||||
//return 1 as c_int != 0;
|
//return 1 as c_int != 0;
|
||||||
}
|
}
|
||||||
#[no_mangle]
|
|
||||||
pub unsafe extern "C" fn llmp_broker_launch_clientloops(broker: *mut llmp_broker_state) -> bool {
|
pub unsafe fn llmp_broker_launch_clientloops(broker: *mut llmp_broker_state) -> Result<(), AflError> {
|
||||||
let mut i: c_ulong = 0;
|
let mut i: c_ulong = 0;
|
||||||
while i < (*broker).llmp_client_count {
|
while i < (*broker).llmp_client_count {
|
||||||
if (*(*broker).llmp_clients.offset(i as isize)).client_type as c_uint
|
if (*(*broker).llmp_clients.offset(i as isize)).client_type as c_uint
|
||||||
@ -1009,13 +1008,14 @@ pub unsafe extern "C" fn llmp_broker_launch_clientloops(broker: *mut llmp_broker
|
|||||||
{
|
{
|
||||||
if !llmp_broker_launch_client(broker, &mut *(*broker).llmp_clients.offset(i as isize)) {
|
if !llmp_broker_launch_client(broker, &mut *(*broker).llmp_clients.offset(i as isize)) {
|
||||||
println!("[!] WARNING: Could not launch all clients");
|
println!("[!] WARNING: Could not launch all clients");
|
||||||
return 0 as c_int != 0;
|
return Err(AflError::Unknown("Failed to launch clients".into()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i = i.wrapping_add(1)
|
i = i.wrapping_add(1)
|
||||||
}
|
}
|
||||||
return 1 as c_int != 0;
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The broker walks all pages and looks for changes, then broadcasts them on
|
/* The broker walks all pages and looks for changes, then broadcasts them on
|
||||||
its own shared page.
|
its own shared page.
|
||||||
Never returns. */
|
Never returns. */
|
||||||
@ -1023,11 +1023,11 @@ Never returns. */
|
|||||||
Same as llmp_broker_launch_threaded clients();
|
Same as llmp_broker_launch_threaded clients();
|
||||||
Never returns. */
|
Never returns. */
|
||||||
/* Start all threads and the main broker. Never returns. */
|
/* Start all threads and the main broker. Never returns. */
|
||||||
#[no_mangle]
|
pub unsafe fn llmp_broker_run(broker: *mut llmp_broker_state) -> ! {
|
||||||
pub unsafe extern "C" fn llmp_broker_run(broker: *mut llmp_broker_state) {
|
llmp_broker_launch_clientloops(broker).expect("Failed to launch clients");
|
||||||
llmp_broker_launch_clientloops(broker);
|
|
||||||
llmp_broker_loop(broker);
|
llmp_broker_loop(broker);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
For non zero-copy, we want to get rid of old pages with duplicate messages
|
For non zero-copy, we want to get rid of old pages with duplicate messages
|
||||||
eventually. This function This funtion sees if we can unallocate older pages.
|
eventually. This function This funtion sees if we can unallocate older pages.
|
||||||
@ -1127,7 +1127,7 @@ pub unsafe extern "C" fn llmp_client_recv(mut client: *mut llmp_client) -> *mut
|
|||||||
afl_shmem_deinit(broadcast_map);
|
afl_shmem_deinit(broadcast_map);
|
||||||
if afl_shmem_by_str(
|
if afl_shmem_by_str(
|
||||||
(*client).current_broadcast_map,
|
(*client).current_broadcast_map,
|
||||||
str::from_utf8(&(*pageinfo).shm_str).unwrap(),
|
CStr::from_bytes_with_nul(&(*pageinfo).shm_str).expect("Illegal shm_str"),
|
||||||
(*pageinfo).map_size,
|
(*pageinfo).map_size,
|
||||||
)
|
)
|
||||||
.is_null()
|
.is_null()
|
||||||
@ -1350,7 +1350,7 @@ pub unsafe fn llmp_broker_register_childprocess_clientloop(
|
|||||||
return Err(AflError::Unknown("Alloc".into()));
|
return Err(AflError::Unknown("Alloc".into()));
|
||||||
}
|
}
|
||||||
let mut client: *mut llmp_broker_client_metadata =
|
let mut client: *mut llmp_broker_client_metadata =
|
||||||
llmp_broker_register_client(broker, str::from_utf8(&client_map.shm_str).unwrap(), client_map.map_size);
|
llmp_broker_register_client(broker, CStr::from_ptr(&client_map.shm_str as *const i8), client_map.map_size);
|
||||||
if client.is_null() {
|
if client.is_null() {
|
||||||
afl_shmem_deinit(&mut client_map);
|
afl_shmem_deinit(&mut client_map);
|
||||||
return Err(AflError::Unknown("Something in clients failed".into()));
|
return Err(AflError::Unknown("Something in clients failed".into()));
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use ::libc;
|
use ::libc;
|
||||||
use libc::{c_int, c_uint, c_char, c_uchar, c_ushort, c_long, c_ulong, c_void};
|
use libc::{c_int, c_uint, c_char, c_uchar, c_ushort, c_long, c_ulong, c_void};
|
||||||
|
use std::ffi::CStr;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@ -84,7 +85,7 @@ pub const AFL_RET_SUCCESS: c_uint = 0;
|
|||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct afl_shmem {
|
pub struct afl_shmem {
|
||||||
pub shm_str: [u8; 20],
|
pub shm_str: [c_char; 20],
|
||||||
pub shm_id: c_int,
|
pub shm_id: c_int,
|
||||||
pub map: *mut c_uchar,
|
pub map: *mut c_uchar,
|
||||||
pub map_size: c_ulong,
|
pub map_size: c_ulong,
|
||||||
@ -96,8 +97,8 @@ pub unsafe fn afl_shmem_deinit(mut shm: *mut afl_shmem) {
|
|||||||
// Not set or not initialized;
|
// Not set or not initialized;
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
(*shm).shm_str[0 as c_int as usize] =
|
(*shm).shm_str[0 as usize] =
|
||||||
'\u{0}' as i32 as u8;
|
'\u{0}' as c_char;
|
||||||
shmctl((*shm).shm_id, 0 as c_int, 0 as *mut shmid_ds);
|
shmctl((*shm).shm_id, 0 as c_int, 0 as *mut shmid_ds);
|
||||||
(*shm).map = 0 as *mut c_uchar;
|
(*shm).map = 0 as *mut c_uchar;
|
||||||
}
|
}
|
||||||
@ -112,8 +113,8 @@ pub unsafe fn afl_shmem_init(mut shm: *mut afl_shmem,
|
|||||||
0o1000 as c_int | 0o2000 as c_int |
|
0o1000 as c_int | 0o2000 as c_int |
|
||||||
0o600 as c_int);
|
0o600 as c_int);
|
||||||
if (*shm).shm_id < 0 as c_int {
|
if (*shm).shm_id < 0 as c_int {
|
||||||
(*shm).shm_str[0 as c_int as usize] =
|
(*shm).shm_str[0] =
|
||||||
'\u{0}' as i32 as u8;
|
'\u{0}' as c_char;
|
||||||
return 0 as *mut c_uchar
|
return 0 as *mut c_uchar
|
||||||
}
|
}
|
||||||
snprintf((*shm).shm_str.as_mut_ptr() as *mut i8,
|
snprintf((*shm).shm_str.as_mut_ptr() as *mut i8,
|
||||||
@ -122,7 +123,7 @@ pub unsafe fn afl_shmem_init(mut shm: *mut afl_shmem,
|
|||||||
(*shm).shm_str[(::std::mem::size_of::<[c_char; 20]>() as
|
(*shm).shm_str[(::std::mem::size_of::<[c_char; 20]>() as
|
||||||
c_ulong).wrapping_sub(1 as c_int as
|
c_ulong).wrapping_sub(1 as c_int as
|
||||||
c_ulong) as
|
c_ulong) as
|
||||||
usize] = '\u{0}' as i32 as u8;
|
usize] = '\u{0}' as c_char;
|
||||||
(*shm).map =
|
(*shm).map =
|
||||||
shmat((*shm).shm_id, 0 as *const c_void, 0 as c_int) as
|
shmat((*shm).shm_id, 0 as *const c_void, 0 as c_int) as
|
||||||
*mut c_uchar;
|
*mut c_uchar;
|
||||||
@ -131,16 +132,16 @@ pub unsafe fn afl_shmem_init(mut shm: *mut afl_shmem,
|
|||||||
shmctl((*shm).shm_id, 0 as c_int, 0 as *mut shmid_ds);
|
shmctl((*shm).shm_id, 0 as c_int, 0 as *mut shmid_ds);
|
||||||
(*shm).shm_id = -(1 as c_int);
|
(*shm).shm_id = -(1 as c_int);
|
||||||
(*shm).shm_str[0 as c_int as usize] =
|
(*shm).shm_str[0 as c_int as usize] =
|
||||||
'\u{0}' as i32 as u8;
|
'\u{0}' as c_char;
|
||||||
return 0 as *mut c_uchar
|
return 0 as *mut c_uchar
|
||||||
}
|
}
|
||||||
return (*shm).map;
|
return (*shm).map;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn afl_shmem_by_str(mut shm: *mut afl_shmem,
|
pub unsafe fn afl_shmem_by_str(mut shm: *mut afl_shmem,
|
||||||
shm_str: &str,
|
shm_str: &CStr,
|
||||||
map_size: c_ulong) -> *mut c_uchar {
|
map_size: c_ulong) -> *mut c_uchar {
|
||||||
if shm.is_null() || shm_str.len() == 0 || map_size == 0 {
|
if shm.is_null() || shm_str.to_bytes().len() == 0 || map_size == 0 {
|
||||||
return 0 as *mut c_uchar
|
return 0 as *mut c_uchar
|
||||||
}
|
}
|
||||||
(*shm).map = 0 as *mut c_uchar;
|
(*shm).map = 0 as *mut c_uchar;
|
||||||
@ -149,7 +150,7 @@ pub unsafe fn afl_shmem_by_str(mut shm: *mut afl_shmem,
|
|||||||
(::std::mem::size_of::<[c_char; 20]>() as
|
(::std::mem::size_of::<[c_char; 20]>() as
|
||||||
c_ulong).wrapping_sub(1 as c_int as
|
c_ulong).wrapping_sub(1 as c_int as
|
||||||
c_ulong));
|
c_ulong));
|
||||||
(*shm).shm_id = shm_str.parse::<i32>().unwrap();
|
(*shm).shm_id = shm_str.to_str().expect(&format!("illegal shm_str {:?}", shm_str)).parse::<i32>().unwrap();
|
||||||
(*shm).map =
|
(*shm).map =
|
||||||
shmat((*shm).shm_id, 0 as *const c_void, 0 as c_int) as
|
shmat((*shm).shm_id, 0 as *const c_void, 0 as c_int) as
|
||||||
*mut c_uchar;
|
*mut c_uchar;
|
||||||
@ -157,7 +158,7 @@ pub unsafe fn afl_shmem_by_str(mut shm: *mut afl_shmem,
|
|||||||
(*shm).map = 0 as *mut c_uchar;
|
(*shm).map = 0 as *mut c_uchar;
|
||||||
(*shm).map_size = 0 as c_int as c_ulong;
|
(*shm).map_size = 0 as c_int as c_ulong;
|
||||||
(*shm).shm_str[0 as c_int as usize] =
|
(*shm).shm_str[0 as c_int as usize] =
|
||||||
'\u{0}' as i32 as u8;
|
'\u{0}' as c_char;
|
||||||
return 0 as *mut c_uchar
|
return 0 as *mut c_uchar
|
||||||
}
|
}
|
||||||
return (*shm).map;
|
return (*shm).map;
|
||||||
@ -166,9 +167,10 @@ pub unsafe fn afl_shmem_by_str(mut shm: *mut afl_shmem,
|
|||||||
/* Write sharedmap as env var */
|
/* Write sharedmap as env var */
|
||||||
/* Write sharedmap as env var and the size as name#_SIZE */
|
/* Write sharedmap as env var and the size as name#_SIZE */
|
||||||
pub unsafe fn afl_shmem_to_env_var(shmem: *mut afl_shmem,
|
pub unsafe fn afl_shmem_to_env_var(shmem: *mut afl_shmem,
|
||||||
env_name: &str)
|
env_name: &CStr)
|
||||||
-> c_uint {
|
-> c_uint {
|
||||||
if shmem.is_null() || env_name.len() == 0 || env_name.len() > 200 ||
|
let env_len = env_name.to_bytes().len();
|
||||||
|
if shmem.is_null() || env_len == 0 || env_len > 200 ||
|
||||||
(*shmem).shm_str[0 as c_int as usize] == 0 {
|
(*shmem).shm_str[0 as c_int as usize] == 0 {
|
||||||
return AFL_RET_NULL_PTR
|
return AFL_RET_NULL_PTR
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user