Skip to content

Conversation

@lexnv
Copy link
Collaborator

@lexnv lexnv commented Jan 14, 2026

This PR fixes a fragmented read using the Identity protocol:

  • Presume we want to read 1024 from the network
  • The OS delivered the TCP reads in two chunks of 512 bytes
  • The first read sets the nread to 512
  • The second read sets the nread to 512
  • At this point, we are comparing 512 with 1024, which is wrong, because we have drained from the OS socket 1024 bytes in total:
    if nread == payload_size {

Instead, this PR uses the offset variable to handle the packet correctly.

Closes: #489

@lexnv lexnv self-assigned this Jan 14, 2026
@lexnv lexnv added the bug Something isn't working label Jan 14, 2026
@lexnv lexnv merged commit d35c711 into master Jan 16, 2026
8 checks passed
@lexnv lexnv deleted the lexnv/substream-fix-len branch January 16, 2026 10:02
dmitry-markin added a commit that referenced this pull request Jan 21, 2026
## [0.13.0] - 2026-01-21

This release brings multiple fixes to both the transport and
application-level protocols.

Specifically, it enhances WebSocket stability by resolving AsyncWrite
errors and ensuring that partial writes during the negotiation phase no
longer trigger connection failures.

At the same time, Bitswap client functionality is introduced, which
makes this release semver breaking.

### Added

- Add Bitswap client
([#501](#501))

### Fixed

- notif/fix: Avoid CPU busy loops on litep2p full shutdown
([#521](#521))
- protocol: Ensure transport manager knows about closed connections
([#515](#515))
- substream: Decrement the bytes counter to avoid excessive flushing
([#511](#511))
- crypto/noise: Improve stability of websockets by fixing AsyncWrite
implementation ([#518](#518))
- bitswap: Split block responses into batches under 2 MiB
([#516](#516))
- crypto/noise: Fix connection negotiation logic on partial writes
([#519](#519))
- substream/fix: Fix partial reads for ProtocolCodec::Identity
([#512](#512))
- webrtc: Avoid panics returning error instead
([#509](#509))
- bitswap: e2e test & max payload fix
([#508](#508))
- tcp: Exit connections when events fail to propagate to protocols
([#506](#506))
- webrtc: Avoid future being dropped when channel is full
([#483](#483))

---------

Co-authored-by: Alexandru Vasile <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

substream: Investigate incorrect termination of connection on fragmented reads

3 participants