Skip to content

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

Merged
kv2019i merged 1 commit into
thesofproject:mainfrom
tmleman:topic/upstream/pr/ipc4/fix/tlv_wraparound
May 11, 2026
Merged

ipc4: handler-user: fix TLV walker pointer wraparound#10746
kv2019i merged 1 commit into
thesofproject: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
Comment thread src/ipc/ipc4/handler-user.c Outdated
@tmleman tmleman force-pushed the topic/upstream/pr/ipc4/fix/tlv_wraparound branch from 4ae5905 to 05ccc16 Compare May 8, 2026 08:34
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>
return IPC4_INVALID_RESOURCE_ID;
}
/* Move pointer to the end of this tlv */
/* Move pointer to the end of this tlv (aligned) */
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.

actually interesting. Usually ABI data is packed. Is this an explicit TLV ABI requirement, that elements should be 4-byte aligned?

@kv2019i kv2019i merged commit fe7281b into thesofproject:main May 11, 2026
40 of 41 checks passed
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.

6 participants