The branch main has been updated by tuexen:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=dabd8bf9145a0a7255473a482e2ccf31919c3089

commit dabd8bf9145a0a7255473a482e2ccf31919c3089
Author:     Michael Tuexen <[email protected]>
AuthorDate: 2021-12-01 09:13:20 +0000
Commit:     Michael Tuexen <[email protected]>
CommitDate: 2021-12-01 09:13:20 +0000

    libc sctp: fix sctp_getladdrs() for 64-bit BE platforms
    
    When calling getsockopt() with SCTP_GET_LOCAL_ADDR_SIZE, use a
    pointer to a 32-bit variable, since this is what the kernel
    expects.
    While there, do some cleanups.
    
    MFC after:      1 week
---
 lib/libc/net/sctp_sys_calls.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/lib/libc/net/sctp_sys_calls.c b/lib/libc/net/sctp_sys_calls.c
index 66a0f6adac3a..5acb957c3d3f 100644
--- a/lib/libc/net/sctp_sys_calls.c
+++ b/lib/libc/net/sctp_sys_calls.c
@@ -391,23 +391,23 @@ sctp_getpaddrs(int sd, sctp_assoc_t id, struct sockaddr 
**raddrs)
 {
        struct sctp_getaddresses *addrs;
        struct sockaddr *sa;
-       sctp_assoc_t asoc;
        caddr_t lim;
        socklen_t opt_len;
+       uint32_t size_of_addresses;
        int cnt;
 
        if (raddrs == NULL) {
                errno = EFAULT;
                return (-1);
        }
-       asoc = id;
-       opt_len = (socklen_t)sizeof(sctp_assoc_t);
+       /* When calling getsockopt(), the value contains the assoc_id. */
+       size_of_addresses = (uint32_t)id;
+       opt_len = (socklen_t)sizeof(uint32_t);
        if (getsockopt(sd, IPPROTO_SCTP, SCTP_GET_REMOTE_ADDR_SIZE,
-           &asoc, &opt_len) != 0) {
+           &size_of_addresses, &opt_len) != 0) {
                return (-1);
        }
-       /* size required is returned in 'asoc' */
-       opt_len = (socklen_t)((size_t)asoc + sizeof(struct sctp_getaddresses));
+       opt_len = (socklen_t)((size_t)size_of_addresses + sizeof(struct 
sctp_getaddresses));
        addrs = calloc(1, (size_t)opt_len);
        if (addrs == NULL) {
                errno = ENOMEM;
@@ -446,10 +446,10 @@ int
 sctp_getladdrs(int sd, sctp_assoc_t id, struct sockaddr **raddrs)
 {
        struct sctp_getaddresses *addrs;
-       caddr_t lim;
        struct sockaddr *sa;
-       size_t size_of_addresses;
+       caddr_t lim;
        socklen_t opt_len;
+       uint32_t size_of_addresses;
        int cnt;
 
        if (raddrs == NULL) {
@@ -457,7 +457,7 @@ sctp_getladdrs(int sd, sctp_assoc_t id, struct sockaddr 
**raddrs)
                return (-1);
        }
        size_of_addresses = 0;
-       opt_len = (socklen_t)sizeof(int);
+       opt_len = (socklen_t)sizeof(uint32_t);
        if (getsockopt(sd, IPPROTO_SCTP, SCTP_GET_LOCAL_ADDR_SIZE,
            &size_of_addresses, &opt_len) != 0) {
                errno = ENOMEM;
@@ -467,7 +467,7 @@ sctp_getladdrs(int sd, sctp_assoc_t id, struct sockaddr 
**raddrs)
                errno = ENOTCONN;
                return (-1);
        }
-       opt_len = (socklen_t)(size_of_addresses + sizeof(struct 
sctp_getaddresses));
+       opt_len = (socklen_t)((size_t)size_of_addresses + sizeof(struct 
sctp_getaddresses));
        addrs = calloc(1, (size_t)opt_len);
        if (addrs == NULL) {
                errno = ENOMEM;

Reply via email to