• T
    sctp: fix -ENOMEM result with invalid user space pointer in sendto() syscall · 6e51fe75
    Tommi Rantala 提交于
    Consider the following program, that sets the second argument to the
    sendto() syscall incorrectly:
    
     #include <string.h>
     #include <arpa/inet.h>
     #include <sys/socket.h>
    
     int main(void)
     {
             int fd;
             struct sockaddr_in sa;
    
             fd = socket(AF_INET, SOCK_STREAM, 132 /*IPPROTO_SCTP*/);
             if (fd < 0)
                     return 1;
    
             memset(&sa, 0, sizeof(sa));
             sa.sin_family = AF_INET;
             sa.sin_addr.s_addr = inet_addr("127.0.0.1");
             sa.sin_port = htons(11111);
    
             sendto(fd, NULL, 1, 0, (struct sockaddr *)&sa, sizeof(sa));
    
             return 0;
     }
    
    We get -ENOMEM:
    
     $ strace -e sendto ./demo
     sendto(3, NULL, 1, 0, {sa_family=AF_INET, sin_port=htons(11111), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ENOMEM (Cannot allocate memory)
    
    Propagate the error code from sctp_user_addto_chunk(), so that we will
    tell user space what actually went wrong:
    
     $ strace -e sendto ./demo
     sendto(3, NULL, 1, 0, {sa_family=AF_INET, sin_port=htons(11111), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EFAULT (Bad address)
    
    Noticed while running Trinity (the syscall fuzzer).
    Signed-off-by: NTommi Rantala <tt.rantala@gmail.com>
    Acked-by: NVlad Yasevich <vyasevich@gmail.com>
    Acked-by: NNeil Horman <nhorman@tuxdriver.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    6e51fe75
chunk.c 9.8 KB