Browse Source

Fix IDLE_WAIT implementation. Closes: #692654

Christoph Biedl 11 years ago
parent
commit
0a0a00a6d7
2 changed files with 68 additions and 0 deletions
  1. 67 0
      debian/patches/debian-692654_fix-idle-wait.patch
  2. 1 0
      debian/patches/series

+ 67 - 0
debian/patches/debian-692654_fix-idle-wait.patch

@@ -0,0 +1,67 @@
+Description: fix IDLE_WAIT implementation
+Author: Michael Douglass <mikedoug at mikedoug dot net>
+Origin: http://poptop.cvs.sourceforge.net/viewvc/poptop/poptop/pptpctrl.c?r1=1.21&r2=1.22
+Forwarded: not-needed
+Bug-Debian: http://bugs.debian.org/692654
+
+--- a/AUTHORS
++++ b/AUTHORS
+@@ -28,6 +28,7 @@
+ Chris Wilson
+ Anton Gorlov
+ Charlie Brady
++Michael Douglass <mikedoug at mikedoug dot net>
+ 
+ The Linux PPTP Server takes advantage of some Linux PPTP client code
+ written by C. Scott Ananian <cananian at alumni.princeton.edu>
+--- a/pptpctrl.c
++++ b/pptpctrl.c
+@@ -226,6 +226,7 @@
+ 	int echo_wait = FALSE;		/* Waiting for echo? */
+ 	u_int32_t echo_count = 0;	/* Sequence # of echo */
+ 	time_t echo_time = 0;		/* Time last echo req sent */
++	time_t last_time = time(NULL);	/* Time last received data */
+ 	struct timeval idleTime;	/* How long to select() */
+ 
+ 	/* General local variables */
+@@ -281,16 +282,6 @@
+ 			} else if (encaps_gre(-1, NULL, 0))
+ 				/* Pending ack and nothing else to do */
+ 				encaps_gre(gre_fd, NULL, 0);	/* send ack with no payload */
+-			else if (echo_wait != TRUE) {
+-				/* Timeout. Start idle link detection. */
+-				echo_count++;
+-				if (pptpctrl_debug)
+-					syslog(LOG_DEBUG, "CTRL: Sending ECHO REQ id %d", echo_count);
+-				time(&echo_time);
+-				make_echo_req_packet(rply_packet, &rply_size, echo_count);
+-				echo_wait = TRUE;
+-				send_packet = TRUE;
+-			}
+ 			break;
+ 
+ 		default:
+@@ -328,6 +319,7 @@
+ 		/* handle control messages */
+ 
+ 		if (FD_ISSET(clientSocket, &fds)) {
++			time(&last_time);
+ 			send_packet = TRUE;
+ 			switch (read_pptp_packet(clientSocket, packet, rply_packet, &rply_size)) {
+ 			case 0:
+@@ -420,6 +412,15 @@
+ 
+ 			/* Otherwise, the already-formed reply will do fine, so send it */
+ 			}
++		/* send echo request packet if we have not heard from the TCP socket in IDLE_TIME */
++		} else if (echo_wait != TRUE && (time(NULL) - last_time) > IDLE_WAIT) {
++			echo_count++;
++			if (pptpctrl_debug)
++				syslog(LOG_DEBUG, "CTRL: Sending ECHO REQ id %d", echo_count);
++			time(&echo_time);
++			make_echo_req_packet(rply_packet, &rply_size, echo_count);
++			echo_wait = TRUE;
++			send_packet = TRUE;
+ 		}
+ 
+ 		/* send reply packet - this may block, but it should be very rare */

+ 1 - 0
debian/patches/series

@@ -9,3 +9,4 @@ debian-692129_pptpd-1.3.4_manage-enobufs.patch
 debian-693136_avoid-binary-trash.patch
 debian-426553_bcrelay-manpage.patch
 debian-567480_handle-eol-at-eof.patch
+debian-692654_fix-idle-wait.patch