diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index 417a58516b6..8c4ee7f9b5c 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -1546,8 +1546,15 @@ jobs: export DEBIAN_FRONTEND=noninteractive apt update # clang-tidy 16 crashes so we use 17 instead - apt install -y wget git g++ gcc cmake make curl libcurl4-gnutls-dev clang clang-tidy-17 clang-format-17 git php-dev php-cgi + apt install -y wget sudo git g++ gcc cmake make curl libcurl4-gnutls-dev clang clang-tidy-17 clang-format-17 git php-dev php-cgi - run: git config --global --add safe.directory /home/circleci/datadog/appsec/third_party/libddwaf + - run: + name: Install rust + command: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > /tmp/rustup.sh + chmod +x /tmp/rustup.sh + /tmp/rustup.sh -y --default-toolchain 1.78 + sudo ln -s $HOME/.cargo/bin/* /usr/bin/ - run: name: CMake command: | @@ -1983,6 +1990,7 @@ jobs: cd /usr/local/src/php mkdir -p /tmp/artifacts/core_dumps find ./ -name "core.*" | xargs -I % -n 1 cp % /tmp/artifacts/core_dumps && chmod -R o+rx /tmp/artifacts/core_dumps + ! [ "$(ls -A /tmp/artifacts/core_dumps)" ] || cp /home/circleci/datadog/tmp/build_extension/modules/ddtrace.so /tmp/artifacts/ mkdir -p /tmp/artifacts/diffs find -type f -name '*.diff' -exec cp --parents '{}' /tmp/artifacts/diffs \; when: on_fail @@ -2663,8 +2671,8 @@ jobs: command: | make build_pecl_package mkdir -p ./pecl && cp datadog_trace-*.tgz ./pecl - #- store_artifacts: - # path: pecl + - store_artifacts: + path: pecl - persist_to_workspace: root: . paths: [pecl] @@ -3999,7 +4007,7 @@ jobs: - git_checkout - run: name: Install cbindgen - command: cargo install --version "^0.26" cbindgen + command: cargo install --version "^0.28" cbindgen - run: name: Regenerate cbindgen headers and compare them command: | diff --git a/Cargo.lock b/Cargo.lock index 29314fdc506..bde8ba66bc8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,10 +24,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check 0.9.5", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -444,12 +444,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.7" @@ -582,9 +576,9 @@ dependencies = [ [[package]] name = "bolero" -version = "0.10.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212e8dca6d4001cc6cac941d6932ddaa8cd27f57e5e44a9da19c913eb6a43b33" +checksum = "eeae9bae5224be9a368c3b4f8cc83451473d55bcc1aa522cf56a48828dcf7f6e" dependencies = [ "bolero-afl", "bolero-engine", @@ -593,14 +587,14 @@ dependencies = [ "bolero-kani", "bolero-libfuzzer", "cfg-if", - "rand 0.8.5", + "rand 0.9.0", ] [[package]] name = "bolero-afl" -version = "0.10.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b34f05de1527425bb05287da09ff1ff1612538648824db49e16d9693b24065" +checksum = "d9bf4cbd0bacf9356d3c7e5d9d088480f2076ba3c595c15ee9a6a378cdd7b297" dependencies = [ "bolero-engine", "cc", @@ -608,34 +602,37 @@ dependencies = [ [[package]] name = "bolero-engine" -version = "0.10.2" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6206263ebdd42e093c1229dab3957f61c9fd68d73c00f238ae25a378778b6bd3" +checksum = "6b2496696794ca673fd085c7237d2b64b825bfe0dedbd5e947ca633532d8132b" dependencies = [ "anyhow", "backtrace", "bolero-generator", "lazy_static", "pretty-hex", - "rand 0.8.5", + "rand 0.9.0", + "rand_xoshiro", ] [[package]] name = "bolero-generator" -version = "0.10.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac749fb4f2e14734e835a9352c0d1eb2ab62a025d4c56a823fa3f391e015741a" +checksum = "06b0c9bd47ec1d25ce698a2b4a0c3d8e527d0046919a04c800035e30bf4ea6d1" dependencies = [ "bolero-generator-derive", "either", - "rand_core 0.6.4", + "getrandom 0.3.2", + "rand_core 0.9.3", + "rand_xoshiro", ] [[package]] name = "bolero-generator-derive" -version = "0.10.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53397bfda19ccb48527faa14025048fc4bb76f090ccdeef1e5a355bfe4a94467" +checksum = "385f38498675c06532bed10cd40a4313691a8fb7d9b698fcf096739d422e1764" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -645,27 +642,27 @@ dependencies = [ [[package]] name = "bolero-honggfuzz" -version = "0.10.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf78581db1a7263620a8767e645b93ad287c70122ae76f5bd67040c7f06ff8e3" +checksum = "9a118ef27295eddefadc6a99728ee698d1b18d2e80dc4777d21bee3385096ffd" dependencies = [ "bolero-engine", ] [[package]] name = "bolero-kani" -version = "0.10.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e55cec272a617f5ae4ce670db035108eb97c10cd4f67de851a3c8d3f18f19cb" +checksum = "852ea5784a9f3e68bfd302ca80b8b863bce140593eb5770fee6ab110899c28fc" dependencies = [ "bolero-engine", ] [[package]] name = "bolero-libfuzzer" -version = "0.10.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb42f66ee3ec89b9c411994de59d4710ced19df96fea2059feea1c2d73904c5b" +checksum = "858dc57c11725c52662501fa79fdbc6f7050339a05ca1bf1e587add0fed40d62" dependencies = [ "bolero-engine", "cc", @@ -686,7 +683,7 @@ dependencies = [ "home", "http 1.2.0", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-named-pipe", "hyper-rustls 0.26.0", "hyper-util", @@ -730,6 +727,16 @@ dependencies = [ "serde_json", ] +[[package]] +name = "build_common" +version = "16.0.3" +source = "git+https://github.com/DataDog/libdatadog?rev=78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28#78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28" +dependencies = [ + "cbindgen", + "serde", + "serde_json", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -819,9 +826,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.31" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "jobserver", "libc 0.2.169", @@ -1019,6 +1026,26 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3618cccc083bb987a415d85c02ca6c9994ea5b44731ec28b9ecf09658655fba9" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constcat" version = "0.4.1" @@ -1214,15 +1241,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct", -] - [[package]] name = "current_platform" version = "0.2.0" @@ -1280,8 +1298,11 @@ dependencies = [ "ddtelemetry", "dogstatsd-client", "either", + "http 1.2.0", + "http-body-util", "httpmock", - "hyper 0.14.32", + "hyper 1.6.0", + "hyper-util", "log", "rand 0.8.5", "regex", @@ -1316,8 +1337,8 @@ dependencies = [ "chrono", "ddcommon 0.0.1", "ddtelemetry", - "http 0.2.12", - "hyper 0.14.32", + "goblin", + "http 1.2.0", "libc 0.2.169", "nix 0.27.1", "num-derive", @@ -1332,6 +1353,7 @@ dependencies = [ "tempfile", "tokio", "uuid", + "windows 0.59.0", ] [[package]] @@ -1339,15 +1361,19 @@ name = "datadog-crashtracker-ffi" version = "0.0.1" dependencies = [ "anyhow", - "build_common", + "build_common 0.0.1", "datadog-crashtracker", "ddcommon 0.0.1", - "ddcommon-ffi", + "ddcommon-ffi 0.0.1", "function_name", - "hyper 0.14.32", "libc 0.2.169", + "log", + "serde", + "serde_json", "symbolic-common", "symbolic-demangle", + "tempfile", + "windows 0.59.0", ] [[package]] @@ -1408,6 +1434,52 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "datadog-library-config" +version = "0.0.1" +dependencies = [ + "anyhow", + "serde", + "serde_yaml", + "tempfile", +] + +[[package]] +name = "datadog-library-config" +version = "0.0.1" +source = "git+https://github.com/DataDog/libdatadog?rev=78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28#78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28" +dependencies = [ + "anyhow", + "serde", + "serde_yaml", +] + +[[package]] +name = "datadog-library-config-ffi" +version = "0.0.1" +dependencies = [ + "anyhow", + "build_common 0.0.1", + "constcat", + "datadog-library-config 0.0.1", + "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", + "tempfile", +] + +[[package]] +name = "datadog-library-config-ffi" +version = "0.0.1" +source = "git+https://github.com/DataDog/libdatadog?rev=78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28#78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28" +dependencies = [ + "anyhow", + "build_common 16.0.3", + "constcat", + "datadog-library-config 0.0.1 (git+https://github.com/DataDog/libdatadog?rev=78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28)", + "ddcommon 16.0.3", + "ddcommon-ffi 16.0.3", +] + [[package]] name = "datadog-live-debugger" version = "0.0.1" @@ -1415,9 +1487,8 @@ dependencies = [ "anyhow", "constcat", "ddcommon 0.0.1", - "hyper 0.14.32", - "json", - "lazy_static", + "http-body-util", + "hyper 1.6.0", "percent-encoding", "regex", "regex-automata 0.4.9", @@ -1433,10 +1504,10 @@ dependencies = [ name = "datadog-live-debugger-ffi" version = "0.0.1" dependencies = [ - "build_common", + "build_common 0.0.1", "datadog-live-debugger", "ddcommon 0.0.1", - "ddcommon-ffi", + "ddcommon-ffi 0.0.1", "log", "percent-encoding", "serde_json", @@ -1460,6 +1531,7 @@ dependencies = [ "criterion-perf-events", "crossbeam-channel", "datadog-alloc", + "datadog-library-config-ffi 0.0.1 (git+https://github.com/DataDog/libdatadog?rev=78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28)", "datadog-php-profiling", "datadog-profiling", "ddcommon 15.1.0", @@ -1525,9 +1597,10 @@ dependencies = [ "ddcommon 0.0.1", "futures", "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "lazy_static", + "http 1.2.0", + "http-body-util", + "hyper 1.6.0", + "hyper-util", "manual_future", "serde", "serde_json", @@ -1551,6 +1624,7 @@ dependencies = [ "console-subscriber", "data-pipeline", "datadog-crashtracker", + "datadog-crashtracker-ffi", "datadog-dynamic-configuration", "datadog-ipc", "datadog-ipc-macros", @@ -1559,13 +1633,14 @@ dependencies = [ "datadog-sidecar-macros", "datadog-trace-utils", "ddcommon 0.0.1", + "ddcommon-ffi 0.0.1", "ddtelemetry", "dogstatsd-client", "futures", - "http 0.2.12", + "http 1.2.0", + "http-body-util", "httpmock", - "hyper 0.14.32", - "lazy_static", + "hyper 1.6.0", "libc 0.2.169", "manual_future", "memory-stats", @@ -1589,7 +1664,7 @@ dependencies = [ "tracing-log", "tracing-subscriber", "winapi 0.3.9", - "windows", + "windows 0.51.1", "windows-sys 0.52.0", "zwohash", ] @@ -1604,11 +1679,11 @@ dependencies = [ "datadog-sidecar", "datadog-trace-utils", "ddcommon 0.0.1", - "ddcommon-ffi", + "ddcommon-ffi 0.0.1", "ddtelemetry", "ddtelemetry-ffi", "dogstatsd-client", - "hyper 0.14.32", + "http 1.2.0", "libc 0.2.169", "paste", "tempfile", @@ -1652,7 +1727,6 @@ version = "0.0.1" dependencies = [ "anyhow", "bolero", - "bolero-generator", "bytes", "cargo-platform", "cargo_metadata", @@ -1663,10 +1737,10 @@ dependencies = [ "ddcommon 0.0.1", "flate2", "futures", + "http-body-util", "httpmock", - "hyper 0.14.32", - "hyper-proxy", - "hyper-rustls 0.27.5", + "hyper 1.6.0", + "hyper-http-proxy", "log", "prost 0.11.9", "rand 0.8.5", @@ -1680,6 +1754,7 @@ dependencies = [ "tinybytes", "tokio", "urlencoding", + "zstd", ] [[package]] @@ -1688,27 +1763,34 @@ version = "0.0.1" dependencies = [ "anyhow", "cc", + "const_format", "futures", "futures-core", "futures-util", "hex", - "http 0.2.12", - "hyper 0.14.32", + "http 1.2.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", "hyper-rustls 0.27.5", "hyper-util", "indexmap 2.7.1", - "lazy_static", "libc 0.2.169", "log", "maplit", + "memfd", "pin-project", + "rand 0.8.5", "regex", + "rmp", + "rmp-serde", "rustls 0.23.21", - "rustls-native-certs 0.7.3", + "rustls-native-certs 0.8.1", "serde", "static_assertions", "tokio", "tokio-rustls 0.26.1", + "tower-service", "windows-sys 0.52.0", ] @@ -1741,16 +1823,63 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ddcommon" +version = "16.0.3" +source = "git+https://github.com/DataDog/libdatadog?rev=78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28#78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28" +dependencies = [ + "anyhow", + "cc", + "futures", + "futures-core", + "futures-util", + "hex", + "http 0.2.12", + "hyper 0.14.32", + "hyper-rustls 0.27.5", + "hyper-util", + "lazy_static", + "libc 0.2.169", + "log", + "memfd", + "pin-project", + "rand 0.8.5", + "regex", + "rmp", + "rmp-serde", + "rustls 0.23.21", + "rustls-native-certs 0.7.3", + "serde", + "static_assertions", + "tokio", + "tokio-rustls 0.26.1", + "windows-sys 0.52.0", +] + [[package]] name = "ddcommon-ffi" version = "0.0.1" dependencies = [ "anyhow", "bolero", - "build_common", + "build_common 0.0.1", "chrono", "crossbeam-queue", "ddcommon 0.0.1", + "hyper 1.6.0", + "serde", +] + +[[package]] +name = "ddcommon-ffi" +version = "16.0.3" +source = "git+https://github.com/DataDog/libdatadog?rev=78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28#78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28" +dependencies = [ + "anyhow", + "build_common 16.0.3", + "chrono", + "crossbeam-queue", + "ddcommon 16.0.3", "hyper 0.14.32", "serde", ] @@ -1765,12 +1894,10 @@ dependencies = [ "ddcommon 0.0.1", "futures", "hashbrown 0.14.5", - "http 0.2.12", - "hyper 0.14.32", - "io-lifetimes", - "lazy_static", - "pin-project", - "regex", + "http 1.2.0", + "http-body-util", + "hyper 1.6.0", + "hyper-util", "serde", "serde_json", "sys-info", @@ -1785,9 +1912,9 @@ dependencies = [ name = "ddtelemetry-ffi" version = "0.0.1" dependencies = [ - "build_common", + "build_common 0.0.1", "ddcommon 0.0.1", - "ddcommon-ffi", + "ddcommon-ffi 0.0.1", "ddtelemetry", "libc 0.2.169", "paste", @@ -1804,17 +1931,18 @@ dependencies = [ "datadog-crashtracker-ffi", "datadog-dynamic-configuration", "datadog-ipc", + "datadog-library-config-ffi 0.0.1", "datadog-live-debugger", "datadog-live-debugger-ffi", "datadog-remote-config", "datadog-sidecar", "datadog-sidecar-ffi", "ddcommon 0.0.1", - "ddcommon-ffi", + "ddcommon-ffi 0.0.1", "ddtelemetry", "ddtelemetry-ffi", "env_logger 0.10.2", - "http 0.2.12", + "http 1.2.0", "itertools 0.11.0", "lazy_static", "log", @@ -1951,7 +2079,7 @@ dependencies = [ "anyhow", "cadence", "ddcommon 0.0.1", - "http 0.2.12", + "http 1.2.0", "serde", "tokio", "tracing", @@ -2310,10 +2438,22 @@ dependencies = [ "cfg-if", "js-sys", "libc 0.2.169", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc 0.2.169", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gimli" version = "0.31.1" @@ -2352,6 +2492,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "goblin" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa0a64d21a7eb230583b4c5f4e23b7e4e57974f96620f42a7e75e08ae66d745" +dependencies = [ + "log", + "plain", + "scroll", +] + [[package]] name = "h2" version = "0.3.26" @@ -2428,14 +2579,14 @@ dependencies = [ [[package]] name = "headers" -version = "0.3.9" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" dependencies = [ "base64 0.21.7", "bytes", "headers-core", - "http 0.2.12", + "http 1.2.0", "httpdate", "mime", "sha1", @@ -2443,11 +2594,11 @@ dependencies = [ [[package]] name = "headers-core" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 0.2.12", + "http 1.2.0", ] [[package]] @@ -2611,9 +2762,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -2621,6 +2772,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "httparse", + "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -2628,6 +2780,26 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-http-proxy" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad4b0a1e37510028bc4ba81d0e38d239c39671b0f0ce9e02dfa93a8133f7c08" +dependencies = [ + "bytes", + "futures-util", + "headers", + "http 1.2.0", + "hyper 1.6.0", + "hyper-rustls 0.27.5", + "hyper-util", + "pin-project-lite", + "tokio", + "tokio-rustls 0.26.1", + "tower-service", + "webpki-roots", +] + [[package]] name = "hyper-multipart-rfc7578" version = "0.7.0" @@ -2648,7 +2820,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" dependencies = [ "hex", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "pin-project-lite", "tokio", @@ -2656,42 +2828,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "hyper-proxy" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" -dependencies = [ - "bytes", - "futures", - "headers", - "http 0.2.12", - "hyper 0.14.32", - "hyper-rustls 0.22.1", - "rustls-native-certs 0.5.0", - "tokio", - "tokio-rustls 0.22.0", - "tower-service", - "webpki", -] - -[[package]] -name = "hyper-rustls" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" -dependencies = [ - "ct-logs", - "futures-util", - "hyper 0.14.32", - "log", - "rustls 0.19.1", - "rustls-native-certs 0.5.0", - "tokio", - "tokio-rustls 0.22.0", - "webpki", -] - [[package]] name = "hyper-rustls" version = "0.26.0" @@ -2700,7 +2836,7 @@ checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", "http 1.2.0", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "log", "rustls 0.22.4", @@ -2719,7 +2855,7 @@ checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.2.0", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "rustls 0.23.21", "rustls-native-certs 0.8.1", @@ -2753,7 +2889,7 @@ dependencies = [ "futures-util", "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.2", + "hyper 1.6.0", "pin-project-lite", "socket2", "tokio", @@ -2769,7 +2905,7 @@ checksum = "acf569d43fa9848e510358c07b80f4adf34084ddc28c6a4a651ee8474c070dcc" dependencies = [ "hex", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "pin-project-lite", "tokio", @@ -3052,12 +3188,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "json" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" - [[package]] name = "kernel32-sys" version = "0.2.2" @@ -3327,7 +3457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc 0.2.169", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3791,6 +3921,18 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "plotters" version = "0.3.7" @@ -3855,7 +3997,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -3876,9 +4018,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "pretty-hex" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +checksum = "bbc83ee4a840062f368f9096d80077a9841ec117e17e7f700df81958f1451254" [[package]] name = "pretty_assertions" @@ -3923,12 +4065,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "toml_edit 0.20.7", ] [[package]] @@ -3974,7 +4115,7 @@ dependencies = [ "lazy_static", "num-traits", "rand 0.8.5", - "rand_chacha", + "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax 0.8.5", "unarray", @@ -4123,6 +4264,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.4.6" @@ -4143,10 +4290,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc 0.2.169", - "rand_chacha", + "rand_chacha 0.3.1", "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.24", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -4157,6 +4315,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + [[package]] name = "rand_core" version = "0.3.1" @@ -4178,7 +4346,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", ] [[package]] @@ -4200,6 +4377,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core 0.9.3", +] + [[package]] name = "raw-cpuid" version = "10.7.0" @@ -4253,7 +4439,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror 1.0.69", ] @@ -4333,31 +4519,15 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc 0.2.169", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi 0.3.9", -] - -[[package]] -name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc 0.2.169", - "spin 0.9.8", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.52.0", ] @@ -4427,19 +4597,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64 0.13.1", - "log", - "ring 0.16.20", - "sct", - "webpki", -] - [[package]] name = "rustls" version = "0.22.4" @@ -4447,7 +4604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", - "ring 0.17.8", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -4462,25 +4619,13 @@ checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ "aws-lc-rs", "once_cell", - "ring 0.17.8", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" -dependencies = [ - "openssl-probe", - "rustls 0.19.1", - "schannel", - "security-framework 2.11.1", -] - [[package]] name = "rustls-native-certs" version = "0.7.3" @@ -4528,9 +4673,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "aws-lc-rs", - "ring 0.17.8", + "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] @@ -4605,13 +4750,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "sct" -version = "0.6.1" +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", + "proc-macro2", + "quote", + "syn 2.0.96", ] [[package]] @@ -4793,6 +4948,19 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.7.1", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "sha1" version = "0.10.6" @@ -4858,7 +5026,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2bcf6c6e164e81bc7a5d49fc6988b3d515d9e8c07457d7b74ffb9324b9cd40" dependencies = [ - "getrandom", + "getrandom 0.2.15", "halfbrown", "ref-cast", "serde", @@ -4924,21 +5092,9 @@ dependencies = [ "rlimit", "tempfile", "winapi 0.2.8", - "windows", + "windows 0.51.1", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -5141,7 +5297,7 @@ checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", - "getrandom", + "getrandom 0.2.15", "once_cell", "rustix", "windows-sys 0.59.0", @@ -5334,6 +5490,7 @@ dependencies = [ "once_cell", "pretty_assertions", "proptest", + "rmp-serde", "serde", "serde_json", "test-case", @@ -5400,17 +5557,6 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "tokio-rustls" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" -dependencies = [ - "rustls 0.19.1", - "tokio", - "webpki", -] - [[package]] name = "tokio-rustls" version = "0.25.0" @@ -5498,9 +5644,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ "indexmap 2.7.1", "toml_datetime", @@ -5717,10 +5863,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] -name = "untrusted" -version = "0.7.1" +name = "unsafe-libyaml" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "untrusted" @@ -5770,7 +5916,7 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" dependencies = [ - "getrandom", + "getrandom 0.2.15", "serde", ] @@ -5835,6 +5981,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -5916,16 +6071,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - [[package]] name = "webpki-roots" version = "0.26.7" @@ -6000,6 +6145,16 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" +dependencies = [ + "windows-core 0.59.0", + "windows-targets 0.53.0", +] + [[package]] name = "windows-core" version = "0.51.1" @@ -6018,6 +6173,65 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-implement" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -6084,13 +6298,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -6109,6 +6339,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -6127,6 +6363,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -6145,12 +6387,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -6169,6 +6423,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -6187,6 +6447,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -6205,6 +6471,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -6223,6 +6495,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.5.40" @@ -6241,6 +6519,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -6305,7 +6592,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", ] [[package]] @@ -6319,6 +6615,17 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "zerofrom" version = "0.1.5" @@ -6368,6 +6675,34 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "zwohash" version = "0.1.2" diff --git a/Makefile b/Makefile index 4712f4f7f99..d8e31201668 100644 --- a/Makefile +++ b/Makefile @@ -45,8 +45,8 @@ RUN_TESTS_IS_PARALLEL ?= $(shell test $(PHP_MAJOR_MINOR) -ge 74 && echo 1) RUN_TESTS_CMD := REPORT_EXIT_STATUS=1 TEST_PHP_SRCDIR=$(PROJECT_ROOT) USE_TRACKED_ALLOC=1 php -n -d 'memory_limit=-1' $(BUILD_DIR)/run-tests.php $(if $(QUIET_TESTS),,-g FAIL,XFAIL,BORK,WARN,LEAK,XLEAK,SKIP) $(if $(ASAN), --asan) --show-diff -n -p $(shell which php) -q $(if $(RUN_TESTS_IS_PARALLEL), --shuffle -j$(MAX_TEST_PARALLELISM)) 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 }' ) -TEST_FILES = $(shell find tests/ext -name '*.php*' -o -name '*.inc' -o -name '*.json' -o -name 'CONFLICTS' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) -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/{alloc,build-common,crashtracker,crashtracker-ffi,data-pipeline,ddcommon,ddcommon-ffi,ddsketch,ddtelemetry,ddtelemetry-ffi,dogstatsd-client,dynamic-configuration,ipc,live-debugger,live-debugger-ffi,remote-config,sidecar,sidecar-ffi,spawn_worker,tinybytes,tools/{cc_utils,sidecar_mockgen},trace-*,Cargo.toml} -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 "*/ipc/build.rs" -not -path "*/sidecar-ffi/build.rs") +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 }' ) +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/{alloc,build-common,crashtracker,crashtracker-ffi,data-pipeline,ddcommon,ddcommon-ffi,ddsketch,ddtelemetry,ddtelemetry-ffi,dogstatsd-client,dynamic-configuration,ipc,library-config,library-config-ffi,live-debugger,live-debugger-ffi,remote-config,sidecar,sidecar-ffi,spawn_worker,tinybytes,tools/{cc_utils,sidecar_mockgen},trace-*,Cargo.toml} -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 "*/ipc/build.rs" -not -path "*/sidecar-ffi/build.rs") ALL_OBJECT_FILES = $(C_FILES) $(RUST_FILES) $(BUILD_DIR)/Makefile TEST_OPCACHE_FILES = $(shell find tests/opcache -name '*.php*' -o -name '.gitkeep' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) TEST_STUB_FILES = $(shell find tests/ext -type d -name 'stubs' -exec find '{}' -type f \; | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) @@ -407,9 +407,9 @@ clang_format_fix: cbindgen: remove_cbindgen generate_cbindgen remove_cbindgen: - 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 + 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 -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 +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 ( \ $(command rustup && echo run nightly --) cbindgen --crate ddtrace-php \ --config cbindgen.toml \ @@ -430,11 +430,14 @@ generate_cbindgen: cbindgen_binary # Regenerate components-rs/ddtrace.h componen $(command rustup && echo run nightly --) cbindgen --crate datadog-crashtracker-ffi \ --config crashtracker-ffi/cbindgen.toml \ --output $(PROJECT_ROOT)/components-rs/crashtracker.h; \ + $(command rustup && echo run nightly --) cbindgen --crate datadog-library-config-ffi \ + --config library-config-ffi/cbindgen.toml \ + --output $(PROJECT_ROOT)/components-rs/library-config.h; \ if test -d $(PROJECT_ROOT)/tmp; then \ mkdir -pv "$(BUILD_DIR)"; \ export CARGO_TARGET_DIR="$(BUILD_DIR)/target"; \ fi; \ - cargo run -p tools -- $(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 \ + cargo run -p tools -- $(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 \ ) cbindgen_binary: diff --git a/appsec/cmake/extension.cmake b/appsec/cmake/extension.cmake index f42c835beee..b4222e29ca8 100644 --- a/appsec/cmake/extension.cmake +++ b/appsec/cmake/extension.cmake @@ -11,7 +11,7 @@ file(GLOB_RECURSE ZAI_SOURCE ../zend_abstract_interface/config/*.c add_library(zai STATIC ${ZAI_SOURCE}) target_link_libraries(zai PRIVATE PhpConfig) -target_include_directories(zai PUBLIC ../zend_abstract_interface) +target_include_directories(zai PUBLIC ../zend_abstract_interface ..) set_target_properties(zai PROPERTIES POSITION_INDEPENDENT_CODE 1) file(GLOB_RECURSE EXT_SOURCE ${EXT_SOURCE_DIR}/*.c) diff --git a/components-rs/Cargo.toml b/components-rs/Cargo.toml index 980c0218c09..f32867b2a61 100644 --- a/components-rs/Cargo.toml +++ b/components-rs/Cargo.toml @@ -20,6 +20,7 @@ datadog-remote-config = { path = "../libdatadog/remote-config" } datadog-sidecar = { path = "../libdatadog/sidecar" } datadog-sidecar-ffi = { path = "../libdatadog/sidecar-ffi" } datadog-crashtracker-ffi = { path = "../libdatadog/crashtracker-ffi", default-features = false, features = ["collector"] } +datadog-library-config-ffi = { path = "../libdatadog/library-config-ffi", default-features = false } spawn_worker = { path = "../libdatadog/spawn_worker" } anyhow = { version = "1.0" } const-str = "0.5.6" @@ -44,7 +45,7 @@ tracing-subscriber = { version = "0.3", default-features = false, features = [ serde_json = "1.0.113" regex = "1.10.5" regex-automata = "0.4.5" -http = "0.2.11" +http = "1.0" [build-dependencies] cbindgen = "0.27" diff --git a/components-rs/common.h b/components-rs/common.h index e78e1803afe..0dadd9076ee 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -1301,6 +1301,116 @@ typedef struct ddog_StringWrapperResult { }; } ddog_StringWrapperResult; +typedef enum ddog_LibraryConfigName { + DDOG_LIBRARY_CONFIG_NAME_DD_APM_TRACING_ENABLED, + DDOG_LIBRARY_CONFIG_NAME_DD_RUNTIME_METRICS_ENABLED, + DDOG_LIBRARY_CONFIG_NAME_DD_LOGS_INJECTION, + DDOG_LIBRARY_CONFIG_NAME_DD_PROFILING_ENABLED, + DDOG_LIBRARY_CONFIG_NAME_DD_DATA_STREAMS_ENABLED, + DDOG_LIBRARY_CONFIG_NAME_DD_APPSEC_ENABLED, + DDOG_LIBRARY_CONFIG_NAME_DD_IAST_ENABLED, + DDOG_LIBRARY_CONFIG_NAME_DD_DYNAMIC_INSTRUMENTATION_ENABLED, + DDOG_LIBRARY_CONFIG_NAME_DD_DATA_JOBS_ENABLED, + DDOG_LIBRARY_CONFIG_NAME_DD_APPSEC_SCA_ENABLED, + DDOG_LIBRARY_CONFIG_NAME_DD_TRACE_DEBUG, + DDOG_LIBRARY_CONFIG_NAME_DD_SERVICE, + DDOG_LIBRARY_CONFIG_NAME_DD_ENV, + DDOG_LIBRARY_CONFIG_NAME_DD_VERSION, +} ddog_LibraryConfigName; + +typedef enum ddog_LibraryConfigSource { + DDOG_LIBRARY_CONFIG_SOURCE_LOCAL_STABLE_CONFIG = 0, + DDOG_LIBRARY_CONFIG_SOURCE_FLEET_STABLE_CONFIG = 1, +} ddog_LibraryConfigSource; + +typedef struct ddog_Configurator ddog_Configurator; + +/** + * Ffi safe type representing a borrowed null-terminated C array + * Equivalent to a std::ffi::CStr + */ +typedef struct ddog_CStr { + /** + * Null terminated char array + */ + char *ptr; + /** + * Length of the array, not counting the null-terminator + */ + uintptr_t length; +} ddog_CStr; + +typedef struct ddog_Slice_CharSlice { + /** + * Should be non-null and suitably aligned for the underlying type. It is + * allowed but not recommended for the pointer to be null when the len is + * zero. + */ + const ddog_CharSlice *ptr; + /** + * The number of elements (not bytes) that `.ptr` points to. Must be less + * than or equal to [isize::MAX]. + */ + uintptr_t len; +} ddog_Slice_CharSlice; + +typedef struct ddog_ProcessInfo { + struct ddog_Slice_CharSlice args; + struct ddog_Slice_CharSlice envp; + ddog_CharSlice language; +} ddog_ProcessInfo; + +/** + * Ffi safe type representing an owned null-terminated C array + * Equivalent to a std::ffi::CString + */ +typedef struct ddog_CString { + /** + * Null terminated char array + */ + char *ptr; + /** + * Length of the array, not counting the null-terminator + */ + uintptr_t length; +} ddog_CString; + +typedef struct ddog_LibraryConfig { + enum ddog_LibraryConfigName name; + struct ddog_CString value; +} ddog_LibraryConfig; + +/** + * Holds the raw parts of a Rust Vec; it should only be created from Rust, + * never from C. + */ +typedef struct ddog_Vec_LibraryConfig { + const struct ddog_LibraryConfig *ptr; + uintptr_t len; + uintptr_t capacity; +} ddog_Vec_LibraryConfig; + +/** + * A generic result type for when an operation may fail, + * or may return in case of success. + */ +typedef enum ddog_Result_VecLibraryConfig_Tag { + DDOG_RESULT_VEC_LIBRARY_CONFIG_OK_VEC_LIBRARY_CONFIG, + DDOG_RESULT_VEC_LIBRARY_CONFIG_ERR_VEC_LIBRARY_CONFIG, +} ddog_Result_VecLibraryConfig_Tag; + +typedef struct ddog_Result_VecLibraryConfig { + ddog_Result_VecLibraryConfig_Tag tag; + union { + struct { + struct ddog_Vec_LibraryConfig ok; + }; + struct { + struct ddog_Error err; + }; + }; +} ddog_Result_VecLibraryConfig; + #ifdef __cplusplus extern "C" { #endif // __cplusplus @@ -1453,7 +1563,7 @@ struct ddog_Vec_Tag_PushResult ddog_Vec_Tag_push(struct ddog_Vec_Tag *vec, DDOG_CHECK_RETURN struct ddog_Vec_Tag_ParseResult ddog_Vec_Tag_parse(ddog_CharSlice string); #ifdef __cplusplus -} // extern "C" -#endif // __cplusplus +} // extern "C" +#endif // __cplusplus -#endif /* DDOG_COMMON_H */ +#endif /* DDOG_COMMON_H */ diff --git a/components-rs/crashtracker.h b/components-rs/crashtracker.h index f2c0d661c39..9385a8eb718 100644 --- a/components-rs/crashtracker.h +++ b/components-rs/crashtracker.h @@ -12,6 +12,13 @@ #include #include "common.h" +#if defined(_WIN32) && defined(_CRASHTRACKING_COLLECTOR) +#include +#include +#endif + + + typedef enum ddog_crasht_CrashInfoBuilder_NewResult_Tag { DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_OK, DDOG_CRASHT_CRASH_INFO_BUILDER_NEW_RESULT_ERR, @@ -330,6 +337,53 @@ struct ddog_VoidResult ddog_crasht_remove_trace_id(uint64_t id_high, uint64_t id_low, uintptr_t idx); +#if (defined(_CRASHTRACKING_COLLECTOR) && defined(_WIN32)) +/** + * Initialize the crash-tracking infrastructure. + * + * # Preconditions + * None. + * # Safety + * Crash-tracking functions are not reentrant. + * No other crash-handler functions should be called concurrently. + * # Atomicity + * This function is not atomic. A crash during its execution may lead to + * unexpected crash-handling behaviour. + */ +DDOG_CHECK_RETURN +bool ddog_crasht_init_windows(ddog_CharSlice module, + const struct ddog_Endpoint *endpoint, + struct ddog_crasht_Metadata metadata); +#endif + +#if (defined(_CRASHTRACKING_COLLECTOR) && defined(_WIN32)) +HRESULT OutOfProcessExceptionEventSignatureCallback(const void *_context, + const WER_RUNTIME_EXCEPTION_INFORMATION *_exception_information, + int32_t _index, + uint16_t *_name, + uint32_t *_name_size, + uint16_t *_value, + uint32_t *_value_size); +#endif + +#if (defined(_CRASHTRACKING_COLLECTOR) && defined(_WIN32)) +HRESULT OutOfProcessExceptionEventDebuggerLaunchCallback(const void *_context, + const WER_RUNTIME_EXCEPTION_INFORMATION *_exception_information, + BOOL *_is_custom_debugger, + uint16_t *_debugger_launch, + uint32_t *_debugger_launch_size, + BOOL *_is_debugger_auto_launch); +#endif + +#if (defined(_CRASHTRACKING_COLLECTOR) && defined(_WIN32)) +HRESULT OutOfProcessExceptionEventCallback(const void *context, + const WER_RUNTIME_EXCEPTION_INFORMATION *exception_information, + BOOL *_ownership_claimed, + uint16_t *_event_name, + uint32_t *_size, + uint32_t *_signature_count); +#endif + /** * # Safety * The `builder` can be null, but if non-null it must point to a Frame @@ -810,7 +864,7 @@ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_receiver_entry_point_unix_socket(ddog_CharSlice socket_path); #ifdef __cplusplus -} // extern "C" -#endif // __cplusplus +} // extern "C" +#endif // __cplusplus -#endif /* DDOG_CRASHTRACKER_H */ +#endif /* DDOG_CRASHTRACKER_H */ diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 36ec2d6eacb..5dc8b5df895 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -155,6 +155,8 @@ void ddtrace_drop_rust_string(char *input, uintptr_t len); struct ddog_Endpoint *ddtrace_parse_agent_url(ddog_CharSlice url); +ddog_Configurator *ddog_library_configurator_new_dummy(bool debug_logs, ddog_CharSlice language); + bool ddog_shall_log(enum ddog_Log category); void ddog_set_error_log_level(bool once); @@ -275,4 +277,4 @@ void ddog_sidecar_telemetry_add_span_metric_point_buffer(struct ddog_SidecarActi void ddog_sidecar_telemetry_add_integration_log_buffer(struct ddog_SidecarActionsBuffer *buffer, ddog_CharSlice log); -#endif /* DDTRACE_PHP_H */ +#endif /* DDTRACE_PHP_H */ diff --git a/components-rs/lib.rs b/components-rs/lib.rs index 2a4417d4179..704993ff0ff 100644 --- a/components-rs/lib.rs +++ b/components-rs/lib.rs @@ -11,8 +11,8 @@ use std::borrow::Cow; use std::ffi::c_char; use std::ptr::null_mut; use http::Uri; -use ddcommon::entity_id::{get_container_id, set_cgroup_file}; use http::uri::Scheme; +use ddcommon::entity_id::{get_container_id, set_cgroup_file}; use uuid::Uuid; pub use datadog_crashtracker_ffi::*; @@ -21,6 +21,7 @@ use ddcommon::{parse_uri, Endpoint}; use ddcommon_ffi::slice::AsBytes; pub use ddcommon_ffi::*; pub use ddtelemetry_ffi::*; +pub use datadog_library_config_ffi::*; #[no_mangle] #[allow(non_upper_case_globals)] @@ -83,3 +84,13 @@ pub unsafe extern "C" fn ddtrace_parse_agent_url(url: CharSlice) -> std::option: Box::new(Endpoint::from_url(url)) }) } + +// Hack: Without this, the PECL build of the tracer does not contain the ddog_library_* functions +// It works well without in the "normal" build +#[no_mangle] +pub extern "C" fn ddog_library_configurator_new_dummy( + debug_logs: bool, + language: CharSlice, +) -> Box { + datadog_library_config_ffi::ddog_library_configurator_new(debug_logs, language) +} diff --git a/components-rs/library-config.h b/components-rs/library-config.h new file mode 100644 index 00000000000..ea85a097f24 --- /dev/null +++ b/components-rs/library-config.h @@ -0,0 +1,61 @@ +// Copyright 2021-Present Datadog, Inc. https://www.datadoghq.com/ +// SPDX-License-Identifier: Apache-2.0 + + +#ifndef DDOG_LIBRARY_CONFIG_H +#define DDOG_LIBRARY_CONFIG_H + +#pragma once + +#include "common.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +struct ddog_Configurator *ddog_library_configurator_new(bool debug_logs, ddog_CharSlice language); + +void ddog_library_configurator_with_local_path(struct ddog_Configurator *c, + struct ddog_CStr local_path); + +void ddog_library_configurator_with_fleet_path(struct ddog_Configurator *c, + struct ddog_CStr local_path); + +void ddog_library_configurator_with_process_info(struct ddog_Configurator *c, + struct ddog_ProcessInfo p); + +void ddog_library_configurator_drop(struct ddog_Configurator*); + +struct ddog_Result_VecLibraryConfig ddog_library_configurator_get(const struct ddog_Configurator *configurator); + +/** + * Returns a static null-terminated string, containing the name of the environment variable + * associated with the library configuration + */ +struct ddog_CStr ddog_library_config_name_to_env(enum ddog_LibraryConfigName name); + +/** + * Returns a static null-terminated string, containing the name of the environment variable + * associated with the library configuration + */ +struct ddog_CStr ddog_library_config_source_to_string(enum ddog_LibraryConfigSource name); + +/** + * Returns a static null-terminated string with the path to the managed stable config yaml config + * file + */ +struct ddog_CStr ddog_library_config_fleet_stable_config_path(void); + +/** + * Returns a static null-terminated string with the path to the local stable config yaml config + * file + */ +struct ddog_CStr ddog_library_config_local_stable_config_path(void); + +void ddog_library_config_drop(struct ddog_Vec_LibraryConfig); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif /* DDOG_LIBRARY_CONFIG_H */ diff --git a/components-rs/live-debugger.h b/components-rs/live-debugger.h index bb3a67a8920..e35eeae2f74 100644 --- a/components-rs/live-debugger.h +++ b/components-rs/live-debugger.h @@ -136,4 +136,4 @@ void ddog_live_debugger_drop_sender(struct ddog_SenderHandle *sender); void ddog_live_debugger_join_sender(struct ddog_SenderHandle *sender); -#endif /* DDOG_LIVE_DEBUGGER_H */ +#endif /* DDOG_LIVE_DEBUGGER_H */ diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 02d5b77f4fd..af54f385aef 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -331,4 +331,4 @@ ddog_CharSlice ddog_get_agent_info_env(struct ddog_AgentInfoReader *reader, bool */ void ddog_drop_agent_info_reader(struct ddog_AgentInfoReader*); -#endif /* DDOG_SIDECAR_H */ +#endif /* DDOG_SIDECAR_H */ diff --git a/components-rs/sidecar.rs b/components-rs/sidecar.rs index 76110f40b5d..7f769caa767 100644 --- a/components-rs/sidecar.rs +++ b/components-rs/sidecar.rs @@ -166,7 +166,7 @@ pub extern "C" fn ddtrace_sidecar_reconnect( lazy_static! { - pub static ref SHM_LIMITER: Option = ShmLimiterMemory::open(&shm_limiter_path()).map_or_else(|e| { + pub static ref SHM_LIMITER: Option> = ShmLimiterMemory::open(&shm_limiter_path()).map_or_else(|e| { warn!("Attempt to use the SHM_LIMITER failed: {e:?}"); None }, Some); diff --git a/components-rs/telemetry.h b/components-rs/telemetry.h index 0677ad41d9c..45baddc9aab 100644 --- a/components-rs/telemetry.h +++ b/components-rs/telemetry.h @@ -285,4 +285,4 @@ void ddog_telemetry_handle_wait_for_shutdown_ms(struct ddog_TelemetryWorkerHandl */ void ddog_telemetry_handle_drop(struct ddog_TelemetryWorkerHandle *handle); -#endif /* DDOG_TELEMETRY_H */ +#endif /* DDOG_TELEMETRY_H */ diff --git a/config.m4 b/config.m4 index c4b7a1f39ca..ec3cf7df696 100644 --- a/config.m4 +++ b/config.m4 @@ -218,6 +218,7 @@ if test "$PHP_DDTRACE" != "no"; then zend_abstract_interface/config/config.c \ zend_abstract_interface/config/config_decode.c \ zend_abstract_interface/config/config_ini.c \ + zend_abstract_interface/config/config_stable_file.c \ zend_abstract_interface/config/config_runtime.c \ zend_abstract_interface/env/env.c \ zend_abstract_interface/exceptions/exceptions.c \ diff --git a/config.w32 b/config.w32 index c4fcb9e6068..8c9d0554ddc 100644 --- a/config.w32 +++ b/config.w32 @@ -93,7 +93,7 @@ if (PHP_DDTRACE != 'no') { ADD_SOURCES(configure_module_dirname + "/ext/priority_sampling", "priority_sampling.c", "ddtrace"); ADD_SOURCES(configure_module_dirname + "/ext/tracer_tag_propagation", "tracer_tag_propagation.c", "ddtrace"); - ADD_SOURCES(zai_dirname + "/config", "config.c config_decode.c config_ini.c config_runtime.c", "ddtrace"); + ADD_SOURCES(zai_dirname + "/config", "config.c config_decode.c config_ini.c config_stable_file.c config_runtime.c", "ddtrace"); ADD_SOURCES(zai_dirname + "/env", "env.c", "ddtrace"); ADD_SOURCES(zai_dirname + "/exceptions", "exceptions.c", "ddtrace"); ADD_SOURCES(zai_dirname + "/headers", "headers.c", "ddtrace"); @@ -168,7 +168,7 @@ if (PHP_DDTRACE != 'no') { ADD_FLAG("STATIC_EXT_OBJS", cargo_lib); ADD_FLAG("DEPS_DDTRACE", cargo_lib); - ADD_FLAG("LIBS_DDTRACE", "userenv.lib crypt32.lib Powrprof.lib Secur32.Lib ncrypt.lib ntdll.lib oleaut32.lib " + cargo_lib); + ADD_FLAG("LIBS_DDTRACE", "userenv.lib crypt32.lib Powrprof.lib Secur32.Lib ncrypt.lib ntdll.lib oleaut32.lib psapi.lib shlwapi.lib ws2_32.lib wsock32.lib RuntimeObject.lib SHCore.lib dbghelp.lib " + cargo_lib); var defpath = configure_module_dirname + "/ddtrace.def"; deffile = FSO.CreateTextFile(defpath, true); diff --git a/ddtrace.sym b/ddtrace.sym index ec6889facce..67107583e4d 100644 --- a/ddtrace.sym +++ b/ddtrace.sym @@ -20,3 +20,12 @@ ddog_daemon_entry_point ddog_set_rc_notify_fn ddog_remote_config_path ddog_remote_config_path_free +ddog_library_configurator_new +ddog_library_configurator_with_local_path +ddog_library_configurator_with_fleet_path +ddog_library_configurator_with_process_info +ddog_library_configurator_get +ddog_library_config_name_to_env +ddog_library_config_drop +ddog_Error_drop +ddog_library_configurator_drop diff --git a/docker-compose.linux.override.yml b/docker-compose.linux.override.yml index 69c656aea08..d812a417d2d 100644 --- a/docker-compose.linux.override.yml +++ b/docker-compose.linux.override.yml @@ -25,3 +25,4 @@ services: '8.1-buster': { <<: *linux_php_service } '8.2-buster': { <<: *linux_php_service } '8.3-buster': { <<: *linux_php_service } + '8.4-buster': { <<: *linux_php_service } diff --git a/libdatadog b/libdatadog index a43896a5d9d..3c62acf5a03 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit a43896a5d9d5cef3b868af21d968d5564448cc1f +Subproject commit 3c62acf5a03f6e46eb44ecbc0bc33a6351282b81 diff --git a/profiling/Cargo.toml b/profiling/Cargo.toml index f36078cf561..115c54d1653 100644 --- a/profiling/Cargo.toml +++ b/profiling/Cargo.toml @@ -22,6 +22,7 @@ crossbeam-channel = { version = "0.5", default-features = false, features = ["st datadog-alloc = { git = "https://github.com/DataDog/libdatadog", tag = "v15.1.0" } datadog-profiling = { git = "https://github.com/DataDog/libdatadog", tag = "v15.1.0" } ddcommon = { git = "https://github.com/DataDog/libdatadog", tag = "v15.1.0" } +datadog-library-config-ffi = { git = "https://github.com/DataDog/libdatadog", rev = "78f2dfbfadd4f589bc7aafb8c0334b7bd3f35e28" } # Must be kept in sync with other extensions using the zend_abstract_interface/config library env_logger = { version = "0.11", default-features = false } indexmap = { version = "2.2" } lazy_static = { version = "1.4" } diff --git a/profiling/build.rs b/profiling/build.rs index 6f7ef3581f1..8b7576870ed 100644 --- a/profiling/build.rs +++ b/profiling/build.rs @@ -88,9 +88,13 @@ const ZAI_H_FILES: &[&str] = &[ "../zend_abstract_interface/config/config.h", "../zend_abstract_interface/config/config_decode.h", "../zend_abstract_interface/config/config_ini.h", + "../zend_abstract_interface/config/config_stable_file.h", "../zend_abstract_interface/env/env.h", "../zend_abstract_interface/exceptions/exceptions.h", "../zend_abstract_interface/json/json.h", + + "../components-rs/common.h", + "../components-rs/library-config.h", ]; #[allow(clippy::too_many_arguments)] @@ -119,6 +123,7 @@ fn build_zend_php_ffis( let zai_c_files = [ "../zend_abstract_interface/config/config_decode.c", "../zend_abstract_interface/config/config_ini.c", + "../zend_abstract_interface/config/config_stable_file.c", "../zend_abstract_interface/config/config.c", "../zend_abstract_interface/config/config_runtime.c", "../zend_abstract_interface/env/env.c", @@ -170,7 +175,8 @@ fn build_zend_php_ffis( str::replace(php_config_includes, "-I", "") .split(' ') .map(Path::new) - .chain([Path::new("../zend_abstract_interface")]), + .chain([Path::new("../zend_abstract_interface")]) + .chain([Path::new("../")]), ) .flag_if_supported("-fuse-ld=lld") .flag_if_supported("-std=c11") @@ -244,6 +250,7 @@ fn generate_bindings(php_config_includes: &str, fibers: bool, zend_error_observe .header("src/php_ffi.h") .header("../ext/handlers_api.h") .clang_arg("-I../zend_abstract_interface") + .clang_arg("-I../") // Block some zend items that we'll provide manual definitions for .blocklist_item("zai_str_s") .blocklist_item("zai_str") diff --git a/profiling/src/bindings/mod.rs b/profiling/src/bindings/mod.rs index 2fee76570c8..ddeccc34c75 100644 --- a/profiling/src/bindings/mod.rs +++ b/profiling/src/bindings/mod.rs @@ -2,6 +2,8 @@ mod ffi; pub use ffi::*; +pub use datadog_library_config_ffi::*; + use libc::{c_char, c_int, c_uchar, c_uint, c_ushort, c_void, size_t}; use std::borrow::Cow; use std::ffi::CStr; diff --git a/tests/ext/library_config/default_config.phpt b/tests/ext/library_config/default_config.phpt new file mode 100644 index 00000000000..67257499240 --- /dev/null +++ b/tests/ext/library_config/default_config.phpt @@ -0,0 +1,19 @@ +--TEST-- +Check the library config files +--SKIPIF-- + +--ENV-- +_DD_TEST_LIBRARY_CONFIG_LOCAL_FILE=/tmp/test_c_default_config.yaml +_DD_TEST_LIBRARY_CONFIG_FLEET_FILE=/foo +--FILE-- + +--EXPECT-- +DD_SERVICE: service_default_config +DD_ENV: env_from_default_config diff --git a/tests/ext/library_config/default_config.yaml b/tests/ext/library_config/default_config.yaml new file mode 100644 index 00000000000..dad57680d87 --- /dev/null +++ b/tests/ext/library_config/default_config.yaml @@ -0,0 +1,4 @@ +apm_configuration_default: + DD_SERVICE: service_default_config + DD_ENV: env_from_default_config + DD_DYNAMIC_INSTRUMENTATION_ENABLED: true diff --git a/tests/ext/library_config/default_config_overloads_env.phpt b/tests/ext/library_config/default_config_overloads_env.phpt new file mode 100644 index 00000000000..07182f44755 --- /dev/null +++ b/tests/ext/library_config/default_config_overloads_env.phpt @@ -0,0 +1,21 @@ +--TEST-- +Check that the library config files overloads env vars +--SKIPIF-- + +--ENV-- +DD_SERVICE=service_from_env +DD_ENV=env_from_env +_DD_TEST_LIBRARY_CONFIG_LOCAL_FILE=/tmp/test_c_default_config_overloads_env.yaml +_DD_TEST_LIBRARY_CONFIG_FLEET_FILE=/foo +--FILE-- + +--EXPECT-- +DD_SERVICE: service_default_config +DD_ENV: env_from_default_config diff --git a/tests/ext/library_config/default_config_overloads_ini.phpt b/tests/ext/library_config/default_config_overloads_ini.phpt new file mode 100644 index 00000000000..2ffe7f630d7 --- /dev/null +++ b/tests/ext/library_config/default_config_overloads_ini.phpt @@ -0,0 +1,22 @@ +--TEST-- +Check that the library config files overloads ini settings +--SKIPIF-- + +--INI-- +datadog.service=service_from_ini +datadog.env=env_from_ini +--ENV-- +_DD_TEST_LIBRARY_CONFIG_LOCAL_FILE=/tmp/test_c_default_config_overloads_ini.yaml +_DD_TEST_LIBRARY_CONFIG_FLEET_FILE=/foo +--FILE-- + +--EXPECT-- +DD_SERVICE: service_default_config +DD_ENV: env_from_default_config diff --git a/tests/ext/library_config/system_config.phpt b/tests/ext/library_config/system_config.phpt new file mode 100644 index 00000000000..d5004b375f9 --- /dev/null +++ b/tests/ext/library_config/system_config.phpt @@ -0,0 +1,21 @@ +--TEST-- +Check that the library config files update the configuration +--SKIPIF-- + +--ENV-- +_DD_TEST_LIBRARY_CONFIG_LOCAL_FILE=/tmp/test_c_system_config.yaml +_DD_TEST_LIBRARY_CONFIG_FLEET_FILE=/foo +--FILE-- + +--EXPECT-- +DD_DYNAMIC_INSTRUMENTATION_ENABLED: true diff --git a/tests/ext/library_config/system_config_overloads_env.phpt b/tests/ext/library_config/system_config_overloads_env.phpt new file mode 100644 index 00000000000..732d148f508 --- /dev/null +++ b/tests/ext/library_config/system_config_overloads_env.phpt @@ -0,0 +1,22 @@ +--TEST-- +Check that the library config files overloads env vars for system config +--SKIPIF-- + +--ENV-- +DD_DYNAMIC_INSTRUMENTATION_ENABLED=false +_DD_TEST_LIBRARY_CONFIG_LOCAL_FILE=/tmp/test_c_system_config_overloads_env.yaml +_DD_TEST_LIBRARY_CONFIG_FLEET_FILE=/foo +--FILE-- + +--EXPECT-- +DD_DYNAMIC_INSTRUMENTATION_ENABLED: true diff --git a/tests/ext/library_config/system_config_overloads_ini.phpt b/tests/ext/library_config/system_config_overloads_ini.phpt new file mode 100644 index 00000000000..5190472f0b4 --- /dev/null +++ b/tests/ext/library_config/system_config_overloads_ini.phpt @@ -0,0 +1,23 @@ +--TEST-- +Check that the library config files overloads ini settings for system config +--SKIPIF-- + +--INI-- +datadog.dynamic_instrumentation.enabled=true +--ENV-- +_DD_TEST_LIBRARY_CONFIG_LOCAL_FILE=/tmp/test_c_system_config_overloads_ini.yaml +_DD_TEST_LIBRARY_CONFIG_FLEET_FILE=/foo +--FILE-- + +--EXPECT-- +DD_DYNAMIC_INSTRUMENTATION_ENABLED: true diff --git a/zend_abstract_interface/CMakeLists.txt b/zend_abstract_interface/CMakeLists.txt index f100b0285fd..ffcbcb0f499 100644 --- a/zend_abstract_interface/CMakeLists.txt +++ b/zend_abstract_interface/CMakeLists.txt @@ -18,11 +18,13 @@ if(${BUILD_ZAI_TESTING}) # the true minimum, but have tested 2.4 find_package(Catch2 2.4 REQUIRED) + include(components_rs.cmake) + #[[ This file takes a while to build, so we do it once here and every test executable can link to it to save time. ]] add_library(catch2_main catch2_main.cc) - target_link_libraries(catch2_main PUBLIC Catch2::Catch2) + target_link_libraries(catch2_main PUBLIC Catch2::Catch2 components_rs) target_compile_features(catch2_main PUBLIC cxx_std_11) include(Catch) diff --git a/zend_abstract_interface/components_rs.cmake b/zend_abstract_interface/components_rs.cmake new file mode 100644 index 00000000000..bfa75b3e9e8 --- /dev/null +++ b/zend_abstract_interface/components_rs.cmake @@ -0,0 +1,72 @@ +include(ExternalProject) + +set(CARGO_BUILD_CMD cargo build) +set(CARGO_BUILD_ENV "") # Initialize to empty + + +if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(CARGO_BUILD_CMD ${CARGO_BUILD_CMD} --release) +elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + set(CARGO_BUILD_CMD ${CARGO_BUILD_CMD} --release) + # set(CARGO_BUILD_ENV RUSTFLAGS=-C\ debuginfo=2) # FIXME: does not work +endif() + +set(LIBDATADOG_DIR "${CMAKE_SOURCE_DIR}/../libdatadog") +set(LIBDATADOG_STAMP_FILE "${CMAKE_BINARY_DIR}/libdatadog.stamp") +add_custom_target(libdatadog_stamp + COMMAND ${CMAKE_COMMAND} -E touch ${LIBDATADOG_STAMP_FILE} #XXX: use a script to find modifications + BYPRODUCT ${LIBDATADOG_STAMP_FILE} +) + +if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") +set(EXPORTS_FILE "${CMAKE_BINARY_DIR}/ddtrace_exports.version") +add_custom_target(ddtrace_exports + COMMAND bash -c "{ echo -e '{\\nglobal:'; sed 's/$/;/' '${CMAKE_SOURCE_DIR}'/../ddtrace.sym; echo -e 'local:\\n*;\\n};'; } > '${EXPORTS_FILE}'" + BYPRODUCT ${EXPORTS_FILE} + DEPENDS ${CMAKE_SOURCE_DIR}/../ddtrace.sym + VERBATIM +) +elseif(APPLE) +set(EXPORTS_FILE "${CMAKE_BINARY_DIR}/ddtrace_exports.sym") +add_custom_target(ddtrace_exports + COMMAND bash -c "sed 's/^/_/' '${CMAKE_SOURCE_DIR}'/../ddtrace.sym > '${EXPORTS_FILE}'" + BYPRODUCT ${EXPORTS_FILE} + DEPENDS ${CMAKE_SOURCE_DIR}/../ddtrace.sym + VERBATIM +) +endif() + +file(READ "${CMAKE_SOURCE_DIR}/../VERSION" VERSION_CONTENTS) +string(STRIP "${VERSION_CONTENTS}" PHP_DDTRACE_VERSION) +file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/gen_ddtrace/ext") +set(VERSION_H_PATH "${CMAKE_BINARY_DIR}/gen_ddtrace/ext/version.h") + +add_custom_command( + OUTPUT "${VERSION_H_PATH}" + COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --switch= --green "Updating version.h" + COMMAND ${CMAKE_COMMAND} -E remove -f "${VERSION_H_PATH}" + COMMAND ${CMAKE_COMMAND} -E touch "${VERSION_H_PATH}" + COMMAND printf "\\#ifndef PHP_DDTRACE_VERSION\\\\n\\#define PHP_DDTRACE_VERSION \"%s\"\\\\n\\#endif" "'\"${PHP_DDTRACE_VERSION}\"'" >> "${VERSION_H_PATH}" + DEPENDS "${CMAKE_SOURCE_DIR}/../VERSION" + COMMENT "Generating version.h" +) +add_custom_target(update_version_h ALL DEPENDS "${VERSION_H_PATH}") + +ExternalProject_Add(components_rs_proj + PREFIX ${CMAKE_BINARY_DIR}/components_rs + SOURCE_DIR ${CMAKE_SOURCE_DIR}/../components-rs + CONFIGURE_COMMAND "" + BUILD_COMMAND RUSTC_BOOTSTRAP=1 ${CARGO_BUILD_ENV} ${CARGO_BUILD_CMD} --target-dir=${CMAKE_BINARY_DIR}/components_rs + INSTALL_COMMAND "" + DEPENDS libdatadog_stamp + BUILD_IN_SOURCE TRUE +) + +add_library(components_rs STATIC IMPORTED) +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(CARGO_BUILD_LOCATION ${CMAKE_BINARY_DIR}/components_rs/debug) +else() + set(CARGO_BUILD_LOCATION ${CMAKE_BINARY_DIR}/components_rs/release) +endif() +set_property(TARGET components_rs PROPERTY IMPORTED_LOCATION ${CARGO_BUILD_LOCATION}/libddtrace_php.a) +add_dependencies(components_rs components_rs_proj) diff --git a/zend_abstract_interface/config/CMakeLists.txt b/zend_abstract_interface/config/CMakeLists.txt index a1cf7844ad9..5658abef534 100644 --- a/zend_abstract_interface/config/CMakeLists.txt +++ b/zend_abstract_interface/config/CMakeLists.txt @@ -1,7 +1,8 @@ -add_library(zai_config config.c config_decode.c config_ini.c config_runtime.c) +add_library(zai_config config.c config_decode.c config_ini.c config_stable_file.c config_runtime.c) target_include_directories( zai_config PUBLIC $ + $ $) target_compile_features(zai_config PUBLIC c_std_99) diff --git a/zend_abstract_interface/config/config.c b/zend_abstract_interface/config/config.c index 6f57b0ed965..c20dd98a551 100644 --- a/zend_abstract_interface/config/config.c +++ b/zend_abstract_interface/config/config.c @@ -44,7 +44,11 @@ static void zai_config_find_and_set_value(zai_config_memoized_entry *memoized, z int16_t name_index = 0; for (; name_index < memoized->names_count; name_index++) { zai_str name = {.len = memoized->names[name_index].len, .ptr = memoized->names[name_index].ptr}; - if (zai_config_get_env_value(name, buf)) { + // Configuration from the stable config file takes precedence over environment values + if (zai_config_stable_file_get_value(name, buf)) { + zai_config_process_env(memoized, buf, &value); + break; + } else if (zai_config_get_env_value(name, buf)) { zai_config_process_env(memoized, buf, &value); break; } @@ -134,6 +138,7 @@ bool zai_config_minit(zai_config_entry entries[], size_t entries_count, zai_conf if (!zai_json_setup_bindings()) return false; zai_config_entries_init(entries, entries_count); zai_config_ini_minit(env_to_ini, module_number); + zai_config_stable_file_minit(); return true; } @@ -149,6 +154,7 @@ void zai_config_mshutdown(void) { zend_hash_destroy(&zai_config_name_map); } zai_config_ini_mshutdown(); + zai_config_stable_file_mshutdown(); } void zai_config_runtime_config_ctor(void); @@ -228,6 +234,7 @@ void zai_config_first_time_rinit(bool in_request) { void zai_config_rinit(void) { zai_config_runtime_config_ctor(); zai_config_ini_rinit(); + zai_config_stable_file_rinit(); } void zai_config_rshutdown(void) { zai_config_runtime_config_dtor(); } diff --git a/zend_abstract_interface/config/config.h b/zend_abstract_interface/config/config.h index accbbb3988c..9e2e310dad2 100644 --- a/zend_abstract_interface/config/config.h +++ b/zend_abstract_interface/config/config.h @@ -16,6 +16,7 @@ typedef struct zai_config_memoized_entry_s zai_config_memoized_entry; typedef uint16_t zai_config_id; #include "config_ini.h" +#include "config_stable_file.h" #define ZAI_CONFIG_ENTRIES_COUNT_MAX 255 #define ZAI_CONFIG_NAMES_COUNT_MAX 4 diff --git a/zend_abstract_interface/config/config_stable_file.c b/zend_abstract_interface/config/config_stable_file.c new file mode 100644 index 00000000000..b90ed977639 --- /dev/null +++ b/zend_abstract_interface/config/config_stable_file.c @@ -0,0 +1,149 @@ +#include "../tsrmls_cache.h" + +#include + +#include "config.h" +#include "config_stable_file.h" + +#define RESOLVE_SYMBOL(name) \ + _##name = (void *)DL_FETCH_SYMBOL(ddtrace_me->handle, #name); \ + if (!_##name) { \ + _ddog_library_configurator_new = NULL; \ + return; \ + } + +static struct ddog_Configurator *(*_ddog_library_configurator_new)(bool debug_logs, ddog_CharSlice language); +static void (*_ddog_library_configurator_with_local_path)(struct ddog_Configurator *c, struct ddog_CStr local_path); +static void (*_ddog_library_configurator_with_fleet_path)(struct ddog_Configurator *c, struct ddog_CStr local_path); +static void (*_ddog_library_configurator_with_process_info)(struct ddog_Configurator *c, struct ddog_ProcessInfo p); +static struct ddog_Result_VecLibraryConfig (*_ddog_library_configurator_get)(const struct ddog_Configurator *configurator); +static struct ddog_CStr (*_ddog_library_config_name_to_env)(enum ddog_LibraryConfigName name); +static void (*_ddog_library_config_drop)(struct ddog_Vec_LibraryConfig); +static void (*_ddog_Error_drop)(struct ddog_Error *error); +static void (*_ddog_library_configurator_drop)(struct ddog_Configurator*); + +HashTable *config_values = NULL; + +bool zai_config_stable_file_get_value(zai_str name, zai_env_buffer buf) { + if (!config_values) { + return false; + } + + zval *value = zend_hash_str_find(config_values, name.ptr, name.len); + if (value) { + strcpy(buf.ptr, Z_STRVAL_P(value)); + return true; + } + + return false; +} + +static void zai_config_stable_file_apply_config(int stage) { + if (!config_values) { + return; + } + + zend_string *key; + zval *value; + ZEND_HASH_FOREACH_STR_KEY_VAL(config_values, key, value) { + zai_config_id config_id; + zai_str config_name = {.ptr = ZSTR_VAL(key), .len = ZSTR_LEN(key)}; + if (!zai_config_get_id_by_name(config_name, &config_id)) { + continue; + } + + zai_config_memoized_entry *memoized = &zai_config_memoized_entries[config_id]; + zend_ini_entry *entry = memoized->ini_entries[0]; + zend_alter_ini_entry_ex(entry->name, Z_STR_P(value), PHP_INI_USER, stage, 0); + } ZEND_HASH_FOREACH_END(); +} + +void zai_config_stable_file_minit(void) { + // Resolve symbols at runtime, as they are not part of the AppSec extension + // but are provided by ddtrace if it is loaded. + if (!_ddog_library_configurator_new) { + zend_module_entry *ddtrace_me = NULL; + ddtrace_me = zend_hash_str_find_ptr(&module_registry, ZEND_STRL("ddtrace")); + if (!ddtrace_me) { + return; + } + + RESOLVE_SYMBOL(ddog_library_configurator_new); + RESOLVE_SYMBOL(ddog_library_configurator_with_local_path); + RESOLVE_SYMBOL(ddog_library_configurator_with_fleet_path); + RESOLVE_SYMBOL(ddog_library_configurator_with_process_info); + RESOLVE_SYMBOL(ddog_library_configurator_get); + RESOLVE_SYMBOL(ddog_library_config_name_to_env); + RESOLVE_SYMBOL(ddog_library_config_drop); + RESOLVE_SYMBOL(ddog_Error_drop); + RESOLVE_SYMBOL(ddog_library_configurator_drop); + } + + ddog_Configurator *configurator = _ddog_library_configurator_new(false, DDOG_CHARSLICE_C("php")); + + char *file = getenv("_DD_TEST_LIBRARY_CONFIG_LOCAL_FILE"); + if (file) { + ddog_CStr path = {.ptr = file, .length = strlen(file)}; + _ddog_library_configurator_with_local_path(configurator, path); + } + file = getenv("_DD_TEST_LIBRARY_CONFIG_FLEET_FILE"); + if (file) { + ddog_CStr path = {.ptr = file, .length = strlen(file)}; + _ddog_library_configurator_with_fleet_path(configurator, path); + } + + // FIXME: without the call to ddog_library_configurator_with_process_info, + // some AppSec's integration tests fails +#define DDOG_SLICE_CHARSLICE(arr) \ + ((ddog_Slice_CharSlice){.ptr = arr, .len = sizeof(arr) / sizeof(arr[0])}) + + ddog_CharSlice args[] = { + DDOG_CHARSLICE_C("/usr/bin/php"), + }; + + ddog_CharSlice envp[] = { + DDOG_CHARSLICE_C("FOO=BAR"), + }; + ddog_ProcessInfo process_info = { + .args = DDOG_SLICE_CHARSLICE(args), + .envp = DDOG_SLICE_CHARSLICE(envp), + .language = DDOG_CHARSLICE_C("php") + }; + _ddog_library_configurator_with_process_info(configurator, process_info); + // + + ddog_Result_VecLibraryConfig config_result = _ddog_library_configurator_get(configurator); + if (config_result.tag == DDOG_RESULT_VEC_LIBRARY_CONFIG_OK_VEC_LIBRARY_CONFIG) { + config_values = pemalloc(sizeof(HashTable), 1); + zend_hash_init(config_values, 8, NULL, ZVAL_INTERNAL_PTR_DTOR, 1); + + ddog_Vec_LibraryConfig configs = config_result.ok; + for (uintptr_t i = 0; i < configs.len; i++) { + const ddog_LibraryConfig *cfg = &configs.ptr[i]; + ddog_CStr env_name = _ddog_library_config_name_to_env(cfg->name); + + zend_string *value = zend_string_init(cfg->value.ptr, cfg->value.length, 1); + zval zv; + ZVAL_STR(&zv, value); + zend_hash_str_add(config_values, env_name.ptr, env_name.length, &zv); + } + _ddog_library_config_drop(configs); + } else { + ddog_Error err = config_result.err; + _ddog_Error_drop(&err); + } + + _ddog_library_configurator_drop(configurator); +} + +void zai_config_stable_file_mshutdown(void) { + if (config_values) { + zend_hash_destroy(config_values); + pefree(config_values, 1); + config_values = NULL; + } +} + +void zai_config_stable_file_rinit(void) { + zai_config_stable_file_apply_config(PHP_INI_STAGE_RUNTIME); +} diff --git a/zend_abstract_interface/config/config_stable_file.h b/zend_abstract_interface/config/config_stable_file.h new file mode 100644 index 00000000000..c1c59a31b85 --- /dev/null +++ b/zend_abstract_interface/config/config_stable_file.h @@ -0,0 +1,13 @@ +#ifndef ZAI_CONFIG_STABLE_FILE_H +#define ZAI_CONFIG_STABLE_FILE_H + +#include +#include + +#endif // ZAI_CONFIG_STABLE_FILE_H + +void zai_config_stable_file_minit(void); +void zai_config_stable_file_mshutdown(void); + +void zai_config_stable_file_rinit(void); +bool zai_config_stable_file_get_value(zai_str name, zai_env_buffer buf);