diff --git a/src/cfgparse.c b/src/cfgparse.c index 7b5102452..392a2bd1a 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -133,20 +133,6 @@ int str2listener(char *str, struct proxy *curproxy, struct bind_conf *bind_conf, if (!ss2) goto fail; - if (ss2->ss_family == AF_CUST_SOCKPAIR) { - socklen_t addr_len; - - fd = ((struct sockaddr_in *)ss2)->sin_addr.s_addr; - addr_len = sizeof(*ss2); - if (getsockname(fd, (struct sockaddr *)ss2, &addr_len) == -1) { - memprintf(err, "cannot use file descriptor '%d' : %s.\n", fd, strerror(errno)); - goto fail; - } - - ss2->ss_family = AF_CUST_SOCKPAIR; /* reassign AF_CUST_SOCKPAIR because of getsockname */ - port = end = 0; - } - /* OK the address looks correct */ if (!create_listeners(bind_conf, ss2, port, end, fd, err)) { memprintf(err, "%s for address '%s'.\n", *err, str); diff --git a/src/tools.c b/src/tools.c index db17fda0c..e543fd6cd 100644 --- a/src/tools.c +++ b/src/tools.c @@ -943,6 +943,8 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int ss.ss_family = AF_UNSPEC; if (ss.ss_family == AF_CUST_SOCKPAIR) { + struct sockaddr_storage ss2; + socklen_t addr_len; char *endptr; new_fd = strtol(str2, &endptr, 10); @@ -951,6 +953,13 @@ struct sockaddr_storage *str2sa_range(const char *str, int *port, int *low, int goto out; } + /* just verify that it's a socket */ + addr_len = sizeof(ss2); + if (getsockname(new_fd, (struct sockaddr *)&ss2, &addr_len) == -1) { + memprintf(err, "cannot use file descriptor '%d' : %s.\n", new_fd, strerror(errno)); + goto out; + } + ((struct sockaddr_in *)&ss)->sin_addr.s_addr = new_fd; ((struct sockaddr_in *)&ss)->sin_port = 0; }