Fix the problem when npppd receives a zero length 1701/udp packet. If
authoryasuoka <yasuoka@openbsd.org>
Tue, 23 Jun 2015 06:59:54 +0000 (06:59 +0000)
committeryasuoka <yasuoka@openbsd.org>
Tue, 23 Jun 2015 06:59:54 +0000 (06:59 +0000)
it receives such packets when the errno is not EAGAIN or EINTR, it had
closed all L2TP sessions and stoppped the L2TP server.  Also fix the
receiving GRE packet since it potentially has the same problem.

usr.sbin/npppd/l2tp/l2tpd.c
usr.sbin/npppd/pptp/pptpd.c

index f1e9d74..664fd94 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: l2tpd.c,v 1.15 2014/05/07 01:16:15 tedu Exp $ */
+/*     $OpenBSD: l2tpd.c,v 1.16 2015/06/23 06:59:54 yasuoka Exp $ */
 
 /*-
  * Copyright (c) 2009 Internet Initiative Japan Inc.
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  */
 /**@file L2TP(Layer Two Tunneling Protocol "L2TP") / RFC2661 */
-/* $Id: l2tpd.c,v 1.15 2014/05/07 01:16:15 tedu Exp $ */
+/* $Id: l2tpd.c,v 1.16 2015/06/23 06:59:54 yasuoka Exp $ */
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/time.h>
@@ -632,7 +632,7 @@ l2tpd_io_event(int fd, short evtype, void *ctx)
                        if ((sz = recvfromto(_this->sock, buf,
                            sizeof(buf), 0,
                            (struct sockaddr *)&peer, &peerlen,
-                           (struct sockaddr *)&sock, &socklen)) <= 0) {
+                           (struct sockaddr *)&sock, &socklen)) == -1) {
 #endif
                                if (errno == EAGAIN || errno == EINTR)
                                        break;
index 489ba32..61b92a7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pptpd.c,v 1.25 2015/01/19 01:48:59 deraadt Exp $      */
+/*     $OpenBSD: pptpd.c,v 1.26 2015/06/23 06:59:54 yasuoka Exp $      */
 
 /*-
  * Copyright (c) 2009 Internet Initiative Japan Inc.
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-/* $Id: pptpd.c,v 1.25 2015/01/19 01:48:59 deraadt Exp $ */
+/* $Id: pptpd.c,v 1.26 2015/06/23 06:59:54 yasuoka Exp $ */
 
 /**@file
  * This file provides a implementation of PPTP daemon.  Currently it
  * provides functions for PAC (PPTP Access Concentrator) only.
- * $Id: pptpd.c,v 1.25 2015/01/19 01:48:59 deraadt Exp $
+ * $Id: pptpd.c,v 1.26 2015/06/23 06:59:54 yasuoka Exp $
  */
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -674,9 +674,8 @@ pptpd_gre_io_event(int fd, short evmask, void *ctx)
                        /* read till bloked */
                        peerlen = sizeof(peer);
                        if ((sz = recvfrom(listener->sock_gre, pkt, sizeof(pkt),
-                           0, (struct sockaddr *)&peer, &peerlen)) <= 0) {
-                               if (sz < 0 &&
-                                   (errno == EAGAIN || errno == EINTR))
+                           0, (struct sockaddr *)&peer, &peerlen)) == -1) {
+                               if (errno == EAGAIN || errno == EINTR)
                                        break;
                                pptpd_log(_this, LOG_INFO,
                                    "read(GRE) failed: %m");