nhrpd: Correct addrlen check in os_recvmsg()#21100
nhrpd: Correct addrlen check in os_recvmsg()#21100donaldsharp merged 1 commit intoFRRouting:masterfrom
Conversation
Previously compared addrlen to the stack address of lladdr.sll_addr cast to size_t, virtually always true. This should remain always true as sll_addr is an unsigned char array of size 8 and addr is an array of size 64 but this fixes the check and ensures enough space in addr for memcpy. Signed-off-by: Corey Siltala <csiltala@atcorp.com>
Greptile SummaryThis PR fixes a clear, pre-existing bug in The fix replaces the comparison with the semantically correct
Confidence Score: 5/5
Important Files Changed
Sequence DiagramsequenceDiagram
participant Caller as nhrp_packet_recvraw
participant RecvMsg as os_recvmsg()
participant Kernel as recvmsg() / kernel
Caller->>RecvMsg: addr[64], addrlen=64
RecvMsg->>Kernel: recvmsg(nhrp_socket_fd, MSG_DONTWAIT)
Kernel-->>RecvMsg: fills sockaddr_ll (sll_halen, sll_addr)
Note over RecvMsg: NEW: if (sll_halen <= *addrlen)<br/>OLD (buggy): if (*addrlen <= (size_t)sll_addr)
alt sll_halen fits in buffer (sll_halen <= addrlen)
RecvMsg->>RecvMsg: memcpy(addr, sll_addr, sll_halen)
RecvMsg->>RecvMsg: *addrlen = sll_halen
else buffer too small
RecvMsg->>RecvMsg: skip copy, addrlen unchanged
end
RecvMsg-->>Caller: addr[], *addrlen (e.g. 4 for IPv4)
Caller->>Caller: switch(addrlen) → case 4: process packet
Last reviewed commit: 3dc2d46 |
|
@Mergifyio backport stable/10.6 stable/10.5 stable/10.4 |
✅ Backports have been createdDetails
|
|
LGTM |
nhrpd: Correct addrlen check in os_recvmsg() (backport #21100)
nhrpd: Correct addrlen check in os_recvmsg() (backport #21100)
nhrpd: Correct addrlen check in os_recvmsg() (backport #21100)
Previously compared addrlen to the stack address of lladdr.sll_addr cast to size_t, virtually always true.
This should remain always true as sll_addr is an unsigned char array of size 8 and addr is an array of size 64 but this fixes the check and ensures enough space in addr for memcpy.