Forbid inet connections to inet6 socket when ipv6 is requested - geomyidae - A small C-based gopherd.
 (HTM) git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit dfb715b2f86a449eacc1c5b33568a3c60b12a5d5
 (DIR) parent 87e1fba0998bc690d6ebb33ca8b4087a5d97af1a
 (HTM) Author: Quentin Rameau <quinq@fifth.space>
       Date:   Thu, 30 Aug 2018 21:18:01 +0200
       
       Forbid inet connections to inet6 socket when ipv6 is requested
       
       Signed-off-by: Christoph Lohmann <20h@r-36.net>
       
       Diffstat:
         M main.c                              |      15 +++++++++++++--
       
       1 file changed, 13 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/main.c b/main.c
       @@ -300,7 +300,10 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *port)
                char addstr[INET6_ADDRSTRLEN];
                struct addrinfo *ai, *rp;
                void *sinaddr;
       -        int on, listfd, aierr;
       +        int on, reqaf, listfd, aierr;
       +
       +        if ((reqaf = hints->ai_family) == AF_UNSPEC)
       +                hints->ai_family = AF_INET6;
        
                if ((aierr = getaddrinfo(bindip, port, hints, &ai)) || ai == NULL) {
                        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(aierr));
       @@ -321,6 +324,14 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *port)
                                break;
                        }
        
       +                if (reqaf == AF_INET6 &&
       +                   (setsockopt(listfd, IPPROTO_IPV6, IPV6_V6ONLY, &on,
       +                               sizeof(on)) < 0)) {
       +                        close(listfd);
       +                        listfd = -1;
       +                        break;
       +                }
       +
                        sinaddr = (rp->ai_family == AF_INET) ?
                                  (void *)&((struct sockaddr_in *)rp->ai_addr)->sin_addr :
                                  (void *)&((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr;
       @@ -377,7 +388,7 @@ main(int argc, char *argv[])
                bindip = NULL;
                ohost = NULL;
                sport = NULL;
       -        inetf = AF_INET6;
       +        inetf = AF_UNSPEC;
                usechroot = 0;
                nocgi = 0;