| Forbid inet connections to inet6 socket when ipv6 is requested - geomyidae - A … | |
| git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri… | |
| Log | |
| Files | |
| Refs | |
| Tags | |
| README | |
| LICENSE | |
| --- | |
| commit dfb715b2f86a449eacc1c5b33568a3c60b12a5d5 | |
| parent 87e1fba0998bc690d6ebb33ca8b4087a5d97af1a | |
| Author: Quentin Rameau <[email protected]> | |
| Date: Thu, 30 Aug 2018 21:18:01 +0200 | |
| Forbid inet connections to inet6 socket when ipv6 is requested | |
| Signed-off-by: Christoph Lohmann <[email protected]> | |
| Diffstat: | |
| M main.c | 15 +++++++++++++-- | |
| 1 file changed, 13 insertions(+), 2 deletions(-) | |
| --- | |
| diff --git a/main.c b/main.c | |
| @@ -300,7 +300,10 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *po… | |
| 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 *po… | |
| 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_ad… | |
| (void *)&((struct sockaddr_in6 *)rp->ai_addr)->sin6_… | |
| @@ -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; | |