Calling "openvpn --inetd" from the CLI (= no socket on stdin) will
lead to endless looping in the accept(4) loop.
Instead of cluttering that function further, detect failure to call
getsockame() in phase2_inetd() already, and trigger a M_FATAL abort
on "errno == ENOTSOCK" ("The argument s is a file, not a socket").
While at it, uncrustify the --bind-dev code (whitespace only).
Trac: #350
Signed-off-by: Gert Doering <gert@greenie.muc.de>
Acked-by: Arne Schwabe <arne@rfc2549.org>
Message-Id: <20200908105130.24171-1-gert@greenie.muc.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg20897.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
(cherry picked from commit a09a2fadbadb5dc435f6fccc581163e1f637f43f)
| ... | ... |
@@ -1141,8 +1141,8 @@ create_socket(struct link_socket *sock, struct addrinfo *addr) |
| 1141 | 1141 |
#if defined(TARGET_LINUX) |
| 1142 | 1142 |
if (sock->bind_dev) |
| 1143 | 1143 |
{
|
| 1144 |
- msg (M_INFO, "Using bind-dev %s", sock->bind_dev); |
|
| 1145 |
- if (setsockopt (sock->sd, SOL_SOCKET, SO_BINDTODEVICE, sock->bind_dev, strlen (sock->bind_dev) + 1) != 0) |
|
| 1144 |
+ msg(M_INFO, "Using bind-dev %s", sock->bind_dev); |
|
| 1145 |
+ if (setsockopt(sock->sd, SOL_SOCKET, SO_BINDTODEVICE, sock->bind_dev, strlen(sock->bind_dev) + 1) != 0) |
|
| 1146 | 1146 |
{
|
| 1147 | 1147 |
msg(M_WARN|M_ERRNO, "WARN: setsockopt SO_BINDTODEVICE=%s failed", sock->bind_dev); |
| 1148 | 1148 |
} |
| ... | ... |
@@ -2030,8 +2030,14 @@ phase2_inetd(struct link_socket *sock, const struct frame *frame, |
| 2030 | 2030 |
} |
| 2031 | 2031 |
else |
| 2032 | 2032 |
{
|
| 2033 |
- msg(M_WARN, "inetd(%s): getsockname(%d) failed, using AF_INET", |
|
| 2033 |
+ int saved_errno = errno; |
|
| 2034 |
+ msg(M_WARN|M_ERRNO, "inetd(%s): getsockname(%d) failed, using AF_INET", |
|
| 2034 | 2035 |
proto2ascii(sock->info.proto, sock->info.af, false), (int)sock->sd); |
| 2036 |
+ /* if not called with a socket on stdin, --inetd cannot work */ |
|
| 2037 |
+ if (saved_errno == ENOTSOCK) |
|
| 2038 |
+ {
|
|
| 2039 |
+ msg(M_FATAL, "ERROR: socket required for --inetd operation"); |
|
| 2040 |
+ } |
|
| 2035 | 2041 |
} |
| 2036 | 2042 |
} |
| 2037 | 2043 |
#else /* ifdef HAVE_GETSOCKNAME */ |
| ... | ... |
@@ -2047,7 +2053,6 @@ phase2_inetd(struct link_socket *sock, const struct frame *frame, |
| 2047 | 2047 |
false, |
| 2048 | 2048 |
sock->inetd == INETD_NOWAIT, |
| 2049 | 2049 |
signal_received); |
| 2050 |
- |
|
| 2051 | 2050 |
} |
| 2052 | 2051 |
ASSERT(!remote_changed); |
| 2053 | 2052 |
} |