]> Zhao Yanbai Git Server - minix.git/commitdiff
libc: check raw IP socket type before using it 97/3297/1
authorDavid van Moolenbroek <david@minix3.org>
Sat, 9 Jan 2016 13:34:13 +0000 (13:34 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Mon, 22 Feb 2016 23:21:05 +0000 (23:21 +0000)
Previously, the libc sendto(3) and recvfrom(3) implementations would
blindly assume that any unrecognized socket is a raw-IP socket.  This
is not only inconsistent but also messes with returned error codes.

Change-Id: Id0328f04ea8ca0968a4e8636bc441caa0c3579b7

minix/lib/libc/sys/recvfrom.c
minix/lib/libc/sys/sendto.c

index 05a7118392a2e030b18fa59d240e5d3acfc62f21..b66e0a7203b85301ea2ab5420c29ad97112c182e 100644 (file)
@@ -19,6 +19,7 @@
 #include <net/gen/udp_io.h>
 
 #include <net/gen/ip_hdr.h>
+#include <net/gen/ip_io.h>
 
 #define DEBUG 0
 
@@ -42,6 +43,7 @@ ssize_t recvfrom(int sock, void *__restrict buffer, size_t length,
        int r;
        nwio_tcpconf_t tcpconf;
        nwio_udpopt_t udpopt;
+       nwio_ipopt_t ipopt;
        struct sockaddr_un uds_addr;
        int uds_sotype = -1;
 
@@ -85,11 +87,17 @@ ssize_t recvfrom(int sock, void *__restrict buffer, size_t length,
                }
        }
 
+       r= ioctl(sock, NWIOGIPOPT, &ipopt);
+       if (r != -1 || errno != ENOTTY)
        {
                ip_hdr_t *ip_hdr;
                int rd;
                struct sockaddr_in sin;
 
+               if (r == -1) {
+                       return r;
+               }
+
                rd = read(sock, buffer, length);
 
                if(rd < 0) return rd;
index ddfa8ae10551a5b75f8a3d47f4c0ecb63f0d800c..18d484df859432ad266eb61e24a915d0813a1131 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <net/gen/in.h>
 #include <net/gen/ip_hdr.h>
+#include <net/gen/ip_io.h>
 #include <net/gen/tcp.h>
 #include <net/gen/tcp_io.h>
 #include <net/gen/udp.h>
@@ -37,6 +38,7 @@ ssize_t sendto(int sock, const void *message, size_t length, int flags,
        int r;
        nwio_tcpopt_t tcpopt;
        nwio_udpopt_t udpopt;
+       nwio_ipopt_t ipopt;
        int uds_sotype = -1;
 
        r= ioctl(sock, NWIOGTCPOPT, &tcpopt);
@@ -75,12 +77,18 @@ ssize_t sendto(int sock, const void *message, size_t length, int flags,
                }
        }
 
+       r= ioctl(sock, NWIOGIPOPT, &ipopt);
+       if (r != -1 || errno != ENOTTY)
        {
                ip_hdr_t *ip_hdr;
                const struct sockaddr_in *sinp;
                ssize_t retval;
                int saved_errno;
 
+               if (r == -1) {
+                       return r;
+               }
+
                sinp = (const struct sockaddr_in *)dest_addr;
                if (sinp->sin_family != AF_INET)
                {