rust/ffi: provide AppLayerRegisterParser in context

AppLayerRegisterParser was creating a link error when attempting
to use a convenience library for the Suricata C code, then linking
the library of C code with the library of Rust code into a final
Suricata executable, or use with fuzz targets.

By moving AppLayerRegisterParser to the context structure and
calling it like a callback the circular reference is removed
allowing the convenience libraries to work again.

This is also a stepping block to proving a Suricata library
as a single .a or .so file.
pull/5840/head
Jason Ish 6 years ago committed by Victor Julien
parent 1c771e15ef
commit 3ada5e1480

@ -22,6 +22,7 @@ use crate::core::{DetectEngineState,Flow,AppLayerEventType,AppLayerDecoderEvents
use crate::filecontainer::FileContainer;
use crate::applayer;
use std::os::raw::{c_void,c_char,c_int};
use crate::core::SC;
#[repr(C)]
#[derive(Debug,PartialEq)]
@ -289,7 +290,11 @@ pub type TruncateFn = unsafe extern "C" fn (*mut c_void, u8);
// Defined in app-layer-register.h
extern {
pub fn AppLayerRegisterProtocolDetection(parser: *const RustParser, enable_default: c_int) -> AppProto;
pub fn AppLayerRegisterParser(parser: *const RustParser, alproto: AppProto) -> c_int;
}
#[allow(non_snake_case)]
pub unsafe fn AppLayerRegisterParser(parser: *const RustParser, alproto: AppProto) -> c_int {
(SC.unwrap().AppLayerRegisterParser)(parser, alproto)
}
// Defined in app-layer-detect-proto.h

@ -141,6 +141,8 @@ pub struct SuricataContext {
pub FileContainerRecycle: SCFileContainerRecycle,
pub FilePrune: SCFilePrune,
pub FileSetTx: SCFileSetTx,
pub AppLayerRegisterParser: extern fn(parser: *const crate::applayer::RustParser, alproto: AppProto) -> std::os::raw::c_int,
}
#[allow(non_snake_case)]

@ -25,6 +25,8 @@
#include "app-layer-snmp.h" //SNMPState, SNMPTransaction
#include "app-layer-tftp.h" //TFTPState, TFTPTransaction
struct AppLayerParser;
typedef struct SuricataContext_ {
SCError (*SCLogMessage)(const SCLogLevel, const char *, const unsigned int,
const char *, const SCError, const char *message);
@ -46,6 +48,8 @@ typedef struct SuricataContext_ {
void (*FilePrune)(FileContainer *ffc);
void (*FileSetTx)(FileContainer *, uint64_t);
int (*AppLayerRegisterParser)(const struct AppLayerParser *p, AppProto alproto);
} SuricataContext;
extern SuricataContext suricata_context;

@ -113,6 +113,7 @@
#include "app-layer.h"
#include "app-layer-parser.h"
#include "app-layer-register.h"
#include "app-layer-htp.h"
#include "app-layer-ssl.h"
#include "app-layer-ssh.h"
@ -2661,6 +2662,8 @@ int InitGlobal(void) {
suricata_context.FilePrune = FilePrune;
suricata_context.FileSetTx = FileContainerSetTx;
suricata_context.AppLayerRegisterParser = AppLayerRegisterParser;
rs_init(&suricata_context);
SC_ATOMIC_INIT(engine_stage);

Loading…
Cancel
Save