svn commit: r355369 - stable/12/usr.bin/tip/tip

Eric van Gyzen vangyzen at FreeBSD.org
Tue Dec 3 22:57:11 UTC 2019


Author: vangyzen
Date: Tue Dec  3 22:57:10 2019
New Revision: 355369
URL: https://svnweb.freebsd.org/changeset/base/355369

Log:
  MFC r354624
  
  tip/cu: check for EOF on input on the local side
  
  If cu reads an EOF on the input side, it goes into a tight loop
  sending a garbage byte to the remote.  With this change, it exits
  gracefully, along with its child.
  
  Sponsored by:	Dell EMC Isilon

Modified:
  stable/12/usr.bin/tip/tip/tip.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/usr.bin/tip/tip/tip.c
==============================================================================
--- stable/12/usr.bin/tip/tip/tip.c	Tue Dec  3 22:54:24 2019	(r355368)
+++ stable/12/usr.bin/tip/tip/tip.c	Tue Dec  3 22:57:10 2019	(r355369)
@@ -252,7 +252,6 @@ cucommon:
 		tipin();
 	else
 		tipout();
-	/*NOTREACHED*/
 	exit(0);
 }
 
@@ -402,11 +401,16 @@ tipin(void)
 	}
 
 	while (1) {
-		gch = getchar()&STRIP_PAR;
-		/* XXX does not check for EOF */
+		gch = getchar();
+		if (gch == EOF)
+			return;
+		gch = gch & STRIP_PAR;
 		if ((gch == character(value(ESCAPE))) && bol) {
 			if (!noesc) {
-				if (!(gch = escape()))
+				gch = escape();
+				if (gch == EOF)
+					return;
+				if (gch == 0)
 					continue;
 			}
 		} else if (!cumode && gch == character(value(RAISECHAR))) {
@@ -420,7 +424,10 @@ tipin(void)
 				printf("\r\n");
 			continue;
 		} else if (!cumode && gch == character(value(FORCE)))
-			gch = getchar()&STRIP_PAR;
+			gch = getchar();
+			if (gch == EOF)
+				return;
+			gch = gch & STRIP_PAR;
 		bol = any(gch, value(EOL));
 		if (boolean(value(RAISE)) && islower(gch))
 			gch = toupper(gch);
@@ -444,8 +451,10 @@ escape(void)
 	esctable_t *p;
 	char c = character(value(ESCAPE));
 
-	gch = (getchar()&STRIP_PAR);
-	/* XXX does not check for EOF */
+	gch = getchar();
+	if (gch == EOF)
+		return (EOF);
+	gch = gch & STRIP_PAR;
 	for (p = etable; p->e_char; p++)
 		if (p->e_char == gch) {
 			if ((p->e_flags&PRIV) && uid)


More information about the svn-src-all mailing list