Skip to content

ipc4: handler-user: fix TLV walker pointer wraparound#10746

Open
tmleman wants to merge 1 commit intothesofproject:mainfrom
tmleman:topic/upstream/pr/ipc4/fix/tlv_wraparound
Open

ipc4: handler-user: fix TLV walker pointer wraparound#10746
tmleman wants to merge 1 commit intothesofproject:mainfrom
tmleman:topic/upstream/pr/ipc4/fix/tlv_wraparound

Conversation

@tmleman
Copy link
Copy Markdown
Contributor

@tmleman tmleman commented May 6, 2026

The TLV walker loop in ipc4_set_vendor_config_module_instance() advances the tlv pointer by sizeof(struct sof_tlv) + ALIGN_UP(tlv->length, 4) without validating that the result stays within the IPC payload buffer.

Issue was found using static analysis security scanning tools and confirmed by testing that a malformed or incorrectly crafted TLV with an oversized length field causes the 32-bit pointer arithmetic to wrap around, triggering a null pointer dereference and DSP panic.

Fix by:

  1. Adding an upper-bound check on data_off_size against MAILBOX_HOSTBOX_SIZE at function entry.
  2. Validating on each loop iteration that the TLV header + value fits within the remaining buffer bytes before calling set_large_config or advancing the pointer. The check uses integer subtraction (not pointer addition) to avoid undefined behavior from pointer overflow hat the compiler could optimize away, and splits the comparison to prevent size_t overflow when tlv->length is near UINT32_MAX.

Copilot AI review requested due to automatic review settings May 6, 2026 17:15
The TLV walker loop in ipc4_set_vendor_config_module_instance() advances
the tlv pointer by sizeof(struct sof_tlv) + ALIGN_UP(tlv->length, 4)
without validating that the result stays within the IPC payload buffer.

Issue was found using static analysis security scanning tools and
confirmed by testing that a malformed or incorrectly crafted TLV with an
oversized length field causes the 32-bit pointer arithmetic to wrap
around, triggering a null pointer dereference and DSP panic.

Fix by:
1. Adding an upper-bound check on data_off_size against
   MAILBOX_HOSTBOX_SIZE at function entry.
2. Validating on each loop iteration that the TLV header + value fits
   within the remaining buffer bytes before calling set_large_config or
   advancing the pointer. The check uses integer subtraction (not pointer
   addition) to avoid undefined behavior from pointer overflow hat the
   compiler could optimize away, and splits the comparison to prevent
   size_t overflow when tlv->length is near UINT32_MAX.

Signed-off-by: Tomasz Leman <tomasz.m.leman@intel.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant