Skip to content

Commit 2003030

Browse files
committed
dlsym to load sidecar symbols not necessary any+
1 parent 3fbbd84 commit 2003030

File tree

16 files changed

+224
-371
lines changed

16 files changed

+224
-371
lines changed

Makefile

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ RUN_TESTS_CMD := DD_SERVICE= DD_ENV= REPORT_EXIT_STATUS=1 TEST_PHP_SRCDIR=$(PROJ
5151

5252
C_FILES = $(shell find components components-rs ext src/dogstatsd zend_abstract_interface -name '*.c' -o -name '*.h' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' )
5353
TEST_FILES = $(shell find tests/ext -name '*.php*' -o -name '*.inc' -o -name '*.json' -o -name '*.yaml' -o -name 'CONFLICTS' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' )
54-
RUST_FILES = $(BUILD_DIR)/Cargo.toml $(BUILD_DIR)/Cargo.lock $(shell find components-rs -name '*.c' -o -name '*.rs' -o -name 'Cargo.toml' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) $(shell find libdatadog/{build-common,datadog-ffe,datadog-ipc,datadog-ipc-macros,datadog-live-debugger,datadog-live-debugger-ffi,datadog-remote-config,datadog-sidecar,datadog-sidecar-ffi,datadog-sidecar-macros,libdd-alloc,libdd-common,libdd-common-ffi,libdd-crashtracker,libdd-crashtracker-ffi,libdd-data-pipeline,libdd-ddsketch,libdd-dogstatsd-client,libdd-library-config,libdd-library-config-ffi,libdd-log,libdd-telemetry,libdd-telemetry-ffi,libdd-tinybytes,libdd-trace-*,spawn_worker,tools/cc_utils,libdd-trace-*,Cargo.toml} \( -type l -o -type f \) \( -path "*/src*" -o -path "*/examples*" -o -path "*Cargo.toml" -o -path "*/build.rs" -o -path "*/tests/dataservice.rs" -o -path "*/tests/service_functional.rs" \) -not -path "*/datadog-ipc/build.rs" -not -path "*/datadog-sidecar-ffi/build.rs")
54+
RUST_FILES = $(BUILD_DIR)/Cargo.toml $(BUILD_DIR)/Cargo.lock $(shell find components-rs -name '*.c' -o -name '*.rs' -o -name 'Cargo.toml' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) $(shell find libdatadog/{build-common,datadog-ffe,datadog-ipc,datadog-ipc-macros,datadog-live-debugger,datadog-live-debugger-ffi,datadog-remote-config,datadog-sidecar,datadog-sidecar-appsec-ffi,datadog-sidecar-ffi,datadog-sidecar-macros,libdd-alloc,libdd-common,libdd-common-ffi,libdd-crashtracker,libdd-crashtracker-ffi,libdd-data-pipeline,libdd-ddsketch,libdd-dogstatsd-client,libdd-library-config,libdd-library-config-ffi,libdd-log,libdd-telemetry,libdd-telemetry-ffi,libdd-tinybytes,libdd-trace-*,spawn_worker,tools/cc_utils,libdd-trace-*,Cargo.toml} \( -type l -o -type f \) \( -path "*/src*" -o -path "*/examples*" -o -path "*Cargo.toml" -o -path "*/build.rs" -o -path "*/tests/dataservice.rs" -o -path "*/tests/service_functional.rs" \) -not -path "*/datadog-ipc/build.rs" -not -path "*/datadog-sidecar-ffi/build.rs")
5555
ALL_OBJECT_FILES = $(C_FILES) $(RUST_FILES) $(BUILD_DIR)/Makefile
5656
TEST_OPCACHE_FILES = $(shell find tests/opcache -name '*.php*' -o -name '.gitkeep' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' )
5757
TEST_STUB_FILES = $(shell find tests/ext -type d -name 'stubs' -exec find '{}' -type f \; | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' )
@@ -426,7 +426,7 @@ clang_format_fix:
426426
cbindgen: remove_cbindgen generate_cbindgen
427427

428428
remove_cbindgen:
429-
rm -f components-rs/ddtrace.h components-rs/live-debugger.h components-rs/telemetry.h components-rs/sidecar.h components-rs/common.h components-rs/crashtracker.h components-rs/library-config.h
429+
rm -f components-rs/ddtrace.h components-rs/live-debugger.h components-rs/telemetry.h components-rs/sidecar.h components-rs/sidecar-appsec.h components-rs/common.h components-rs/crashtracker.h components-rs/library-config.h
430430

431431
generate_cbindgen: cbindgen_binary # Regenerate components-rs/ddtrace.h components-rs/live-debugger.h components-rs/telemetry.h components-rs/sidecar.h components-rs/common.h components-rs/crashtracker.h components-rs/library-config.h
432432
( \
@@ -446,6 +446,9 @@ generate_cbindgen: cbindgen_binary # Regenerate components-rs/ddtrace.h componen
446446
$(command rustup && echo run nightly --) cbindgen --crate datadog-sidecar-ffi \
447447
--config datadog-sidecar-ffi/cbindgen.toml \
448448
--output $(PROJECT_ROOT)/components-rs/sidecar.h; \
449+
$(command rustup && echo run nightly --) cbindgen --crate datadog-sidecar-appsec-ffi \
450+
--config datadog-sidecar-appsec-ffi/cbindgen.toml \
451+
--output $(PROJECT_ROOT)/components-rs/sidecar-appsec.h; \
449452
$(command rustup && echo run nightly --) cbindgen --crate libdd-crashtracker-ffi \
450453
--config libdd-crashtracker-ffi/cbindgen.toml \
451454
--output $(PROJECT_ROOT)/components-rs/crashtracker.h; \
@@ -456,7 +459,7 @@ generate_cbindgen: cbindgen_binary # Regenerate components-rs/ddtrace.h componen
456459
mkdir -pv "$(BUILD_DIR)"; \
457460
export CARGO_TARGET_DIR="$(BUILD_DIR)/target"; \
458461
fi; \
459-
cargo run -p tools --bin dedup_headers -- $(PROJECT_ROOT)/components-rs/common.h $(PROJECT_ROOT)/components-rs/ddtrace.h $(PROJECT_ROOT)/components-rs/live-debugger.h $(PROJECT_ROOT)/components-rs/telemetry.h $(PROJECT_ROOT)/components-rs/sidecar.h $(PROJECT_ROOT)/components-rs/crashtracker.h $(PROJECT_ROOT)/components-rs/library-config.h \
462+
cargo run -p tools --bin dedup_headers -- $(PROJECT_ROOT)/components-rs/common.h $(PROJECT_ROOT)/components-rs/ddtrace.h $(PROJECT_ROOT)/components-rs/live-debugger.h $(PROJECT_ROOT)/components-rs/telemetry.h $(PROJECT_ROOT)/components-rs/sidecar.h $(PROJECT_ROOT)/components-rs/sidecar-appsec.h $(PROJECT_ROOT)/components-rs/crashtracker.h $(PROJECT_ROOT)/components-rs/library-config.h \
460463
)
461464

462465
cbindgen_binary:

appsec/helper-rust/build.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,13 @@ fn main() {
5252
// in the same directory as the binary/library
5353
if target.contains("linux") {
5454
println!("cargo::rustc-link-arg=-Wl,-rpath,$ORIGIN");
55+
// Allow symbols to be resolved from the parent process at dlopen time.
56+
println!("cargo::rustc-link-arg=-Wl,--allow-shlib-undefined");
5557
} else if target.contains("darwin") || target.contains("apple") {
5658
println!("cargo::rustc-link-arg=-Wl,-rpath,@loader_path");
59+
// Allow undefined symbols to be resolved at dlopen time from the parent process.
60+
println!("cargo::rustc-link-arg=-undefined");
61+
println!("cargo::rustc-link-arg=dynamic_lookup");
5762
}
5863

5964
// If LIBDDWAF_PREFIX is set, add that library path to rpath as well

appsec/helper-rust/scripts/generate-sidecar-ffi.sh

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ OUTPUT_FILE="$PROJECT_DIR/src/ffi/sidecar_ffi.rs"
1414

1515
cd "$COMPONENTS_RS_DIR"
1616

17-
bindgen sidecar.h \
17+
bindgen sidecar-appsec.h \
1818
--allowlist-function 'ddog_sidecar_enqueue_telemetry_log' \
1919
--allowlist-function 'ddog_sidecar_enqueue_telemetry_point' \
2020
--allowlist-function 'ddog_sidecar_enqueue_telemetry_metric' \
@@ -24,6 +24,9 @@ bindgen sidecar.h \
2424
--allowlist-function 'ddog_Error_drop' \
2525
--allowlist-function 'ddog_Error_message' \
2626
--allowlist-function 'ddog_MaybeError_drop' \
27+
--allowlist-function 'ddog_remote_config_path' \
28+
--allowlist-function 'ddog_remote_config_path_free' \
29+
--allowlist-function 'ddog_set_rc_notify_fn' \
2730
--allowlist-type 'ddog_SidecarTransport' \
2831
--allowlist-type 'ddog_LogLevel' \
2932
--allowlist-type 'ddog_CharSlice' \
@@ -34,14 +37,15 @@ bindgen sidecar.h \
3437
--allowlist-type 'ddog_Error' \
3538
--allowlist-type 'ddog_Vec_U8' \
3639
--allowlist-type 'ddog_MetricNamespace' \
40+
--allowlist-type 'ddog_MetricType' \
3741
--no-layout-tests \
3842
--no-doc-comments \
3943
--use-core \
40-
--raw-line '//! Auto-generated FFI bindings from components-rs/sidecar.h' \
44+
--raw-line '//! Auto-generated FFI bindings from components-rs/sidecar-appsec.h' \
4145
--raw-line '//!' \
4246
--raw-line '//! Regenerate with: ./scripts/generate-sidecar-ffi.sh' \
4347
--raw-line '//!' \
44-
--raw-line '//! Only includes types/functions needed for helper-rust as telemetry sender.' \
48+
--raw-line '//! Only includes types/functions needed by helper-rust.' \
4549
--raw-line '#![allow(non_camel_case_types, non_upper_case_globals, dead_code)]' \
4650
--output "$OUTPUT_FILE" \
4751
-- -I.

appsec/helper-rust/src/ffi/sidecar_ffi.rs

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/* automatically generated by rust-bindgen 0.72.1 */
22

3-
//! Auto-generated FFI bindings from components-rs/sidecar.h
3+
//! Auto-generated FFI bindings from components-rs/sidecar-appsec.h
44
//!
55
//! Regenerate with: ./scripts/generate-sidecar-ffi.sh
66
//!
7-
//! Only includes types/functions needed for helper-rust as telemetry sender.
7+
//! Only includes types/functions needed by helper-rust.
88
#![allow(non_camel_case_types, non_upper_case_globals, dead_code)]
99

1010
#[repr(C)]
@@ -71,6 +71,19 @@ pub const ddog_LogLevel_DDOG_LOG_LEVEL_ERROR: ddog_LogLevel = 0;
7171
pub const ddog_LogLevel_DDOG_LOG_LEVEL_WARN: ddog_LogLevel = 1;
7272
pub const ddog_LogLevel_DDOG_LOG_LEVEL_DEBUG: ddog_LogLevel = 2;
7373
pub type ddog_LogLevel = ::core::ffi::c_uint;
74+
#[repr(C)]
75+
#[derive(Debug, Copy, Clone)]
76+
pub struct ddog_Arc_Target {
77+
_unused: [u8; 0],
78+
}
79+
#[repr(C)]
80+
#[derive(Debug, Copy, Clone)]
81+
pub struct ddog_ConfigInvariants {
82+
_unused: [u8; 0],
83+
}
84+
pub type ddog_InProcNotifyFn = ::core::option::Option<
85+
unsafe extern "C" fn(arg1: *const ddog_ConfigInvariants, arg2: *const ddog_Arc_Target),
86+
>;
7487
unsafe extern "C" {
7588
pub fn ddog_Error_drop(error: *mut ddog_Error);
7689
}
@@ -81,46 +94,58 @@ unsafe extern "C" {
8194
pub fn ddog_MaybeError_drop(arg1: ddog_MaybeError);
8295
}
8396
unsafe extern "C" {
84-
pub fn ddog_sidecar_transport_drop(arg1: *mut ddog_SidecarTransport);
97+
pub fn ddog_set_rc_notify_fn(notify_fn: ddog_InProcNotifyFn);
8598
}
8699
unsafe extern "C" {
87100
pub fn ddog_sidecar_connect(connection: *mut *mut ddog_SidecarTransport) -> ddog_MaybeError;
88101
}
102+
unsafe extern "C" {
103+
pub fn ddog_sidecar_transport_drop(arg1: *mut ddog_SidecarTransport);
104+
}
89105
unsafe extern "C" {
90106
pub fn ddog_sidecar_ping(transport: *mut *mut ddog_SidecarTransport) -> ddog_MaybeError;
91107
}
108+
unsafe extern "C" {
109+
pub fn ddog_remote_config_path(
110+
id: *const ddog_ConfigInvariants,
111+
target: *const ddog_Arc_Target,
112+
) -> *mut ::core::ffi::c_char;
113+
}
114+
unsafe extern "C" {
115+
pub fn ddog_remote_config_path_free(path: *mut ::core::ffi::c_char);
116+
}
92117
unsafe extern "C" {
93118
pub fn ddog_sidecar_enqueue_telemetry_log(
94-
session_id_ffi: ddog_CharSlice,
95-
runtime_id_ffi: ddog_CharSlice,
96-
service_name_ffi: ddog_CharSlice,
97-
env_name_ffi: ddog_CharSlice,
98-
identifier_ffi: ddog_CharSlice,
119+
session_id: ddog_CharSlice,
120+
runtime_id: ddog_CharSlice,
121+
service_name: ddog_CharSlice,
122+
env_name: ddog_CharSlice,
123+
identifier: ddog_CharSlice,
99124
level: ddog_LogLevel,
100-
message_ffi: ddog_CharSlice,
101-
stack_trace_ffi: *mut ddog_CharSlice,
102-
tags_ffi: *mut ddog_CharSlice,
125+
message: ddog_CharSlice,
126+
stack_trace: *mut ddog_CharSlice,
127+
tags: *mut ddog_CharSlice,
103128
is_sensitive: bool,
104129
) -> ddog_MaybeError;
105130
}
106131
unsafe extern "C" {
107132
pub fn ddog_sidecar_enqueue_telemetry_point(
108-
session_id_ffi: ddog_CharSlice,
109-
runtime_id_ffi: ddog_CharSlice,
110-
service_name_ffi: ddog_CharSlice,
111-
env_name_ffi: ddog_CharSlice,
112-
metric_name_ffi: ddog_CharSlice,
133+
session_id: ddog_CharSlice,
134+
runtime_id: ddog_CharSlice,
135+
service_name: ddog_CharSlice,
136+
env_name: ddog_CharSlice,
137+
metric_name: ddog_CharSlice,
113138
value: f64,
114-
tags_ffi: *mut ddog_CharSlice,
139+
tags: *mut ddog_CharSlice,
115140
) -> ddog_MaybeError;
116141
}
117142
unsafe extern "C" {
118143
pub fn ddog_sidecar_enqueue_telemetry_metric(
119-
session_id_ffi: ddog_CharSlice,
120-
runtime_id_ffi: ddog_CharSlice,
121-
service_name_ffi: ddog_CharSlice,
122-
env_name_ffi: ddog_CharSlice,
123-
metric_name_ffi: ddog_CharSlice,
144+
session_id: ddog_CharSlice,
145+
runtime_id: ddog_CharSlice,
146+
service_name: ddog_CharSlice,
147+
env_name: ddog_CharSlice,
148+
metric_name: ddog_CharSlice,
124149
metric_type: ddog_MetricType,
125150
metric_namespace: ddog_MetricNamespace,
126151
) -> ddog_MaybeError;

appsec/helper-rust/src/rc_notify.rs

Lines changed: 18 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
1-
use std::ffi::{c_char, c_void, CStr, OsStr};
1+
use std::ffi::{CStr, OsStr};
22
use std::os::unix::ffi::OsStrExt;
33
use std::path::Path;
44
use std::sync::atomic::{AtomicPtr, Ordering};
55

6+
use crate::ffi::sidecar_ffi::{
7+
ddog_Arc_Target, ddog_ConfigInvariants, ddog_remote_config_path,
8+
ddog_remote_config_path_free, ddog_set_rc_notify_fn,
9+
};
610
use crate::service::ServiceManager;
711

8-
type InProcNotifyFn = extern "C" fn(*const c_void, *const c_void);
9-
type DdogRemoteConfigPathFn = extern "C" fn(*const c_void, *const c_void) -> *mut c_char;
10-
type DdogRemoteConfigPathFreeFn = extern "C" fn(*mut c_char);
11-
12-
static mut DDOG_SET_RC_NOTIFY_FN: Option<extern "C" fn(Option<InProcNotifyFn>)> = None;
13-
static mut DDOG_REMOTE_CONFIG_PATH: Option<DdogRemoteConfigPathFn> = None;
14-
static mut DDOG_REMOTE_CONFIG_PATH_FREE: Option<DdogRemoteConfigPathFreeFn> = None;
15-
1612
static SERVICE_MANAGER: AtomicPtr<ServiceManager> = AtomicPtr::new(std::ptr::null_mut());
1713

18-
extern "C" fn rc_notify_callback(invariants: *const c_void, target: *const c_void) {
14+
unsafe extern "C" fn rc_notify_callback(
15+
invariants: *const ddog_ConfigInvariants,
16+
target: *const ddog_Arc_Target,
17+
) {
1918
let service_manager = SERVICE_MANAGER.load(Ordering::Acquire);
2019
if service_manager.is_null() {
2120
log::warn!("No service manager to notify of remote config updates");
@@ -37,36 +36,6 @@ extern "C" fn rc_notify_callback(invariants: *const c_void, target: *const c_voi
3736
}
3837

3938
pub fn resolve_symbols() -> Result<(), String> {
40-
unsafe {
41-
let set_fn = libc::dlsym(libc::RTLD_DEFAULT, c"ddog_set_rc_notify_fn".as_ptr());
42-
if set_fn.is_null() {
43-
return Err("Failed to resolve ddog_set_rc_notify_fn".to_string());
44-
}
45-
DDOG_SET_RC_NOTIFY_FN = Some(std::mem::transmute::<
46-
*mut libc::c_void,
47-
extern "C" fn(Option<InProcNotifyFn>),
48-
>(set_fn));
49-
50-
let path_fn = libc::dlsym(libc::RTLD_DEFAULT, c"ddog_remote_config_path".as_ptr());
51-
if path_fn.is_null() {
52-
return Err("Failed to resolve ddog_remote_config_path".to_string());
53-
}
54-
DDOG_REMOTE_CONFIG_PATH = Some(std::mem::transmute::<
55-
*mut libc::c_void,
56-
DdogRemoteConfigPathFn,
57-
>(path_fn));
58-
59-
let path_free_fn =
60-
libc::dlsym(libc::RTLD_DEFAULT, c"ddog_remote_config_path_free".as_ptr());
61-
if path_free_fn.is_null() {
62-
return Err("Failed to resolve ddog_remote_config_path_free".to_string());
63-
}
64-
DDOG_REMOTE_CONFIG_PATH_FREE = Some(std::mem::transmute::<
65-
*mut libc::c_void,
66-
DdogRemoteConfigPathFreeFn,
67-
>(path_free_fn));
68-
}
69-
7039
Ok(())
7140
}
7241

@@ -75,54 +44,36 @@ pub fn register_for_rc_notifications(service_manager: &'static ServiceManager) {
7544

7645
SERVICE_MANAGER.store(service_manager as *const _ as *mut _, Ordering::Release);
7746

78-
if let Some(set_fn) = unsafe { DDOG_SET_RC_NOTIFY_FN } {
79-
set_fn(Some(rc_notify_callback));
80-
} else {
81-
log::warn!("ddog_set_rc_notify_fn not available, RC notifications will not work");
47+
unsafe {
48+
ddog_set_rc_notify_fn(Some(rc_notify_callback));
8249
}
8350
}
8451

8552
pub fn unregister_for_rc_notifications() {
8653
log::info!("Unregistering for RC update callbacks");
8754

88-
if let Some(set_fn) = unsafe { DDOG_SET_RC_NOTIFY_FN } {
89-
set_fn(None);
55+
unsafe {
56+
ddog_set_rc_notify_fn(None);
9057
}
9158

9259
SERVICE_MANAGER.store(std::ptr::null_mut(), Ordering::Release);
9360
}
9461

9562
struct RemoteConfigPath {
96-
buf: *mut c_char,
97-
path_free_fn: DdogRemoteConfigPathFreeFn,
63+
buf: *mut std::ffi::c_char,
9864
}
9965
impl RemoteConfigPath {
100-
fn new(invariants: *const c_void, target: *const c_void) -> anyhow::Result<Self> {
101-
let path_fn = match unsafe { DDOG_REMOTE_CONFIG_PATH } {
102-
Some(f) => f,
103-
None => {
104-
return Err(anyhow::anyhow!("ddog_remote_config_path not resolved"));
105-
}
106-
};
107-
108-
let path_free_fn = match unsafe { DDOG_REMOTE_CONFIG_PATH_FREE } {
109-
Some(f) => f,
110-
None => {
111-
return Err(anyhow::anyhow!("ddog_remote_config_path_free not resolved"));
112-
}
113-
};
114-
115-
let buf = path_fn(invariants, target);
66+
fn new(invariants: *const ddog_ConfigInvariants, target: *const ddog_Arc_Target) -> anyhow::Result<Self> {
67+
let buf = unsafe { ddog_remote_config_path(invariants, target) };
11668
if buf.is_null() {
11769
return Err(anyhow::anyhow!("ddog_remote_config_path returned null"));
11870
}
119-
120-
Ok(Self { buf, path_free_fn })
71+
Ok(Self { buf })
12172
}
12273
}
12374
impl Drop for RemoteConfigPath {
12475
fn drop(&mut self) {
125-
(self.path_free_fn)(self.buf);
76+
unsafe { ddog_remote_config_path_free(self.buf) };
12677
}
12778
}
12879
impl AsRef<Path> for RemoteConfigPath {

0 commit comments

Comments
 (0)