Skip to content

ci: enforce FFI panic containment - #2588

Open
colin-higgins wants to merge 1 commit into
mainfrom
dd/ci/ffi-panic-lint-20260928
Open

colin-higgins wants to merge 1 commit into
mainfrom
dd/ci/ffi-panic-lint-20260928

Conversation

@colin-higgins

Copy link
Copy Markdown
Member

What does this PR do?

Adds a pull-request-only static-analysis guard that rejects newly introduced public C FFI entry points unless their bodies acknowledge panic containment.

Changes

  • Detects newly added pub extern "C" fn and pub unsafe extern "C" fn signatures from zero-context Git diffs, including multiline signatures.
  • Brace-matches each new function body and accepts direct catch_unwind, the common FFI wrapper macros, and the explicit _no_catch variants.
  • Supports a justified // allow(ffi-panic-boundary): <justification> escape hatch while rejecting empty justifications.
  • Runs as a blocking, PR-only lint job with GitHub Actions annotations and documents local usage.

Motivation

Panics that cross C ABI boundaries can abort embedding runtimes. Existing Clippy panic lints only detect explicit panic constructs and cannot catch panics originating in called library code, so recent review findings have repeatedly identified uncontained new FFI entry points. A diff-scoped guard prevents new regressions without imposing failures on intentional pre-existing accessors.

Additional Notes

The check is additive and does not modify any existing FFI function or runtime behavior. The _no_catch wrappers count as an explicit acknowledgement that panic behavior was separately considered.

How to test the change?

Run cargo test -p ffi-panic-lint from .github/actions. The suite uses temporary Git repositories to prove that an uncontained new entry point fails, wrapped and justified entry points pass, unchanged legacy entry points are ignored, and an empty escape-hatch justification fails. Also run cargo clippy -p ffi-panic-lint --all-targets -- -D warnings and cargo fmt -p ffi-panic-lint -- --check.


PR by Bits - View session in Datadog

Comment @DataDog to request changes

Co-authored-by: colin-higgins <1801443+colin-higgins@users.noreply.github.com>
@colin-higgins
colin-higgins requested a review from a team as a code owner September 29, 2026 14:34
@datadog-datadog-prod-us1-2

datadog-datadog-prod-us1-2 Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

View session in Datadog

Bits Code status: ✅ Done

CI Auto-fix: Disabled | Enable

Comment @DataDog to request changes

@colin-higgins

Copy link
Copy Markdown
Member Author

Unsure what this bridge AR branch is... Closing while I investigate the agent choices of target branch.

@github-actions

Copy link
Copy Markdown
Contributor

🔒 Cargo Deny Results

⚠️ 55 issue(s) found, showing only errors (advisories, bans, sources)

📦 bin_tests - 1 error(s)

Show output
error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:228:1
    │
228 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── libdd-common v7.0.0
      │       ├── bin_tests v0.1.0
      │       ├── libdd-capabilities-impl v6.0.0
      │       │   ├── libdd-crashtracker v3.0.0
      │       │   │   └── bin_tests v0.1.0 (*)
      │       │   ├── libdd-shared-runtime v5.0.0
      │       │   │   └── libdd-telemetry v9.0.0
      │       │   │       └── libdd-crashtracker v3.0.0 (*)
      │       │   └── (dev) libdd-telemetry v9.0.0 (*)
      │       ├── (build) libdd-crashtracker v3.0.0 (*)
      │       ├── libdd-shared-runtime v5.0.0 (*)
      │       └── libdd-telemetry v9.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── libdd-common v7.0.0 (*)
      └── tokio-rustls v0.26.0
          └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 build_common - ✅ No issues

📦 datadog-sidecar-ffi - 4 error(s)

Show output
error[unmaintained]: Bincode is unmaintained
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:35:1
   │
35 │ bincode 1.3.3 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ unmaintained advisory detected
   │
   ├ ID: RUSTSEC-2025-0141
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2025-0141
   ├ Due to a doxxing and harassment incident, the bincode team has taken the decision to cease development permanently.
     
     The team considers version 1.3.3 a complete version of bincode that is not in need of any updates.
     
     ## Alternatives to consider
     
     * [wincode](https://crates.io/crates/wincode)
     * [postcard](https://crates.io/crates/postcard)
     * [bitcode](https://crates.io/crates/bitcode)
     * [rkyv](https://crates.io/crates/rkyv)
   ├ Announcement: https://git.sr.ht/~stygianentity/bincode/tree/v3.0/item/README.md
   ├ Solution: No safe upgrade is available!
   ├ bincode v1.3.3
     ├── datadog-sidecar v0.0.1
     │   └── datadog-sidecar-ffi v0.0.1
     ├── (dev) libdd-ffe v2.0.0
     │   └── datadog-sidecar v0.0.1 (*)
     └── libdd-ipc v2.0.0
         ├── datadog-sidecar v0.0.1 (*)
         └── datadog-sidecar-ffi v0.0.1 (*)

error[unsound]: Potential use-after-free due to lack of panic safety in `LruCache::pop()`
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:232:1
    │
232 │ lru 0.16.4 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ unsound advisory detected
    │
    ├ ID: RUSTSEC-2026-0253
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0253
    ├ `LruCache::pop()` in `lru` was not panic-safe. If the `Drop` implementation of a stored key panics during `pop()`, `self.detach()` is never called, leaving dangling pointers in the internal doubly-linked list.
      
      A subsequent cache operation that triggers eviction can then dereference these dangling pointers:
      - The node is freed from the map, but remains linked in the LRU list due to the skipped `detach()` call
      - When a new insertion causes eviction, the LRU traversal encounters the dangling pointer
      - This results in a write to already-freed memory during the eviction process
      
      ## Impact
      
      - **CWE-416 (Use-After-Free):** memory corruption when subsequent cache operations access freed node pointers in the linked list
      - **CWE-415 (Double Free):** potential heap corruption when the same memory is freed multiple times
      
      Both types of undefined behavior can be invoked in safe Rust, but only if unwinding panics are enabled and `std::panic::catch_unwind` is used with key types that have potentially-panicking `Drop` implementations.
      
      ## Fix
      
      Fixed in `lru` 0.18.2 by detaching the node from the linked list before freeing it and dropping the key ([lru-rs#238](https://github.com/jeromefroe/lru-rs/pull/238)).
    ├ Announcement: https://github.com/jeromefroe/lru-rs/pull/238
    ├ Solution: Upgrade to >=0.18.2 (try `cargo update -p lru`)
    ├ lru v0.16.4
      └── libdd-ffe v2.0.0
          └── datadog-sidecar v0.0.1
              └── datadog-sidecar-ffi v0.0.1

error[unmaintained]: paste - no longer maintained
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:273:1
    │
273 │ paste 1.0.15 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ unmaintained advisory detected
    │
    ├ ID: RUSTSEC-2024-0436
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2024-0436
    ├ The creator of the crate `paste` has stated in the [`README.md`](https://github.com/dtolnay/paste/blob/master/README.md) 
      that this project is not longer maintained as well as archived the repository
      
      ## Possible Alternative(s)
      
      - [`pastey`]: a fork of paste and is aimed to be a drop-in replacement with additional features for paste crate
      - [`with_builtin_macros`]: crate providing a [superset of `paste`'s functionality including general `macro_rules!` eager expansions](https://docs.rs/with_builtin_macros/0.1.0/with_builtin_macros/macro.with_eager_expansions.html)  and `concat!`/`concat_idents!` macros
      
      [`pastey`]: https://crates.io/crates/pastey
      [`with_builtin_macros`]: https://crates.io/crates/with_builtin_macros
    ├ Announcement: https://github.com/dtolnay/paste
    ├ Solution: No safe upgrade is available!
    ├ paste v1.0.15
      ├── libdd-libunwind-sys v1.0.3
      │   └── libdd-crashtracker v3.0.0
      │       ├── datadog-sidecar v0.0.1
      │       │   └── datadog-sidecar-ffi v0.0.1
      │       ├── datadog-sidecar-ffi v0.0.1 (*)
      │       └── libdd-crashtracker-ffi v44.0.0
      │           ├── datadog-sidecar v0.0.1 (*)
      │           └── datadog-sidecar-ffi v0.0.1 (*)
      ├── libdd-telemetry-ffi v44.0.0
      │   └── datadog-sidecar-ffi v0.0.1 (*)
      └── rmp v0.8.14
          ├── libdd-trace-utils v13.0.0
          │   ├── (dev) datadog-sidecar v0.0.1 (*)
          │   ├── (dev) datadog-sidecar-ffi v0.0.1 (*)
          │   ├── libdd-data-pipeline v11.0.0
          │   │   ├── datadog-sidecar v0.0.1 (*)
          │   │   └── libdd-live-debugger v1.0.0
          │   │       ├── datadog-sidecar v0.0.1 (*)
          │   │       └── datadog-sidecar-ffi v0.0.1 (*)
          │   ├── libdd-data-pipeline-core v2.0.0
          │   │   └── libdd-data-pipeline v11.0.0 (*)
          │   ├── libdd-trace-obfuscation v9.0.0
          │   │   ├── libdd-data-pipeline v11.0.0 (*)
          │   │   ├── libdd-data-pipeline-core v2.0.0 (*)
          │   │   └── libdd-trace-stats v10.0.0
          │   │       ├── datadog-sidecar v0.0.1 (*)
          │   │       ├── libdd-data-pipeline v11.0.0 (*)
          │   │       └── libdd-ipc v2.0.0
          │   │           ├── datadog-sidecar v0.0.1 (*)
          │   │           └── datadog-sidecar-ffi v0.0.1 (*)
          │   ├── libdd-trace-stats v10.0.0 (*)
          │   └── (dev) libdd-trace-utils v13.0.0 (*)
          ├── rmp-serde v1.3.0
          │   ├── datadog-sidecar-ffi v0.0.1 (*)
          │   ├── libdd-data-pipeline v11.0.0 (*)
          │   ├── (dev) libdd-tinybytes v1.1.4
          │   │   ├── datadog-sidecar v0.0.1 (*)
          │   │   ├── datadog-sidecar-ffi v0.0.1 (*)
          │   │   ├── libdd-data-pipeline v11.0.0 (*)
          │   │   ├── (dev) libdd-data-pipeline-core v2.0.0 (*)
          │   │   ├── libdd-ipc v2.0.0 (*)
          │   │   ├── (dev) libdd-tinybytes v1.1.4 (*)
          │   │   ├── (dev) libdd-trace-obfuscation v9.0.0 (*)
          │   │   └── libdd-trace-utils v13.0.0 (*)
          │   ├── libdd-trace-stats v10.0.0 (*)
          │   └── libdd-trace-utils v13.0.0 (*)
          └── rmpv v1.3.0
              └── libdd-trace-utils v13.0.0 (*)

error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:330:1
    │
330 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── libdd-common v7.0.0
      │       ├── datadog-sidecar v0.0.1
      │       │   └── datadog-sidecar-ffi v0.0.1
      │       ├── datadog-sidecar-ffi v0.0.1 (*)
      │       ├── libdd-capabilities-impl v6.0.0
      │       │   ├── datadog-sidecar v0.0.1 (*)
      │       │   ├── libdd-crashtracker v3.0.0
      │       │   │   ├── datadog-sidecar v0.0.1 (*)
      │       │   │   ├── datadog-sidecar-ffi v0.0.1 (*)
      │       │   │   └── libdd-crashtracker-ffi v44.0.0
      │       │   │       ├── datadog-sidecar v0.0.1 (*)
      │       │   │       └── datadog-sidecar-ffi v0.0.1 (*)
      │       │   ├── libdd-data-pipeline v11.0.0
      │       │   │   ├── datadog-sidecar v0.0.1 (*)
      │       │   │   └── libdd-live-debugger v1.0.0
      │       │   │       ├── datadog-sidecar v0.0.1 (*)
      │       │   │       └── datadog-sidecar-ffi v0.0.1 (*)
      │       │   ├── (dev) libdd-ffe v2.0.0
      │       │   │   └── datadog-sidecar v0.0.1 (*)
      │       │   ├── libdd-live-debugger v1.0.0 (*)
      │       │   ├── libdd-remote-config v6.0.0
      │       │   │   ├── (dev) datadog-sidecar v0.0.1 (*)
      │       │   │   ├── datadog-sidecar-ffi v0.0.1 (*)
      │       │   │   ├── libdd-ffe v2.0.0 (*)
      │       │   │   ├── libdd-live-debugger v1.0.0 (*)
      │       │   │   └── (dev) libdd-remote-config v6.0.0 (*)
      │       │   ├── libdd-shared-runtime v5.0.0
      │       │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   ├── libdd-dogstatsd-client v7.0.0
      │       │   │   │   ├── datadog-sidecar v0.0.1 (*)
      │       │   │   │   ├── datadog-sidecar-ffi v0.0.1 (*)
      │       │   │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │   └── libdd-trace-stats v10.0.0
      │       │   │   │       ├── datadog-sidecar v0.0.1 (*)
      │       │   │   │       ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │       └── libdd-ipc v2.0.0
      │       │   │   │           ├── datadog-sidecar v0.0.1 (*)
      │       │   │   │           └── datadog-sidecar-ffi v0.0.1 (*)
      │       │   │   ├── libdd-telemetry v9.0.0
      │       │   │   │   ├── datadog-sidecar v0.0.1 (*)
      │       │   │   │   ├── datadog-sidecar-ffi v0.0.1 (*)
      │       │   │   │   ├── libdd-crashtracker v3.0.0 (*)
      │       │   │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │   ├── libdd-telemetry-ffi v44.0.0
      │       │   │   │   │   └── datadog-sidecar-ffi v0.0.1 (*)
      │       │   │   │   └── libdd-trace-stats v10.0.0 (*)
      │       │   │   └── libdd-trace-stats v10.0.0 (*)
      │       │   ├── (dev) libdd-telemetry v9.0.0 (*)
      │       │   ├── libdd-telemetry-ffi v44.0.0 (*)
      │       │   ├── libdd-trace-stats v10.0.0 (*)
      │       │   └── libdd-trace-utils v13.0.0
      │       │       ├── (dev) datadog-sidecar v0.0.1 (*)
      │       │       ├── (dev) datadog-sidecar-ffi v0.0.1 (*)
      │       │       ├── libdd-data-pipeline v11.0.0 (*)
      │       │       ├── libdd-data-pipeline-core v2.0.0
      │       │       │   └── libdd-data-pipeline v11.0.0 (*)
      │       │       ├── libdd-trace-obfuscation v9.0.0
      │       │       │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │       │   ├── libdd-data-pipeline-core v2.0.0 (*)
      │       │       │   └── libdd-trace-stats v10.0.0 (*)
      │       │       ├── libdd-trace-stats v10.0.0 (*)
      │       │       └── (dev) libdd-trace-utils v13.0.0 (*)
      │       ├── libdd-common-ffi v44.0.0
      │       │   ├── datadog-sidecar v0.0.1 (*)
      │       │   ├── datadog-sidecar-ffi v0.0.1 (*)
      │       │   ├── libdd-crashtracker-ffi v44.0.0 (*)
      │       │   └── libdd-telemetry-ffi v44.0.0 (*)
      │       ├── (build) libdd-crashtracker v3.0.0 (*)
      │       ├── libdd-crashtracker-ffi v44.0.0 (*)
      │       ├── libdd-data-pipeline v11.0.0 (*)
      │       ├── libdd-data-pipeline-core v2.0.0 (*)
      │       ├── libdd-dogstatsd-client v7.0.0 (*)
      │       ├── libdd-ffe v2.0.0 (*)
      │       ├── libdd-ipc v2.0.0 (*)
      │       ├── libdd-live-debugger v1.0.0 (*)
      │       ├── libdd-remote-config v6.0.0 (*)
      │       ├── libdd-shared-runtime v5.0.0 (*)
      │       ├── libdd-telemetry v9.0.0 (*)
      │       ├── libdd-telemetry-ffi v44.0.0 (*)
      │       ├── libdd-trace-obfuscation v9.0.0 (*)
      │       ├── libdd-trace-stats v10.0.0 (*)
      │       └── libdd-trace-utils v13.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── libdd-common v7.0.0 (*)
      └── tokio-rustls v0.26.0
          └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 datadog-sidecar - 3 error(s)

Show output
error[unmaintained]: Bincode is unmaintained
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:35:1
   │
35 │ bincode 1.3.3 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ unmaintained advisory detected
   │
   ├ ID: RUSTSEC-2025-0141
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2025-0141
   ├ Due to a doxxing and harassment incident, the bincode team has taken the decision to cease development permanently.
     
     The team considers version 1.3.3 a complete version of bincode that is not in need of any updates.
     
     ## Alternatives to consider
     
     * [wincode](https://crates.io/crates/wincode)
     * [postcard](https://crates.io/crates/postcard)
     * [bitcode](https://crates.io/crates/bitcode)
     * [rkyv](https://crates.io/crates/rkyv)
   ├ Announcement: https://git.sr.ht/~stygianentity/bincode/tree/v3.0/item/README.md
   ├ Solution: No safe upgrade is available!
   ├ bincode v1.3.3
     ├── datadog-sidecar v0.0.1
     ├── (dev) libdd-ffe v2.0.0
     │   └── datadog-sidecar v0.0.1 (*)
     └── libdd-ipc v2.0.0
         └── datadog-sidecar v0.0.1 (*)

error[unsound]: Potential use-after-free due to lack of panic safety in `LruCache::pop()`
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:230:1
    │
230 │ lru 0.16.4 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ unsound advisory detected
    │
    ├ ID: RUSTSEC-2026-0253
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0253
    ├ `LruCache::pop()` in `lru` was not panic-safe. If the `Drop` implementation of a stored key panics during `pop()`, `self.detach()` is never called, leaving dangling pointers in the internal doubly-linked list.
      
      A subsequent cache operation that triggers eviction can then dereference these dangling pointers:
      - The node is freed from the map, but remains linked in the LRU list due to the skipped `detach()` call
      - When a new insertion causes eviction, the LRU traversal encounters the dangling pointer
      - This results in a write to already-freed memory during the eviction process
      
      ## Impact
      
      - **CWE-416 (Use-After-Free):** memory corruption when subsequent cache operations access freed node pointers in the linked list
      - **CWE-415 (Double Free):** potential heap corruption when the same memory is freed multiple times
      
      Both types of undefined behavior can be invoked in safe Rust, but only if unwinding panics are enabled and `std::panic::catch_unwind` is used with key types that have potentially-panicking `Drop` implementations.
      
      ## Fix
      
      Fixed in `lru` 0.18.2 by detaching the node from the linked list before freeing it and dropping the key ([lru-rs#238](https://github.com/jeromefroe/lru-rs/pull/238)).
    ├ Announcement: https://github.com/jeromefroe/lru-rs/pull/238
    ├ Solution: Upgrade to >=0.18.2 (try `cargo update -p lru`)
    ├ lru v0.16.4
      └── libdd-ffe v2.0.0
          └── datadog-sidecar v0.0.1

error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:328:1
    │
328 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── libdd-common v7.0.0
      │       ├── datadog-sidecar v0.0.1
      │       ├── libdd-capabilities-impl v6.0.0
      │       │   ├── datadog-sidecar v0.0.1 (*)
      │       │   ├── libdd-crashtracker v3.0.0
      │       │   │   ├── datadog-sidecar v0.0.1 (*)
      │       │   │   └── libdd-crashtracker-ffi v44.0.0
      │       │   │       └── datadog-sidecar v0.0.1 (*)
      │       │   ├── libdd-data-pipeline v11.0.0
      │       │   │   ├── datadog-sidecar v0.0.1 (*)
      │       │   │   └── libdd-live-debugger v1.0.0
      │       │   │       └── datadog-sidecar v0.0.1 (*)
      │       │   ├── (dev) libdd-ffe v2.0.0
      │       │   │   └── datadog-sidecar v0.0.1 (*)
      │       │   ├── libdd-live-debugger v1.0.0 (*)
      │       │   ├── libdd-remote-config v6.0.0
      │       │   │   ├── (dev) datadog-sidecar v0.0.1 (*)
      │       │   │   ├── libdd-ffe v2.0.0 (*)
      │       │   │   ├── libdd-live-debugger v1.0.0 (*)
      │       │   │   └── (dev) libdd-remote-config v6.0.0 (*)
      │       │   ├── libdd-shared-runtime v5.0.0
      │       │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   ├── libdd-dogstatsd-client v7.0.0
      │       │   │   │   ├── datadog-sidecar v0.0.1 (*)
      │       │   │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │   └── libdd-trace-stats v10.0.0
      │       │   │   │       ├── datadog-sidecar v0.0.1 (*)
      │       │   │   │       ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │       └── libdd-ipc v2.0.0
      │       │   │   │           └── datadog-sidecar v0.0.1 (*)
      │       │   │   ├── libdd-telemetry v9.0.0
      │       │   │   │   ├── datadog-sidecar v0.0.1 (*)
      │       │   │   │   ├── libdd-crashtracker v3.0.0 (*)
      │       │   │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │   └── libdd-trace-stats v10.0.0 (*)
      │       │   │   └── libdd-trace-stats v10.0.0 (*)
      │       │   ├── (dev) libdd-telemetry v9.0.0 (*)
      │       │   ├── libdd-trace-stats v10.0.0 (*)
      │       │   └── libdd-trace-utils v13.0.0
      │       │       ├── (dev) datadog-sidecar v0.0.1 (*)
      │       │       ├── libdd-data-pipeline v11.0.0 (*)
      │       │       ├── libdd-data-pipeline-core v2.0.0
      │       │       │   └── libdd-data-pipeline v11.0.0 (*)
      │       │       ├── libdd-trace-obfuscation v9.0.0
      │       │       │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │       │   ├── libdd-data-pipeline-core v2.0.0 (*)
      │       │       │   └── libdd-trace-stats v10.0.0 (*)
      │       │       ├── libdd-trace-stats v10.0.0 (*)
      │       │       └── (dev) libdd-trace-utils v13.0.0 (*)
      │       ├── libdd-common-ffi v44.0.0
      │       │   ├── datadog-sidecar v0.0.1 (*)
      │       │   └── libdd-crashtracker-ffi v44.0.0 (*)
      │       ├── (build) libdd-crashtracker v3.0.0 (*)
      │       ├── libdd-crashtracker-ffi v44.0.0 (*)
      │       ├── libdd-data-pipeline v11.0.0 (*)
      │       ├── libdd-data-pipeline-core v2.0.0 (*)
      │       ├── libdd-dogstatsd-client v7.0.0 (*)
      │       ├── libdd-ffe v2.0.0 (*)
      │       ├── libdd-ipc v2.0.0 (*)
      │       ├── libdd-live-debugger v1.0.0 (*)
      │       ├── libdd-remote-config v6.0.0 (*)
      │       ├── libdd-shared-runtime v5.0.0 (*)
      │       ├── libdd-telemetry v9.0.0 (*)
      │       ├── libdd-trace-obfuscation v9.0.0 (*)
      │       ├── libdd-trace-stats v10.0.0 (*)
      │       └── libdd-trace-utils v13.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── libdd-common v7.0.0 (*)
      └── tokio-rustls v0.26.0
          └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-agent-client - 3 error(s)

Show output
error[vulnerability]: NSEC3 closest-encloser proof validation enters unbounded loop on cross-zone responses
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:84:1
   │
84 │ hickory-proto 0.25.2 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
   │
   ├ ID: RUSTSEC-2026-0118
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0118
   ├ The NSEC3 closest-encloser proof validation in `hickory-proto`'s
     `DnssecDnsHandle` walks from the QNAME up to the SOA owner name, building a
     list of candidate encloser names. The iterator used assumes the
     QNAME is a descendant of the SOA owner, terminating only when the current
     candidate equals the SOA name. When the SOA in a response's authority section
     is not an ancestor of the QNAME, the loop stalls at the DNS root and never
     terminates, repeatedly calling `Name::base_name()` and pushing newly allocated
     `Name` and hashed-name entries into the candidate `Vec`.
     
     The bug is reachable by any caller of `DnssecDnsHandle` — including the
     resolver, recursor, and client — when built with the `dnssec-ring` or
     `dnssec-aws-lc-rs` feature and configured to perform DNSSEC validation. It is
     triggered while validating a NoData or NXDomain response whose authority
     section contains an SOA record from a zone other than an ancestor of the
     QNAME, on a code path that requires NSEC3 closest-encloser proof. In practice
     this can be reached through an insecure CNAME chain that crosses zone
     boundaries into a DNSSEC-signed zone returning NoData, but the minimum
     condition is just a mismatched SOA owner on a response requiring NSEC3
     validation.
     
     A `debug_assert_ne!(name, Name::root())` guards the loop body, so debug builds
     abort with a panic on the first iteration past the root. Release builds
     compile the assertion out and run the loop unbounded, allocating until the
     process exhausts available memory (OOM). A reachable upstream attacker who
     can return such a response can therefore crash a debug-built validator or
     exhaust memory on a release-built one.
     
     The affected code was migrated from `hickory-proto` to `hickory-net` as part of
     the 0.26.0 release. The `hickory-proto` 0.26.x release no longer offers
     `DnssecDnsHandle` and so we recommend all affected users update to `hickory-net`
     0.26.1 when the implementation of that type is required.
   ├ Announcement: https://github.com/hickory-dns/hickory-dns/security/advisories/GHSA-3v94-mw7p-v465
   ├ Solution: No safe upgrade is available!
   ├ hickory-proto v0.25.2
     └── hickory-resolver v0.25.2
         └── reqwest v0.13.2
             └── libdd-http-client v2.0.0
                 └── libdd-agent-client v44.0.0

error[vulnerability]: CPU exhaustion during message encoding due to O(n²) name compression
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:84:1
   │
84 │ hickory-proto 0.25.2 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
   │
   ├ ID: RUSTSEC-2026-0119
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0119
   ├ During message encoding, `hickory-proto`'s `BinEncoder` stores pointers to
     labels that are candidates for name compression in a `Vec<(usize, Vec<u8>)>`.
     The name compression logic then searches for matches with a linear scan.
     
     A malicious message with many records can both introduce many candidate labels,
     and invoke this linear scan many times. This can amplify CPU exhaustion in DoS
     attacks.
     
     This is similar to
     [CVE-2024-8508](https://www.nlnetlabs.nl/downloads/unbound/CVE-2024-8508.txt).
     
     We recommend all affected users update to `hickory-proto` 0.26.1 for the fix.
   ├ Announcement: https://github.com/hickory-dns/hickory-dns/security/advisories/GHSA-q2qq-hmj6-3wpp
   ├ Solution: Upgrade to >=0.26.1 (try `cargo update -p hickory-proto`)
   ├ hickory-proto v0.25.2
     └── hickory-resolver v0.25.2
         └── reqwest v0.13.2
             └── libdd-http-client v2.0.0
                 └── libdd-agent-client v44.0.0

error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:172:1
    │
172 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── reqwest v0.13.2
      │       └── libdd-http-client v2.0.0
      │           └── libdd-agent-client v44.0.0
      ├── (dev) libdd-agent-client v44.0.0 (*)
      ├── (dev) libdd-http-client v2.0.0 (*)
      ├── reqwest v0.13.2 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── reqwest v0.13.2 (*)
      └── tokio-rustls v0.26.0
          ├── hyper-rustls v0.27.7 (*)
          └── reqwest v0.13.2 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-alloc - ✅ No issues

📦 libdd-capabilities-impl - 1 error(s)

Show output
error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:84:1
   │
84 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
   │
   ├ ID: RUSTSEC-2026-0285
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
   ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
     when they followed a key-changing message in the same record. For example,
     a plaintext `EncryptedExtensions` message packed into the same record as the
     `ServerHello` was accepted.
     
     RFC 8446 section 5.1 requires that handshake messages do not span key changes,
     and that implementations terminate the connection with an "unexpected_message"
     alert if they do.
     
     The handshake transcript is still authenticated, so a network-position attacker
     cannot use this to alter or complete a handshake; the practical effect is that
     a peer could send handshake messages that should be encrypted in plaintext
     without rustls rejecting the connection.
     
     This is functionally the same bug as Go's
     [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
   ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
   ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
   ├ rustls v0.23.37
     ├── hyper-rustls v0.27.7
     │   └── libdd-common v7.0.0
     │       └── libdd-capabilities-impl v6.0.0
     ├── libdd-common v7.0.0 (*)
     ├── rustls-platform-verifier v0.6.2
     │   └── libdd-common v7.0.0 (*)
     └── tokio-rustls v0.26.0
         └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-capabilities - ✅ No issues

📦 libdd-common - 3 error(s)

Show output
error[vulnerability]: NSEC3 closest-encloser proof validation enters unbounded loop on cross-zone responses
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:66:1
   │
66 │ hickory-proto 0.25.2 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
   │
   ├ ID: RUSTSEC-2026-0118
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0118
   ├ The NSEC3 closest-encloser proof validation in `hickory-proto`'s
     `DnssecDnsHandle` walks from the QNAME up to the SOA owner name, building a
     list of candidate encloser names. The iterator used assumes the
     QNAME is a descendant of the SOA owner, terminating only when the current
     candidate equals the SOA name. When the SOA in a response's authority section
     is not an ancestor of the QNAME, the loop stalls at the DNS root and never
     terminates, repeatedly calling `Name::base_name()` and pushing newly allocated
     `Name` and hashed-name entries into the candidate `Vec`.
     
     The bug is reachable by any caller of `DnssecDnsHandle` — including the
     resolver, recursor, and client — when built with the `dnssec-ring` or
     `dnssec-aws-lc-rs` feature and configured to perform DNSSEC validation. It is
     triggered while validating a NoData or NXDomain response whose authority
     section contains an SOA record from a zone other than an ancestor of the
     QNAME, on a code path that requires NSEC3 closest-encloser proof. In practice
     this can be reached through an insecure CNAME chain that crosses zone
     boundaries into a DNSSEC-signed zone returning NoData, but the minimum
     condition is just a mismatched SOA owner on a response requiring NSEC3
     validation.
     
     A `debug_assert_ne!(name, Name::root())` guards the loop body, so debug builds
     abort with a panic on the first iteration past the root. Release builds
     compile the assertion out and run the loop unbounded, allocating until the
     process exhausts available memory (OOM). A reachable upstream attacker who
     can return such a response can therefore crash a debug-built validator or
     exhaust memory on a release-built one.
     
     The affected code was migrated from `hickory-proto` to `hickory-net` as part of
     the 0.26.0 release. The `hickory-proto` 0.26.x release no longer offers
     `DnssecDnsHandle` and so we recommend all affected users update to `hickory-net`
     0.26.1 when the implementation of that type is required.
   ├ Announcement: https://github.com/hickory-dns/hickory-dns/security/advisories/GHSA-3v94-mw7p-v465
   ├ Solution: No safe upgrade is available!
   ├ hickory-proto v0.25.2
     └── hickory-resolver v0.25.2
         └── reqwest v0.13.2
             └── libdd-common v7.0.0

error[vulnerability]: CPU exhaustion during message encoding due to O(n²) name compression
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:66:1
   │
66 │ hickory-proto 0.25.2 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
   │
   ├ ID: RUSTSEC-2026-0119
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0119
   ├ During message encoding, `hickory-proto`'s `BinEncoder` stores pointers to
     labels that are candidates for name compression in a `Vec<(usize, Vec<u8>)>`.
     The name compression logic then searches for matches with a linear scan.
     
     A malicious message with many records can both introduce many candidate labels,
     and invoke this linear scan many times. This can amplify CPU exhaustion in DoS
     attacks.
     
     This is similar to
     [CVE-2024-8508](https://www.nlnetlabs.nl/downloads/unbound/CVE-2024-8508.txt).
     
     We recommend all affected users update to `hickory-proto` 0.26.1 for the fix.
   ├ Announcement: https://github.com/hickory-dns/hickory-dns/security/advisories/GHSA-q2qq-hmj6-3wpp
   ├ Solution: Upgrade to >=0.26.1 (try `cargo update -p hickory-proto`)
   ├ hickory-proto v0.25.2
     └── hickory-resolver v0.25.2
         └── reqwest v0.13.2
             └── libdd-common v7.0.0

error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:149:1
    │
149 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   ├── libdd-common v7.0.0
      │   └── reqwest v0.13.2
      │       └── libdd-common v7.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── reqwest v0.13.2 (*)
      ├── rustls-platform-verifier v0.6.2
      │   ├── libdd-common v7.0.0 (*)
      │   └── reqwest v0.13.2 (*)
      └── tokio-rustls v0.26.0
          ├── hyper-rustls v0.27.7 (*)
          └── reqwest v0.13.2 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-crashtracker-ffi - 1 error(s)

Show output
error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:244:1
    │
244 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── libdd-common v7.0.0
      │       ├── libdd-capabilities-impl v6.0.0
      │       │   ├── libdd-crashtracker v3.0.0
      │       │   │   └── libdd-crashtracker-ffi v44.0.0
      │       │   ├── libdd-shared-runtime v5.0.0
      │       │   │   └── libdd-telemetry v9.0.0
      │       │   │       └── libdd-crashtracker v3.0.0 (*)
      │       │   └── (dev) libdd-telemetry v9.0.0 (*)
      │       ├── libdd-common-ffi v44.0.0
      │       │   └── libdd-crashtracker-ffi v44.0.0 (*)
      │       ├── (build) libdd-crashtracker v3.0.0 (*)
      │       ├── libdd-crashtracker-ffi v44.0.0 (*)
      │       ├── libdd-shared-runtime v5.0.0 (*)
      │       └── libdd-telemetry v9.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── libdd-common v7.0.0 (*)
      └── tokio-rustls v0.26.0
          └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-crashtracker - 1 error(s)

Show output
error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:222:1
    │
222 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── libdd-common v7.0.0
      │       ├── libdd-capabilities-impl v6.0.0
      │       │   ├── libdd-crashtracker v3.0.0
      │       │   ├── libdd-shared-runtime v5.0.0
      │       │   │   └── libdd-telemetry v9.0.0
      │       │   │       └── libdd-crashtracker v3.0.0 (*)
      │       │   └── (dev) libdd-telemetry v9.0.0 (*)
      │       ├── (build) libdd-crashtracker v3.0.0 (*)
      │       ├── libdd-shared-runtime v5.0.0 (*)
      │       └── libdd-telemetry v9.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── libdd-common v7.0.0 (*)
      └── tokio-rustls v0.26.0
          └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-data-pipeline-core - 1 error(s)

Show output
error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:215:1
    │
215 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── libdd-common v7.0.0
      │       ├── libdd-capabilities-impl v6.0.0
      │       │   └── libdd-trace-utils v13.0.0
      │       │       ├── libdd-data-pipeline-core v2.0.0
      │       │       ├── libdd-trace-obfuscation v9.0.0
      │       │       │   └── libdd-data-pipeline-core v2.0.0 (*)
      │       │       └── (dev) libdd-trace-utils v13.0.0 (*)
      │       ├── libdd-data-pipeline-core v2.0.0 (*)
      │       ├── libdd-trace-obfuscation v9.0.0 (*)
      │       └── libdd-trace-utils v13.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── libdd-common v7.0.0 (*)
      └── tokio-rustls v0.26.0
          └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-data-pipeline-ffi - 1 error(s)

Show output
error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:250:1
    │
250 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── libdd-common v7.0.0
      │       ├── libdd-capabilities-impl v6.0.0
      │       │   ├── libdd-data-pipeline v11.0.0
      │       │   │   └── libdd-data-pipeline-ffi v44.0.0
      │       │   ├── libdd-data-pipeline-ffi v44.0.0 (*)
      │       │   ├── libdd-shared-runtime v5.0.0
      │       │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   ├── libdd-data-pipeline-ffi v44.0.0 (*)
      │       │   │   ├── libdd-dogstatsd-client v7.0.0
      │       │   │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │   └── libdd-trace-stats v10.0.0
      │       │   │   │       └── libdd-data-pipeline v11.0.0 (*)
      │       │   │   ├── libdd-telemetry v9.0.0
      │       │   │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │   └── libdd-trace-stats v10.0.0 (*)
      │       │   │   └── libdd-trace-stats v10.0.0 (*)
      │       │   ├── (dev) libdd-telemetry v9.0.0 (*)
      │       │   ├── libdd-trace-stats v10.0.0 (*)
      │       │   └── libdd-trace-utils v13.0.0
      │       │       ├── libdd-data-pipeline v11.0.0 (*)
      │       │       ├── libdd-data-pipeline-core v2.0.0
      │       │       │   └── libdd-data-pipeline v11.0.0 (*)
      │       │       ├── (dev) libdd-data-pipeline-ffi v44.0.0 (*)
      │       │       ├── libdd-trace-obfuscation v9.0.0
      │       │       │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │       │   ├── libdd-data-pipeline-core v2.0.0 (*)
      │       │       │   ├── libdd-data-pipeline-ffi v44.0.0 (*)
      │       │       │   └── libdd-trace-stats v10.0.0 (*)
      │       │       ├── libdd-trace-stats v10.0.0 (*)
      │       │       └── (dev) libdd-trace-utils v13.0.0 (*)
      │       ├── libdd-common-ffi v44.0.0
      │       │   └── libdd-data-pipeline-ffi v44.0.0 (*)
      │       ├── libdd-data-pipeline v11.0.0 (*)
      │       ├── libdd-data-pipeline-core v2.0.0 (*)
      │       ├── libdd-dogstatsd-client v7.0.0 (*)
      │       ├── libdd-shared-runtime v5.0.0 (*)
      │       ├── libdd-telemetry v9.0.0 (*)
      │       ├── libdd-trace-obfuscation v9.0.0 (*)
      │       ├── libdd-trace-stats v10.0.0 (*)
      │       └── libdd-trace-utils v13.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── libdd-common v7.0.0 (*)
      └── tokio-rustls v0.26.0
          └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-data-pipeline - 1 error(s)

Show output
error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:242:1
    │
242 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── libdd-common v7.0.0
      │       ├── libdd-capabilities-impl v6.0.0
      │       │   ├── libdd-data-pipeline v11.0.0
      │       │   ├── libdd-shared-runtime v5.0.0
      │       │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   ├── libdd-dogstatsd-client v7.0.0
      │       │   │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │   └── libdd-trace-stats v10.0.0
      │       │   │   │       └── libdd-data-pipeline v11.0.0 (*)
      │       │   │   ├── libdd-telemetry v9.0.0
      │       │   │   │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │   │   │   └── libdd-trace-stats v10.0.0 (*)
      │       │   │   └── libdd-trace-stats v10.0.0 (*)
      │       │   ├── (dev) libdd-telemetry v9.0.0 (*)
      │       │   ├── libdd-trace-stats v10.0.0 (*)
      │       │   └── libdd-trace-utils v13.0.0
      │       │       ├── libdd-data-pipeline v11.0.0 (*)
      │       │       ├── libdd-data-pipeline-core v2.0.0
      │       │       │   └── libdd-data-pipeline v11.0.0 (*)
      │       │       ├── libdd-trace-obfuscation v9.0.0
      │       │       │   ├── libdd-data-pipeline v11.0.0 (*)
      │       │       │   ├── libdd-data-pipeline-core v2.0.0 (*)
      │       │       │   └── libdd-trace-stats v10.0.0 (*)
      │       │       ├── libdd-trace-stats v10.0.0 (*)
      │       │       └── (dev) libdd-trace-utils v13.0.0 (*)
      │       ├── libdd-data-pipeline v11.0.0 (*)
      │       ├── libdd-data-pipeline-core v2.0.0 (*)
      │       ├── libdd-dogstatsd-client v7.0.0 (*)
      │       ├── libdd-shared-runtime v5.0.0 (*)
      │       ├── libdd-telemetry v9.0.0 (*)
      │       ├── libdd-trace-obfuscation v9.0.0 (*)
      │       ├── libdd-trace-stats v10.0.0 (*)
      │       └── libdd-trace-utils v13.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── libdd-common v7.0.0 (*)
      └── tokio-rustls v0.26.0
          └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-ddsketch - ✅ No issues

📦 libdd-dogstatsd-client - 1 error(s)

Show output
error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:92:1
   │
92 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
   │
   ├ ID: RUSTSEC-2026-0285
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
   ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
     when they followed a key-changing message in the same record. For example,
     a plaintext `EncryptedExtensions` message packed into the same record as the
     `ServerHello` was accepted.
     
     RFC 8446 section 5.1 requires that handshake messages do not span key changes,
     and that implementations terminate the connection with an "unexpected_message"
     alert if they do.
     
     The handshake transcript is still authenticated, so a network-position attacker
     cannot use this to alter or complete a handshake; the practical effect is that
     a peer could send handshake messages that should be encrypted in plaintext
     without rustls rejecting the connection.
     
     This is functionally the same bug as Go's
     [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
   ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
   ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
   ├ rustls v0.23.37
     ├── hyper-rustls v0.27.7
     │   └── libdd-common v7.0.0
     │       ├── libdd-capabilities-impl v6.0.0
     │       │   └── libdd-shared-runtime v5.0.0
     │       │       └── libdd-dogstatsd-client v7.0.0
     │       ├── libdd-dogstatsd-client v7.0.0 (*)
     │       └── libdd-shared-runtime v5.0.0 (*)
     ├── libdd-common v7.0.0 (*)
     ├── rustls-platform-verifier v0.6.2
     │   └── libdd-common v7.0.0 (*)
     └── tokio-rustls v0.26.0
         └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-ffe - 3 error(s)

Show output
error[unmaintained]: Bincode is unmaintained
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:21:1
   │
21 │ bincode 1.3.3 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ unmaintained advisory detected
   │
   ├ ID: RUSTSEC-2025-0141
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2025-0141
   ├ Due to a doxxing and harassment incident, the bincode team has taken the decision to cease development permanently.
     
     The team considers version 1.3.3 a complete version of bincode that is not in need of any updates.
     
     ## Alternatives to consider
     
     * [wincode](https://crates.io/crates/wincode)
     * [postcard](https://crates.io/crates/postcard)
     * [bitcode](https://crates.io/crates/bitcode)
     * [rkyv](https://crates.io/crates/rkyv)
   ├ Announcement: https://git.sr.ht/~stygianentity/bincode/tree/v3.0/item/README.md
   ├ Solution: No safe upgrade is available!
   ├ bincode v1.3.3
     └── (dev) libdd-ffe v2.0.0

error[unsound]: Potential use-after-free due to lack of panic safety in `LruCache::pop()`
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:127:1
    │
127 │ lru 0.16.4 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ unsound advisory detected
    │
    ├ ID: RUSTSEC-2026-0253
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0253
    ├ `LruCache::pop()` in `lru` was not panic-safe. If the `Drop` implementation of a stored key panics during `pop()`, `self.detach()` is never called, leaving dangling pointers in the internal doubly-linked list.
      
      A subsequent cache operation that triggers eviction can then dereference these dangling pointers:
      - The node is freed from the map, but remains linked in the LRU list due to the skipped `detach()` call
      - When a new insertion causes eviction, the LRU traversal encounters the dangling pointer
      - This results in a write to already-freed memory during the eviction process
      
      ## Impact
      
      - **CWE-416 (Use-After-Free):** memory corruption when subsequent cache operations access freed node pointers in the linked list
      - **CWE-415 (Double Free):** potential heap corruption when the same memory is freed multiple times
      
      Both types of undefined behavior can be invoked in safe Rust, but only if unwinding panics are enabled and `std::panic::catch_unwind` is used with key types that have potentially-panicking `Drop` implementations.
      
      ## Fix
      
      Fixed in `lru` 0.18.2 by detaching the node from the linked list before freeing it and dropping the key ([lru-rs#238](https://github.com/jeromefroe/lru-rs/pull/238)).
    ├ Announcement: https://github.com/jeromefroe/lru-rs/pull/238
    ├ Solution: Upgrade to >=0.18.2 (try `cargo update -p lru`)
    ├ lru v0.16.4
      └── libdd-ffe v2.0.0

error[vulnerability]: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
    ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:169:1
    │
169 │ rustls 0.23.37 registry+https://github.com/rust-lang/crates.io-index
    │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
    │
    ├ ID: RUSTSEC-2026-0285
    ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0285
    ├ Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
      when they followed a key-changing message in the same record. For example,
      a plaintext `EncryptedExtensions` message packed into the same record as the
      `ServerHello` was accepted.
      
      RFC 8446 section 5.1 requires that handshake messages do not span key changes,
      and that implementations terminate the connection with an "unexpected_message"
      alert if they do.
      
      The handshake transcript is still authenticated, so a network-position attacker
      cannot use this to alter or complete a handshake; the practical effect is that
      a peer could send handshake messages that should be encrypted in plaintext
      without rustls rejecting the connection.
      
      This is functionally the same bug as Go's
      [GO-2026-4340](https://pkg.go.dev/vuln/GO-2026-4340) (CVE-2025-61730).
    ├ Announcement: https://github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
    ├ Solution: Upgrade to >=0.23.45 (try `cargo update -p rustls`)
    ├ rustls v0.23.37
      ├── hyper-rustls v0.27.7
      │   └── libdd-common v7.0.0
      │       ├── libdd-capabilities-impl v6.0.0
      │       │   ├── (dev) libdd-ffe v2.0.0
      │       │   └── libdd-remote-config v6.0.0
      │       │       ├── libdd-ffe v2.0.0 (*)
      │       │       └── (dev) libdd-remote-config v6.0.0 (*)
      │       ├── libdd-ffe v2.0.0 (*)
      │       └── libdd-remote-config v6.0.0 (*)
      ├── libdd-common v7.0.0 (*)
      ├── rustls-platform-verifier v0.6.2
      │   └── libdd-common v7.0.0 (*)
      └── tokio-rustls v0.26.0
          └── hyper-rustls v0.27.7 (*)

advisories FAILED, bans ok, sources ok

📦 libdd-gotter - ✅ No issues

📦 libdd-http-client - 3 error(s)

Show output
error[vulnerability]: NSEC3 closest-encloser proof validation enters unbounded loop on cross-zone responses
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:71:1
   │
71 │ hickory-proto 0.25.2 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vulnerability detected
   │
   ├ ID: RUSTSEC-2026-0118
   ├ Advisory: https://rustsec.org/advisories/RUSTSEC-2026-0118
   ├ The NSEC3 closest-encloser proof validation in `hickory-proto`'s
     `DnssecDnsHandle` walks from the QNAME up to the SOA owner name, building a
     list of candidate encloser names. The iterator used assumes the
     QNAME is a descendant of the SOA owner, terminating only when the current
     candidate equals the SOA name. When the SOA in a response's authority section
     is not an ancestor of the QNAME, the loop stalls at the DNS root and never
     terminates, repeatedly calling `Name::base_name()` and pushing newly allocated
     `Name` and hashed-name entries into the candidate `Vec`.
     
     The bug is reachable by any caller of `DnssecDnsHandle` — including the
     resolver, recursor, and client — when built with the `dnssec-ring` or
     `dnssec-aws-lc-rs` feature and configured to perform DNSSEC validation. It is
     triggered while validating a NoData or NXDomain response whose authority
     section contains an SOA record from a zone other than an ancestor of the
     QNAME, on a code path that requires NSEC3 closest-encloser proof. In practice
     this can be reached through an insecure CNAME chain that crosses zone
     boundaries into a DNSSEC-signed zone returning NoData, but the minimum
     condition is just a mismatched SOA owner on a response requiring NSEC3
     validation.
     
     A `debug_assert_ne!(name, Name::root())` guards the loop body, so debug builds
     abort with a panic on the first iteration past the root. Release builds
     compile the assertion out and run the loop unbounded, allocating until the
     process exhausts available memory (OOM). A reachable upstream attacker who
     can return such a response can therefore crash a debug-built validator or
     exhaust memory on a release-built one.
     
     The affected code was migrated from `hickory-proto` to `hickory-net` as part of
     the 0.26.0 release. The `hickory-proto` 0.26.x release no longer offers
     `DnssecDnsHandle` and so we recommend all affected users update to `hickory-net`
     0.26.1 when the implementation of that type is required.
   ├ Announcement: https://github.com/hickory-dns/hickory-dns/security/advisories/GHSA-3v94-mw7p-v465
   ├ Solution: No safe upgrade is available!
   ├ hickory-proto v0.25.2
     └── hickory-resolver v0.25.2
         └── reqwest v0.13.2
             └── libdd-http-client v2.0.0

error[vulnerability]: CPU exhaustion during message encoding due to O(n²) name compression
   ┌─ /home/runner/work/libdatadog/libdatadog/Cargo.lock:71:1
   │
71 │ hickory-proto 0.25.2 registry+https://github.com/rust-lang/crates.io-index
   │ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ security vu...*[Comment body truncated]*

@github-actions

github-actions Bot commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

📚 Documentation Check Results

⚠️ 28606 documentation warning(s) found

📦 bin_tests - 1232 warning(s)

📦 build_common - 3 warning(s)

📦 datadog-sidecar-ffi - 3232 warning(s)

📦 datadog-sidecar - 2943 warning(s)

📦 libdd-agent-client - 124 warning(s)

📦 libdd-alloc - 3 warning(s)

📦 libdd-capabilities-impl - 210 warning(s)

📦 libdd-capabilities - 36 warning(s)

📦 libdd-common - 169 warning(s)

📦 libdd-crashtracker-ffi - 1292 warning(s)

📦 libdd-crashtracker - 1121 warning(s)

📦 libdd-data-pipeline-core - 812 warning(s)

📦 libdd-data-pipeline-ffi - 1414 warning(s)

📦 libdd-data-pipeline - 1303 warning(s)

📦 libdd-ddsketch - 8 warning(s)

📦 libdd-dogstatsd-client - 169 warning(s)

📦 libdd-ffe - 387 warning(s)

📦 libdd-gotter - 7 warning(s)

📦 libdd-http-client - ✅ No warnings

📦 libdd-ipc - 1030 warning(s)

📦 libdd-library-config-ffi - 578 warning(s)

📦 libdd-library-config - 265 warning(s)

📦 libdd-live-debugger-ffi - 1959 warning(s)

📦 libdd-live-debugger - 1666 warning(s)

📦 libdd-otel-thread-ctx-ffi - 280 warning(s)

📦 libdd-otel-thread-ctx - 1 warning(s)

📦 libdd-profiling-ffi - 770 warning(s)

📦 libdd-profiling-heap-allocator - 49 warning(s)

📦 libdd-profiling-heap-gotter - 56 warning(s)

📦 libdd-profiling-heap-sampler - 49 warning(s)

📦 libdd-profiling - 649 warning(s)

📦 libdd-remote-config - 682 warning(s)

📦 libdd-sampling - 136 warning(s)

📦 libdd-shared-runtime-ffi - 221 warning(s)

📦 libdd-shared-runtime - 214 warning(s)

📦 libdd-telemetry-ffi - 735 warning(s)

📦 libdd-telemetry - 571 warning(s)

📦 libdd-tinybytes - 7 warning(s)

📦 libdd-trace-normalization - 244 warning(s)

📦 libdd-trace-obfuscation - 860 warning(s)

📦 libdd-trace-protobuf - 227 warning(s)

📦 libdd-trace-stats - 924 warning(s)

📦 libdd-trace-utils - 776 warning(s)

📦 libdd-tracer-flare - 1035 warning(s)

📦 spawn_worker - 74 warning(s)

📦 symbolizer-ffi - 5 warning(s)

📦 test_spawn_from_lib - 78 warning(s)


Updated: 2026-09-29 14:50:37 UTC | Commit: 7caeaa1 | missing-docs job results

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c55667b2f7

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +17 to +18
"wrap_with_ffi_result_no_catch!",
"wrap_with_void_ffi_result_no_catch!",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Reject no-catch wrappers as containment

When a newly added FFI entry point directly uses either _no_catch wrapper and its body panics, this lint accepts it even though those wrappers only convert returned errors and do not call catch_unwind (libdd-common-ffi/src/utils.rs). The panic can therefore escape the extern "C" boundary and abort the embedding process while the new CI guard reports success; reserve the markers for wrappers that actually catch unwinds, and require the documented justified waiver for genuinely panic-free entry points.

AGENTS.md reference: AGENTS.md:L93-L93

Useful? React with 👍 / 👎.

Comment thread scripts/semver-level.sh
Comment on lines +374 to +375
elif (( ${#v[@]} == 2 )); then
v=( "${v[0]}" "$(( 10#${v[1]} + 1 ))" 0 )

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Normalize partial > bounds before comparing floors

Cargo interprets >1.2 as greater than 1.2.0, so it still accepts 1.2.1; this branch instead converts it to a floor of 1.3.0. Consequently, changing a dependency requirement from >=1.2.1 to the equivalent >1.2 is incorrectly reported as a raised floor, causing the semver workflow to require a minor release (and potentially reject an otherwise valid patch-type PR). Normalize omitted components first and increment the patch component for exclusive bounds.

Useful? React with 👍 / 👎.

@colin-higgins colin-higgins reopened this Sep 29, 2026
@colin-higgins
colin-higgins changed the base branch from BridgeAR/2026-09-08-thiserror-v2 to main September 29, 2026 14:45
@datadog-datadog-prod-us1-2

datadog-datadog-prod-us1-2 Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Pipelines  Tests

❌ Errors

Your PR has failed checks. Please review the issues below and take necessary action before merging.

🚦 3 Pipeline jobs failed

Metadata, docs and deps | cargo-metadata — 🔧 Needs a code fix, caused by this PR

View more details · View in GitHub Actions

semver-check | validate — 🔧 Needs a code fix, caused by this PR

View more details · View in GitHub Actions

Required checks pass | allchecks

View more details · View in GitHub Actions

ℹ️ Info

No other issues found (see more)

🧪 All tests passed
❄️ No new flaky tests detected

🎯 Code Coverage (details)
• Patch Coverage: 92.26%
• Overall Coverage: 78.64% (-0.29%)

Useful? React with 👍 / 👎

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: c55667b | Docs | View more details | Give us feedback!

@dd-octo-sts

dd-octo-sts Bot commented Sep 29, 2026

Copy link
Copy Markdown
Contributor

Artifact Size Benchmark Report

aarch64-alpine-linux-musl
Artifact Baseline Commit Change
/aarch64-alpine-linux-musl/lib/libdatadog_profiling.a 96.05 MB 96.05 MB 0% (0 B) 👌
/aarch64-alpine-linux-musl/lib/libdatadog_profiling.so 9.02 MB 9.02 MB 0% (0 B) 👌
aarch64-unknown-linux-gnu
Artifact Baseline Commit Change
/aarch64-unknown-linux-gnu/lib/libdatadog_profiling.a 107.43 MB 107.43 MB 0% (0 B) 👌
/aarch64-unknown-linux-gnu/lib/libdatadog_profiling.so 12.19 MB 12.19 MB 0% (0 B) 👌
libdatadog-x64-windows
Artifact Baseline Commit Change
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.dll 29.08 MB 29.08 MB 0% (0 B) 👌
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.lib 96.08 KB 96.08 KB 0% (0 B) 👌
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.pdb 191.51 MB 191.55 MB +.01% (+32.00 KB) 🔍
/libdatadog-x64-windows/debug/static/datadog_profiling_ffi.lib 815.49 MB 815.49 MB 0% (0 B) 👌
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.dll 9.72 MB 9.72 MB 0% (0 B) 👌
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.lib 96.08 KB 96.08 KB 0% (0 B) 👌
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.pdb 27.51 MB 27.51 MB 0% (0 B) 👌
/libdatadog-x64-windows/release/static/datadog_profiling_ffi.lib 55.62 MB 55.62 MB 0% (0 B) 👌
libdatadog-x86-windows
Artifact Baseline Commit Change
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.dll 25.42 MB 25.42 MB 0% (0 B) 👌
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.lib 97.58 KB 97.58 KB 0% (0 B) 👌
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.pdb 196.76 MB 196.77 MB +0% (+8.00 KB) 👌
/libdatadog-x86-windows/debug/static/datadog_profiling_ffi.lib 802.14 MB 802.14 MB 0% (0 B) 👌
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.dll 7.54 MB 7.54 MB 0% (0 B) 👌
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.lib 97.58 KB 97.58 KB 0% (0 B) 👌
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.pdb 29.62 MB 29.62 MB 0% (0 B) 👌
/libdatadog-x86-windows/release/static/datadog_profiling_ffi.lib 52.56 MB 52.56 MB 0% (0 B) 👌
x86_64-alpine-linux-musl
Artifact Baseline Commit Change
/x86_64-alpine-linux-musl/lib/libdatadog_profiling.a 86.06 MB 86.06 MB 0% (0 B) 👌
/x86_64-alpine-linux-musl/lib/libdatadog_profiling.so 10.06 MB 10.06 MB 0% (0 B) 👌
x86_64-unknown-linux-gnu
Artifact Baseline Commit Change
/x86_64-unknown-linux-gnu/lib/libdatadog_profiling.a 101.90 MB 101.90 MB 0% (0 B) 👌
/x86_64-unknown-linux-gnu/lib/libdatadog_profiling.so 12.28 MB 12.28 MB 0% (0 B) 👌

@paullegranddc paullegranddc left a comment •

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm commenting on the approach more than on the actual code, but i feel like doing something like this with regex and ad-hoc rust syntax parsing is not the right tool.

I'd much rather see a small script (in rust, or not btw... could be python so we don't have to pay for build in the CI) that uses ast-grep rules to detect these patterns

@pr-commenter

pr-commenter Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

Benchmarks

Comparison

Benchmark execution time: 2026-09-29 15:18:37

Comparing candidate commit c55667b in PR branch dd/ci/ffi-panic-lint-20260928 with baseline commit bdc5466 in branch BridgeAR/2026-09-08-thiserror-v2.

📊 Benchmarking dashboard

Found 16 performance improvements and 19 performance regressions! Performance is the same for 142 metrics, 0 unstable metrics.

Explanation

This is an A/B test comparing a candidate commit's performance against that of a baseline commit. Performance changes are noted in the tables below as:

  • 🟩 = significantly better candidate vs. baseline
  • 🟥 = significantly worse candidate vs. baseline

We compute a confidence interval (CI) over the relative difference of means between metrics from the candidate and baseline commits, considering the baseline as the reference.

If the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD), the change is considered significant.

Feel free to reach out to #apm-benchmarking-platform on Slack if you have any questions.

More details about the CI and significant changes

You can imagine this CI as a range of values that is likely to contain the true difference of means between the candidate and baseline commits.

CIs of the difference of means are often centered around 0%, because often changes are not that big:

---------------------------------(------|---^--------)-------------------------------->
                              -0.6%    0%  0.3%     +1.2%
                                 |          |        |
         lower bound of the CI --'          |        |
sample mean (center of the CI) -------------'        |
         upper bound of the CI ----------------------'

As described above, a change is considered significant if the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD).

For instance, for an execution time metric, this confidence interval indicates a significantly worse performance:

----------------------------------------|---------|---(---------^---------)---------->
                                       0%        1%  1.3%      2.2%      3.1%
                                                  |   |         |         |
       significant impact threshold --------------'   |         |         |
                      lower bound of CI --------------'         |         |
       sample mean (center of the CI) --------------------------'         |
                      upper bound of CI ----------------------------------'

scenario:agentless_encoding/common_http/20x5

  • 🟥 execution_time [+13.977µs; +14.065µs] or [+13.592%; +13.678%]
  • 🟥 throughput [-117084.258op/s; -116311.024op/s] or [-12.039%; -11.960%]

scenario:agentless_encoding/http_with_span_links/20x5

  • 🟥 execution_time [+15.531µs; +15.634µs] or [+13.313%; +13.401%]
  • 🟥 throughput [-101366.753op/s; -100653.976op/s] or [-11.825%; -11.742%]

scenario:ddsketch_add/add_with_count/clustered_near_zero

  • 🟥 execution_time [+11.166µs; +11.819µs] or [+9.224%; +9.764%]
  • 🟥 throughput [-3015449.968op/s; -2845145.101op/s] or [-8.911%; -8.407%]

scenario:ddsketch_add/add_with_count/collapsing

  • 🟥 execution_time [+6.482µs; +6.929µs] or [+4.563%; +4.878%]
  • 🟥 throughput [-1340121.576op/s; -1252944.367op/s] or [-4.647%; -4.345%]

scenario:ddsketch_add/add_with_count/large_values

  • 🟥 execution_time [+11.828µs; +12.372µs] or [+9.762%; +10.212%]
  • 🟥 throughput [-3132824.811op/s; -2994702.305op/s] or [-9.267%; -8.858%]

scenario:ddsketch_add/add_with_count/mixed

  • 🟥 execution_time [+11.135µs; +11.733µs] or [+9.117%; +9.607%]
  • 🟥 throughput [-2938172.269op/s; -2786867.625op/s] or [-8.761%; -8.310%]

scenario:ddsketch_encode/encode_to_vec/clustered_near_zero

  • 🟥 execution_time [+54.520ns; +59.571ns] or [+7.869%; +8.598%]

scenario:ddsketch_encode/encode_to_vec/large_values

  • 🟥 execution_time [+66.631ns; +70.974ns] or [+7.934%; +8.451%]

scenario:ddsketch_encode/encode_to_vec/mixed

  • 🟥 execution_time [+81.205ns; +87.248ns] or [+6.621%; +7.113%]

scenario:msgpack_decoder::v05/low_sharing/200

  • 🟥 execution_time [+18.947µs; +19.150µs] or [+5.446%; +5.505%]
  • 🟥 throughput [-30001.929op/s; -29688.820op/s] or [-5.218%; -5.164%]

scenario:vec_map/as_deduped_map/already_deduped/16

  • 🟥 execution_time [+1.203ns; +1.216ns] or [+4.986%; +5.040%]

scenario:vec_map/as_deduped_map/already_deduped/8

  • 🟥 execution_time [+1.204ns; +1.213ns] or [+8.318%; +8.381%]

scenario:vec_map/contains_key/128

  • 🟩 execution_time [-1.036µs; -1.029µs] or [-6.354%; -6.307%]
  • 🟩 throughput [+528473.837op/s; +532442.529op/s] or [+6.733%; +6.784%]

scenario:vec_map/contains_key/16

  • 🟩 execution_time [-243.652ns; -243.422ns] or [-49.381%; -49.335%]
  • 🟩 throughput [+31579569.155op/s; +31631829.857op/s] or [+97.385%; +97.546%]

scenario:vec_map/contains_key/64

  • 🟩 execution_time [-598.579ns; -596.123ns] or [-12.877%; -12.824%]
  • 🟩 throughput [+2026094.906op/s; +2034107.360op/s] or [+14.716%; +14.774%]

scenario:vec_map/contains_key/8

  • 🟩 execution_time [-136.447ns; -136.386ns] or [-65.318%; -65.288%]
  • 🟩 throughput [+72035909.957op/s; +72119207.100op/s] or [+188.102%; +188.319%]

scenario:vec_map/get_hit/128

  • 🟩 execution_time [-1.318µs; -1.305µs] or [-9.567%; -9.473%]
  • 🟩 throughput [+972928.344op/s; +982842.511op/s] or [+10.469%; +10.576%]

scenario:vec_map/get_hit/16

  • 🟩 execution_time [-21.856ns; -21.605ns] or [-9.311%; -9.204%]
  • 🟩 throughput [+6915208.772op/s; +6993286.926op/s] or [+10.145%; +10.259%]

scenario:vec_map/get_hit/64

  • 🟩 execution_time [-287.580ns; -285.152ns] or [-7.839%; -7.773%]
  • 🟩 throughput [+1470879.640op/s; +1482958.582op/s] or [+8.432%; +8.501%]

scenario:vec_map/get_hit/8

  • 🟩 execution_time [-3.700ns; -3.578ns] or [-5.708%; -5.520%]
  • 🟩 throughput [+7219414.679op/s; +7475305.892op/s] or [+5.849%; +6.057%]

Benchmark execution time: 2026-09-29 15:12:06

Comparing candidate commit c55667b in PR branch dd/ci/ffi-panic-lint-20260928 with baseline commit bdc5466 in branch BridgeAR/2026-09-08-thiserror-v2.

📊 Benchmarking dashboard

Found 20 performance improvements and 21 performance regressions! Performance is the same for 95 metrics, 10 unstable metrics.

Explanation

This is an A/B test comparing a candidate commit's performance against that of a baseline commit. Performance changes are noted in the tables below as:

  • 🟩 = significantly better candidate vs. baseline
  • 🟥 = significantly worse candidate vs. baseline

We compute a confidence interval (CI) over the relative difference of means between metrics from the candidate and baseline commits, considering the baseline as the reference.

If the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD), the change is considered significant.

Feel free to reach out to #apm-benchmarking-platform on Slack if you have any questions.

More details about the CI and significant changes

You can imagine this CI as a range of values that is likely to contain the true difference of means between the candidate and baseline commits.

CIs of the difference of means are often centered around 0%, because often changes are not that big:

---------------------------------(------|---^--------)-------------------------------->
                              -0.6%    0%  0.3%     +1.2%
                                 |          |        |
         lower bound of the CI --'          |        |
sample mean (center of the CI) -------------'        |
         upper bound of the CI ----------------------'

As described above, a change is considered significant if the CI is entirely outside the configured SIGNIFICANT_IMPACT_THRESHOLD (or the deprecated UNCONFIDENCE_THRESHOLD).

For instance, for an execution time metric, this confidence interval indicates a significantly worse performance:

----------------------------------------|---------|---(---------^---------)---------->
                                       0%        1%  1.3%      2.2%      3.1%
                                                  |   |         |         |
       significant impact threshold --------------'   |         |         |
                      lower bound of CI --------------'         |         |
       sample mean (center of the CI) --------------------------'         |
                      upper bound of CI ----------------------------------'

scenario:credit_card/is_card_number/ 378282246310005

  • 🟩 execution_time [-5.052µs; -4.972µs] or [-6.918%; -6.809%]
  • 🟩 throughput [+1001457.352op/s; +1016682.249op/s] or [+7.312%; +7.424%]

scenario:credit_card/is_card_number/378282246310005

  • 🟩 execution_time [-4.951µs; -4.858µs] or [-7.091%; -6.957%]
  • 🟩 throughput [+1071980.299op/s; +1091421.894op/s] or [+7.485%; +7.621%]

scenario:credit_card/is_card_number/37828224631000521389798

  • 🟩 execution_time [-6.566µs; -6.526µs] or [-12.540%; -12.463%]
  • 🟩 throughput [+2719494.229op/s; +2738193.558op/s] or [+14.240%; +14.338%]

scenario:credit_card/is_card_number/x371413321323331

  • 🟥 execution_time [+745.216ns; +762.198ns] or [+12.682%; +12.971%]
  • 🟥 throughput [-19604023.771op/s; -19119002.419op/s] or [-11.519%; -11.234%]

scenario:credit_card/is_card_number_no_luhn/ 378282246310005

  • 🟩 execution_time [-4.673µs; -4.627µs] or [-8.039%; -7.959%]
  • 🟩 throughput [+1488582.816op/s; +1502542.167op/s] or [+8.654%; +8.735%]

scenario:credit_card/is_card_number_no_luhn/378282246310005

  • 🟩 execution_time [-4.557µs; -4.513µs] or [-8.313%; -8.234%]
  • 🟩 throughput [+1638057.125op/s; +1652816.471op/s] or [+8.979%; +9.060%]

scenario:credit_card/is_card_number_no_luhn/37828224631000521389798

  • 🟩 execution_time [-6.542µs; -6.504µs] or [-12.497%; -12.425%]
  • 🟩 throughput [+2710931.306op/s; +2728261.136op/s] or [+14.190%; +14.281%]

scenario:credit_card/is_card_number_no_luhn/x371413321323331

  • 🟥 execution_time [+736.376ns; +752.172ns] or [+12.514%; +12.783%]
  • 🟥 throughput [-19319060.276op/s; -18870236.814op/s] or [-11.367%; -11.103%]

scenario:flagevaluation_evp/payloads/scale/2500flags_500users_20fields

  • 🟩 execution_time [-6.840ms; -6.801ms] or [-24.219%; -24.081%]
  • 🟩 throughput [+28104.606op/s; +28261.767op/s] or [+31.750%; +31.928%]

scenario:flagevaluation_evp/payloads/stress/10flags_1000users_250fields

  • 🟥 execution_time [+16.410ms; +16.544ms] or [+19.857%; +20.019%]
  • 🟥 throughput [-2020.018op/s; -2003.308op/s] or [-16.693%; -16.555%]

scenario:flagevaluation_evp/payloads/typical/100flags_50users_10fields

  • 🟩 execution_time [-218.722µs; -217.723µs] or [-26.729%; -26.607%]
  • 🟩 throughput [+44360.867op/s; +44515.822op/s] or [+36.300%; +36.427%]

scenario:glob_matcher/ascii_case_insensitive_match/wall_time

  • 🟥 execution_time [+2.347ns; +2.402ns] or [+8.578%; +8.779%]

scenario:glob_matcher/ascii_exact_match/wall_time

  • 🟥 execution_time [+2.313ns; +2.383ns] or [+8.449%; +8.704%]

scenario:glob_matcher/ascii_exact_miss/wall_time

  • 🟥 execution_time [+2.796ns; +2.864ns] or [+23.954%; +24.533%]

scenario:normalization/normalize_name/normalize_name/Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Long-.Too-Lo...

  • 🟥 execution_time [+19.607µs; +19.803µs] or [+10.562%; +10.667%]
  • 🟥 throughput [-519342.326op/s; -514458.099op/s] or [-9.641%; -9.550%]

scenario:normalization/normalize_name/normalize_name/bad-name

  • 🟥 execution_time [+1.227µs; +1.248µs] or [+6.975%; +7.094%]
  • 🟥 throughput [-3768381.737op/s; -3704815.545op/s] or [-6.629%; -6.517%]

scenario:normalization/normalize_name/normalize_name/good

  • 🟥 execution_time [+981.067ns; +1004.285ns] or [+9.974%; +10.210%]
  • 🟥 throughput [-9418041.193op/s; -9215325.775op/s] or [-9.263%; -9.064%]

scenario:normalization/normalize_service/normalize_service/A0000000000000000000000000000000000000000000000000...

  • 🟥 execution_time [+39.597µs; +40.040µs] or [+7.958%; +8.047%]
  • 🟥 throughput [-149720.551op/s; -148084.244op/s] or [-7.450%; -7.369%]

scenario:normalization/normalize_service/normalize_service/Test Conversion 0f Weird !@#$%^&**() Characters

  • 🟥 execution_time [+21.948µs; +22.057µs] or [+12.982%; +13.047%]
  • 🟥 throughput [-682810.381op/s; -679539.242op/s] or [-11.544%; -11.488%]

scenario:normalization/normalize_service/normalize_service/[empty string]

  • 🟩 execution_time [-2.115µs; -2.087µs] or [-5.568%; -5.494%]
  • 🟩 throughput [+1531261.239op/s; +1551959.889op/s] or [+5.816%; +5.894%]

scenario:sql/obfuscate_sql_string

  • 🟥 execution_time [+14.867µs; +15.122µs] or [+5.058%; +5.144%]

scenario:tags/replace_trace_tags_v04

  • 🟥 execution_time [+217.154ns; +244.561ns] or [+7.693%; +8.664%]

scenario:trace_buffer/4_senders/no_delay

  • 🟩 execution_time [-253.708µs; -211.030µs] or [-10.761%; -8.951%]
  • 🟩 throughput [+154958.427op/s; +187878.875op/s] or [+10.136%; +12.289%]

Unstable benchmarks

These benchmarks have a confidence interval too wide to call a change; treat them as noise rather than signal.

scenario:datadog_sample_span/parent_not_sampled_short_circuit/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+552.853%; -554.380%]

scenario:datadog_sample_span/parent_sampled_short_circuit/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+546.737%; -551.521%]

scenario:glob_matcher/ascii_case_insensitive_match/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+587.581%; -570.969%]

scenario:glob_matcher/ascii_exact_match/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+590.925%; -572.594%]

scenario:glob_matcher/ascii_exact_miss/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+627.762%; -590.787%]

scenario:glob_matcher/ascii_wildcard_backtrack_match/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+562.859%; -559.101%]

scenario:glob_matcher/ascii_wildcard_heavy_backtrack/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+564.498%; -559.879%]

scenario:glob_matcher/ascii_wildcard_question_match/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+566.837%; -560.992%]

scenario:glob_matcher/ascii_wildcard_star_match/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+566.019%; -560.602%]

scenario:glob_matcher/star_short_circuit/allocated_bytes

  • unstable execution_time [-0.000ns; +0.000ns] or [+555.160%; -555.464%]

Candidate

Omitted due to size.

Baseline

Omitted due to size.

@bwoebi

bwoebi commented Sep 29, 2026

Copy link
Copy Markdown
Contributor

Fwiw: the sidecar-ffi does intentionally not do FFI panic containment.

@yannham

yannham commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

I'd much rather see a small script (in rust, or not btw... could be python so we don't have to pay for build in the CI) that uses ast-grep rules to detect these patterns

FWIW, I think @iunanua is looking into having releases with artifacts for CI crates, so that you can download pre-built binaries. Put differently, "paying for build in the CI" is a temporary limitation, not an inherent property of having CI checks run as Rust executables. IMHO there's more value in having a uniform ecosystem for both the code and the CI, with a strongly typed and fast language like Rust, rather than scattering CI logic across bash, Rust, Python, etc.

@colin-higgins

Copy link
Copy Markdown
Member Author

I opened another PR that introduces ast-grep, please check it out: #2595

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants