• src/sftp/sftp_pkt.c

    From Deucе@VERT to Git commit to main/sbbs/master on Fri May 1 07:59:47 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/16319af40a18856276aea0fa
    Modified Files:
    src/sftp/sftp_pkt.c
    Log Message:
    sftp: fix tx and rx buffer round-up bugs at 4 KiB boundaries

    Two parallel undersizing bugs in the shared SFTP packet library
    caused both peers to corrupt their own buffers near
    SFTP_MIN_PACKET_ALLOC (4 KiB) boundaries.

    rx_pkt_append used

    new_sz = new_sz / SFTP_MIN_PACKET_ALLOC + SFTP_MIN_PACKET_ALLOC

    — a divide where there should have been a `+= (BLOCK - remain)`.
    For any inbound chunk whose total exceeded the first 4 KiB boundary
    the formula collapsed back to roughly 4 KiB, the realloc undersized
    the buffer, and the subsequent memcpy walked past the heap
    allocation.

    grow_tx had a structurally different but related bug: in the
    existing-packet branch it computed

    newsz = pkt->used + need;

    omitting the offsetof(struct sftp_tx_pkt, type) header that pkt->sz
    already accounts for. The realloc rounded `pkt->used + need` up to
    the next 4 KiB boundary, but the actual write target lands at
    `pkt->used + offsetof(type) + need`, so when (used + need) lands on
    a 4 KiB boundary the new allocation undershoots by up to
    offsetof(type) bytes. The fresh-allocation branch and the trailing
    asserts both already used the offsetof-inclusive form; bring the existing-packet branch in line.

    The library is shared, so each bug corrupted both peers: rx_pkt for
    large inbound packets (uploads, large readdir replies, file data),
    grow_tx for outbound packets that crossed a 4 KiB boundary.
    Symptom in the wild was a SyncTERM SFTP browser failing to list a
    25-entry filebase directory with garbled fattr / filename strings
    near entry 23-24.

    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

    ---
    ■ Synchronet ■ Vertrauen ■ Home of Synchronet ■ [vert/cvs/bbs].synchro.net