Branch: master

4cadf198 2015-09-18 03:59:53 Timothy Pearson
Do not chew up all available VT numbers when multiple sessions are reserved and time out in series
M tdm/backend/dm.c
diff --git a/tdm/backend/dm.c b/tdm/backend/dm.c
index cd672f3..b6789a6 100644
--- a/tdm/backend/dm.c
+++ b/tdm/backend/dm.c
@@ -51,6 +51,8 @@
 # include <sys/vt.h>
 #endif
 
+#define MAX_VT_NUMBER 16
+
 static void SigHandler( int n );
 static int ScanConfigs( int force );
 static void StartDisplays( void );
@@ -511,7 +513,7 @@
 	if ((d->displayType & d_location) == dLocal)
 		switch (d->status) {
 		default:
-			rStopDisplay( d, DS_TEXTMODE | 0x100 );
+			rStopDisplay(d, DS_TEXTMODE | 0x100);
 		case reserve:
 		case textMode:
 			break;
@@ -523,9 +525,11 @@
 {
 	struct display *d;
 
-	for (d = displays; d; d = d->next)
-		if (d->status == zombie)
+	for (d = displays; d; d = d->next) {
+		if (d->status == zombie) {
 			return;
+		}
+	}
 
 	SwitchToTty();
 }
@@ -793,12 +797,12 @@
 	case G_Console:
 #ifdef HAVE_VTS
 		if (*consoleTTYs) { /* sanity check against greeter */
-			ForEachDisplay( StopToTTY );
+			ForEachDisplay(StopToTTY);
 			CheckTTYMode();
 		}
 #else
 		if (*d->console) /* sanity check against greeter */
-			rStopDisplay( d, DS_TEXTMODE );
+			rStopDisplay(d, DS_TEXTMODE);
 #endif
 		break;
 	default:
@@ -860,12 +864,11 @@
 	struct display *d;
 	waitType status;
 
-	while ((pid = waitpid( -1, &status, WNOHANG )) > 0)
-	{
+	while ((pid = waitpid( -1, &status, WNOHANG)) > 0) {
 		Debug( "manager wait returns  pid %d  sig %d  core %d  code %d\n",
 		       pid, waitSig( status ), waitCore( status ), waitCode( status ) );
 		/* SUPPRESS 560 */
-		if ((d = FindDisplayByPid( pid ))) {
+		if ((d = FindDisplayByPid(pid))) {
 			d->pid = -1;
 			UnregisterInput( d->pipe.rfd );
 			GClosen (&d->pipe);
@@ -953,32 +956,38 @@
 					if (d->follower) {
 						d->follower->serverVT = d->serverVT;
 						d->follower = 0;
-					} else {
-						int con = open( "/dev/console", O_RDONLY );
+					}
+					else {
+						int con = open("/dev/console", O_RDONLY);
 						if (con >= 0) {
 							struct vt_stat vtstat;
 							ioctl( con, VT_GETSTATE, &vtstat );
 							if (vtstat.v_active == d->serverVT) {
 								int vt = 1;
 								struct display *di;
-								for (di = displays; di; di = di->next)
-									if (di != d && di->serverVT)
+								for (di = displays; di; di = di->next) {
+									if (di != d && di->serverVT) {
 										vt = di->serverVT;
-								for (di = displays; di; di = di->next)
+									}
+								}
+								for (di = displays; di; di = di->next) {
 									if (di != d && di->serverVT &&
 									    (di->userSess >= 0 ||
-									     di->status == remoteLogin))
+									     di->status == remoteLogin)) {
 										vt = di->serverVT;
-								ioctl( con, VT_ACTIVATE, vt );
+									}
+								}
+								ioctl(con, VT_ACTIVATE, vt);
 							}
-							ioctl( con, VT_DISALLOCATE, d->serverVT );
-							close( con );
+							ioctl(con, VT_DISALLOCATE, d->serverVT);
+							close(con);
 						}
 					}
 					d->serverVT = 0;
+					d->status = notRunning;
 				}
 #endif
-				rStopDisplay( d, d->zstatus );
+				rStopDisplay(d, d->zstatus);
 				break;
 			case phoenix:
 				Debug( "phoenix X server arises, restarting display %s\n",
@@ -1032,11 +1041,14 @@
 	struct display *d;
 
 	if (sdRec.force != SHUT_CANCEL) {
-		if (sdRec.force == SHUT_FORCEMY)
-			for (d = displays; d; d = d->next)
+		if (sdRec.force == SHUT_FORCEMY) {
+			for (d = displays; d; d = d->next) {
 				if (d->status == remoteLogin ||
-				    (d->userSess >= 0 && d->userSess != sdRec.uid))
+					(d->userSess >= 0 && d->userSess != sdRec.uid)) {
 					return 0;
+				}
+			}
+		}
 		return 1;
 	}
 	return !AnyActiveDisplays();
@@ -1078,7 +1090,9 @@
 	int olderrno = errno;
 	char buf = (char)n;
 	/* Debug( "caught signal %d\n", n ); this hangs in syslog() */
-	write( signalFds[1], &buf, 1 );
+	if (write(signalFds[1], &buf, 1) != 1) {
+		// ERROR
+	}
 #ifdef __EMX__
 	(void)Signal( n, SigHandler );
 #endif
@@ -1178,23 +1192,27 @@
 					break;
 				case SIGCHLD:
 					ReapChildren();
-					if (!Stopping && autoRescan)
+					if (!Stopping && autoRescan) {
 						RescanConfigs( FALSE );
+					}
 					break;
 				case SIGUSR1:
 					if (startingServer &&
-					    startingServer->serverStatus == starting)
+					    startingServer->serverStatus == starting) {
 						StartServerSuccess();
+					}
 					break;
 				}
 				continue;
 			}
 #ifdef XDMCP
-			if (ProcessListenSockets( &reads ))
+			if (ProcessListenSockets( &reads )) {
 				continue;
+			}
 #endif	/* XDMCP */
-			if (handleCtrl( &reads, 0 ))
+			if (handleCtrl( &reads, 0 )) {
 				continue;
+			}
 			/* Must be last (because of the breaks)! */
 		  again:
 			for (d = displays; d; d = d->next) {
@@ -1216,18 +1234,21 @@
 static void
 CheckDisplayStatus( struct display *d )
 {
-	if ((d->displayType & d_origin) == dFromFile && !d->stillThere)
+	if ((d->displayType & d_origin) == dFromFile && !d->stillThere) {
 		StopDisplay( d );
+	}
 	else if ((d->displayType & d_lifetime) == dReserve &&
-	         d->status == running && d->userSess < 0 && !d->idleTimeout)
-		rStopDisplay( d, DS_RESERVE );
-	else if (d->status == notRunning)
+	         d->status == running && d->userSess < 0 && !d->idleTimeout) {
+		rStopDisplay(d, DS_RESERVE);
+	}
+	else if (d->status == notRunning) {
 		if (LoadDisplayResources( d ) < 0) {
 			LogError( "Unable to read configuration for display %s; "
 			          "stopping it.\n", d->name );
 			StopDisplay( d );
 			return;
 		}
+	}
 }
 
 static void
@@ -1260,7 +1281,7 @@
 }
 
 static void
-AllocateVT( struct display *d )
+AllocateVT(struct display *d)
 {
 	struct display *cd;
 	int i, tvt, volun;
@@ -1268,31 +1289,37 @@
 	if ((d->displayType & d_location) == dLocal &&
 	    d->status == notRunning && !d->serverVT && d->reqSrvVT >= 0)
 	{
-		if (d->reqSrvVT && d->reqSrvVT < 16)
+		if (d->reqSrvVT && d->reqSrvVT < MAX_VT_NUMBER) {
 			d->serverVT = d->reqSrvVT;
+		}
 		else {
 			for (i = tvt = 0;;) {
 				if (serverVTs[i]) {
-					tvt = atoi( serverVTs[i++] );
+					tvt = atoi(serverVTs[i++]);
 					volun = 0;
 					if (tvt < 0) {
 						tvt = -tvt;
 						volun = 1;
 					}
-					if (!tvt || tvt >= 16)
+					if (!tvt || tvt >= MAX_VT_NUMBER) {
 						continue;
-				} else {
-					if (++tvt >= 16)
+					}
+				}
+				else {
+					if (++tvt >= MAX_VT_NUMBER) {
 						break;
+					}
 					volun = 1;
 				}
 				for (cd = displays; cd; cd = cd->next) {
 					if (cd->reqSrvVT == tvt && /* protect from lusers */
-					    (cd->status != zombie || cd->zstatus != DS_REMOVE))
+						(cd->status != zombie || cd->zstatus != DS_REMOVE)) {
 						goto next;
+					}
 					if (cd->serverVT == tvt) {
-						if (cd->status != zombie || cd->zstatus == DS_REMOTE)
 ** Diff limit reached (max: 250 lines) **