tag 367716 confirmed patch found 367716 2.1~rc4-2 kthxbye On Wed, May 17, 2006 at 17:22:45 -0400, Andres Salomon wrote:
> I noticed the following on my system: > > [EMAIL PROTECTED]:~# lsof -ni |grep 1199 > zebra 11348 quagga 6u IPv4 1833114 UDP *:1199 > ospfd 11352 quagga 6u IPv4 1833114 UDP *:1199 > openvpn 11354 root 6u IPv4 1833114 UDP *:1199 > [EMAIL PROTECTED]:~# grep 1199 /etc/openvpn/003-rowdy-to-kale.conf > port 1199 > [EMAIL PROTECTED]:~# grep ^up /etc/openvpn/003-rowdy-to-kale.conf > up "/bin/sh -e /etc/init.d/quagga restart; echo" > up-restart > [EMAIL PROTECTED]:~# /etc/init.d/quagga restart > Stopping Quagga daemons (prio:0): (waiting) .. ospfd (waiting) . zebra > (bgpd) (ripd) (ripngd) (ospf6d) (isisd). > Removing all routes made by zebra. > Nothing to flush. > Loading capability module if not yet done. > Starting Quagga daemons (prio:10): zebra ospfd. > [EMAIL PROTECTED]:~# lsof -ni |grep 1199 > openvpn 11354 root 6u IPv4 1833114 UDP *:1199 > [EMAIL PROTECTED]:~# > > > My system is configured to restart quagga whenever an openvpn tunnel > goes up or down. It would appear that whenever openvpn spawns a > process, it inherits its file descriptors (including the listening > socket). This is pretty bad. you can see from the lsof that it's fd 6 > that openvpn is listening on; if I shut down that tunnel without killing > quagga, I cannot start the tunnel again because processes (quagga) are > still "listening" on that port. I imagine there's all kinds of > additional problems that this could cause. > I noticed the same problem. openvpn sets the FD_CLOEXEC flag on sock->fd in socket.c:link_socket_init_phase2(), with this comment: /* set socket file descriptor to not pass across execs, so that scripts don't have access to it */ But, looking at init.c:init_instance(), the call sequence is ... do_init_socket_1(); do_open_tun(); do_init_socket_2(); ... link_socket_init_phase2() is called from do_init_socket_2(), and the 'up' script is run by do_open_tun(), *before* the CLOEXEC flag is set, so the script end up with the listening socket open, and you lose. Moving the set_cloexec() call from link_socket_init_phase2() to link_socket_init_phase1() should fix this. Cheers, Julien
diff -u openvpn-2.1~rc4/debian/changelog openvpn-2.1~rc4/debian/changelog --- openvpn-2.1~rc4/debian/changelog +++ openvpn-2.1~rc4/debian/changelog @@ -1,3 +1,12 @@ +openvpn (2.1~rc4-2.1) UNRELEASED; urgency=low + + * Non-maintainer upload. + * If we want the 'up' scripts not to inherit our socket, setting the + FD_CLOEXEC flag *after* running the scripts turns out not to work. + Closes: #367716. + + -- Julien Cristau <[EMAIL PROTECTED]> Sat, 05 Apr 2008 18:38:40 +0200 + openvpn (2.1~rc4-2) unstable; urgency=low * Upload to unstable. New upstream fixes: only in patch2: unchanged: --- openvpn-2.1~rc4.orig/socket.c +++ openvpn-2.1~rc4/socket.c @@ -1253,6 +1253,10 @@ resolve_bind_local (sock); resolve_remote (sock, 1, NULL, NULL); } + + /* set socket file descriptor to not pass across execs, so that + scripts don't have access to it */ + set_cloexec (sock->sd); } /* finalize socket initialization */ @@ -1459,10 +1463,6 @@ /* set socket to non-blocking mode */ set_nonblock (sock->sd); - /* set socket file descriptor to not pass across execs, so that - scripts don't have access to it */ - set_cloexec (sock->sd); - #ifdef ENABLE_SOCKS if (socket_defined (sock->ctrl_sd)) set_cloexec (sock->ctrl_sd);