Skip to content

Fix unaligned 2-byte load in UDP chunk parsing - #2195

Open
reshke wants to merge 1 commit into
apache:mainfrom
reshke:fix-ubsan-ic-udpifc-alignment
Open

reshke wants to merge 1 commit into
apache:mainfrom
reshke:fix-ubsan-ic-udpifc-alignment

Conversation

@reshke

@reshke reshke commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

UBSan reported an unaligned uint16 load while parsing tuple chunks. Copy the length into an aligned local with memcpy before adding the header size, preserving the existing native-endian interpretation.

Sanitizer report (UBSan, instrumented build, distributed query with Motion traffic over UDP):
  ic_udpifc.c:4572:39: runtime error: load of misaligned address
  0x52500016fa59 for type 'uint16', which requires 2 byte alignment
  #0 RecvTupleChunkUDPIFC ic_udpifc.c:4572
  #1 receiveChunksUDPIFCLoop ic_udpifc.c:4462
  #2 receiveChunksUDPIFC ic_udpifc.c:4406
  #3 RecvTupleChunkFromAnyUDPIFC ic_udpifc.c:4739
  #4 processIncomingChunks cdb/cdbmotion.c:653
  #5 RecvTupleFrom cdbmotion.c:607
  #6 execMotionUnsortedReceiver executor/nodeMotion.c:356

Reached whenever bytesProcessed walks the receive buffer past an even offset while splitting a message into tuple chunks. Benign on x86_64, but undefined behavior on strictly aligned targets.

Fixes #ISSUE_Number

What does this PR do?

Type of Change

  • Bug fix (non-breaking change)
  • New feature (non-breaking change)
  • Breaking change (fix or feature with breaking changes)
  • Documentation update

Breaking Changes

Test Plan

  • Unit tests added/updated
  • Integration tests added/updated
  • Passed make installcheck
  • Passed make -C src/test installcheck-cbdb-parallel

Impact

Performance:

User-facing changes:

Dependencies:

Checklist

Additional Context

CI Skip Instructions


UBSan reported an unaligned uint16 load while parsing tuple chunks.
Copy the length into an aligned local with memcpy before adding the
header size, preserving the existing native-endian interpretation.

Sanitizer report (UBSan, instrumented build, distributed query with
Motion traffic over UDP):
  ic_udpifc.c:4572:39: runtime error: load of misaligned address
  0x52500016fa59 for type 'uint16', which requires 2 byte alignment
  #0 RecvTupleChunkUDPIFC ic_udpifc.c:4572
  #1 receiveChunksUDPIFCLoop ic_udpifc.c:4462
  #2 receiveChunksUDPIFC ic_udpifc.c:4406
  #3 RecvTupleChunkFromAnyUDPIFC ic_udpifc.c:4739
  #4 processIncomingChunks cdb/cdbmotion.c:653
  #5 RecvTupleFrom cdbmotion.c:607
  apache#6 execMotionUnsortedReceiver executor/nodeMotion.c:356
Reached whenever bytesProcessed walks the receive buffer past an
even offset while splitting a message into tuple chunks. Benign on
x86_64, but undefined behavior on strictly aligned targets.

@leborchuk leborchuk left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

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.

2 participants