Michael Thomas cc5a4cd
diff -Naur --exclude '*.swp' bsd-games-2.17/phantasia/gamesupport.c bsd-games-2.17.new/phantasia/gamesupport.c
Michael Thomas cc5a4cd
--- bsd-games-2.17/phantasia/gamesupport.c	2006-04-27 22:51:04.000000000 -0700
Michael Thomas cc5a4cd
+++ bsd-games-2.17.new/phantasia/gamesupport.c	2006-04-27 21:01:11.000000000 -0700
Michael Thomas cc5a4cd
@@ -518,7 +518,10 @@
Michael Thomas cc5a4cd
 	long    loc = 0L;	/* location in scoreboard file */
Michael Thomas cc5a4cd
 	bool    found = FALSE;	/* set if we found an entry for this login */
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
-	if ((fp = fopen(_PATH_SCORE, "r+")) != NULL) {
Michael Thomas cc5a4cd
+        SET_PRIV_GID;
Michael Thomas cc5a4cd
+	fp = fopen(_PATH_SCORE, "r+");
Michael Thomas cc5a4cd
+        DROP_PRIV_GID;
Michael Thomas cc5a4cd
+	if (fp != NULL) {
Michael Thomas cc5a4cd
 		while (fread((char *) &sbuf, SZ_SCORESTRUCT, 1, fp) == 1)
Michael Thomas cc5a4cd
 			if (strcmp(Player.p_login, sbuf.sb_login) == 0) {
Michael Thomas cc5a4cd
 				found = TRUE;
Michael Thomas cc5a4cd
diff -Naur --exclude '*.swp' bsd-games-2.17/phantasia/interplayer.c bsd-games-2.17.new/phantasia/interplayer.c
Michael Thomas cc5a4cd
--- bsd-games-2.17/phantasia/interplayer.c	2006-04-27 22:51:04.000000000 -0700
Michael Thomas cc5a4cd
+++ bsd-games-2.17.new/phantasia/interplayer.c	2006-04-27 21:01:45.000000000 -0700
Michael Thomas cc5a4cd
@@ -640,14 +640,18 @@
Michael Thomas cc5a4cd
 		mvaddstr(4, 0, "You have become king!\n");
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
 		/* let everyone else know */
Michael Thomas cc5a4cd
+                SET_PRIV_GID;
Michael Thomas cc5a4cd
 		fp = fopen(_PATH_MESS, "w");
Michael Thomas cc5a4cd
+                DROP_PRIV_GID;
Michael Thomas cc5a4cd
 		fprintf(fp, "All hail the new king!");
Michael Thomas cc5a4cd
 		fclose(fp);
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
 		/* clear all energy voids; retain location of holy grail */
Michael Thomas cc5a4cd
 		fseek(Energyvoidfp, 0L, SEEK_SET);
Michael Thomas cc5a4cd
 		fread((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, Energyvoidfp);
Michael Thomas cc5a4cd
+                SET_PRIV_GID;
Michael Thomas cc5a4cd
 		fp = fopen(_PATH_VOID, "w");
Michael Thomas cc5a4cd
+                DROP_PRIV_GID;
Michael Thomas cc5a4cd
 		fwrite((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, fp);
Michael Thomas cc5a4cd
 		fclose(fp);
Michael Thomas cc5a4cd
 	}
Michael Thomas cc5a4cd
@@ -716,7 +720,10 @@
Michael Thomas cc5a4cd
 			break;
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
 		case '5':	/* collect accumulated taxes */
Michael Thomas cc5a4cd
-			if ((fp = fopen(_PATH_GOLD, "r+")) != NULL)
Michael Thomas cc5a4cd
+                        SET_PRIV_GID;
Michael Thomas cc5a4cd
+			fp = fopen(_PATH_GOLD, "r+");
Michael Thomas cc5a4cd
+                        DROP_PRIV_GID;
Michael Thomas cc5a4cd
+			if (fp != NULL)
Michael Thomas cc5a4cd
 				/* collect taxes */
Michael Thomas cc5a4cd
 			{
Michael Thomas cc5a4cd
 				fread((char *) &temp1, sizeof(double), 1, fp);
Michael Thomas cc5a4cd
diff -Naur --exclude '*.swp' bsd-games-2.17/phantasia/macros.h bsd-games-2.17.new/phantasia/macros.h
Michael Thomas cc5a4cd
--- bsd-games-2.17/phantasia/macros.h	1997-07-17 09:42:20.000000000 -0700
Michael Thomas cc5a4cd
+++ bsd-games-2.17.new/phantasia/macros.h	2006-04-27 22:49:40.000000000 -0700
Michael Thomas cc5a4cd
@@ -4,6 +4,10 @@
Michael Thomas cc5a4cd
  * macros.h - macro definitions for Phantasia
Michael Thomas cc5a4cd
  */
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
+/* setgid macros */
Michael Thomas cc5a4cd
+#define SET_PRIV_GID setgid(phant_gid)
Michael Thomas cc5a4cd
+#define DROP_PRIV_GID setgid(getgid())
Michael Thomas cc5a4cd
+
Michael Thomas cc5a4cd
 #define ROLL(BASE,INTERVAL)	floor((BASE) + (INTERVAL) * drandom())
Michael Thomas cc5a4cd
 #define SGN(X)		((X) < 0 ? -1 : 1)
Michael Thomas cc5a4cd
 #define CIRCLE(X, Y)	floor(distance(X, 0.0, Y, 0.0) / 125.0 + 1)
Michael Thomas cc5a4cd
diff -Naur --exclude '*.swp' bsd-games-2.17/phantasia/main.c bsd-games-2.17.new/phantasia/main.c
Michael Thomas cc5a4cd
--- bsd-games-2.17/phantasia/main.c	2006-04-27 22:51:04.000000000 -0700
Michael Thomas cc5a4cd
+++ bsd-games-2.17.new/phantasia/main.c	2006-04-27 21:00:46.000000000 -0700
Michael Thomas cc5a4cd
@@ -61,6 +61,9 @@
Michael Thomas cc5a4cd
 #undef bool
Michael Thomas cc5a4cd
 #include <curses.h>
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
+
Michael Thomas cc5a4cd
+gid_t   phant_gid;
Michael Thomas cc5a4cd
+
Michael Thomas cc5a4cd
 int	main(int, char **);
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
 int
Michael Thomas cc5a4cd
@@ -74,6 +77,9 @@
Michael Thomas cc5a4cd
 	time_t  seconds;		/* for time of day */
Michael Thomas cc5a4cd
 	double  dtemp;			/* for temporary calculations */
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
+        phant_gid = getegid();
Michael Thomas cc5a4cd
+        DROP_PRIV_GID;
Michael Thomas cc5a4cd
+
Michael Thomas cc5a4cd
 	initialstate();			/* init globals */
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
 	/* process arguments */
Michael Thomas cc5a4cd
@@ -290,22 +296,28 @@
Michael Thomas cc5a4cd
 		Login = getpwuid(getuid())->pw_name;
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
 	/* open some files */
Michael Thomas cc5a4cd
+        SET_PRIV_GID;
Michael Thomas cc5a4cd
 	if ((Playersfp = fopen(_PATH_PEOPLE, "r+")) == NULL)
Michael Thomas cc5a4cd
 		error(_PATH_PEOPLE);
Michael Thomas cc5a4cd
+        DROP_PRIV_GID;
Michael Thomas cc5a4cd
 	/* NOTREACHED */
Michael Thomas cc5a4cd
 	if (fileno(Playersfp) < 3)
Michael Thomas cc5a4cd
 		exit(1);
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
+        SET_PRIV_GID;
Michael Thomas cc5a4cd
 	if ((Monstfp = fopen(_PATH_MONST, "r+")) == NULL)
Michael Thomas cc5a4cd
 		error(_PATH_MONST);
Michael Thomas cc5a4cd
+        DROP_PRIV_GID;
Michael Thomas cc5a4cd
 	/* NOTREACHED */
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
 	if ((Messagefp = fopen(_PATH_MESS, "r")) == NULL)
Michael Thomas cc5a4cd
 		error(_PATH_MESS);
Michael Thomas cc5a4cd
 	/* NOTREACHED */
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
+        SET_PRIV_GID;
Michael Thomas cc5a4cd
 	if ((Energyvoidfp = fopen(_PATH_VOID, "r+")) == NULL)
Michael Thomas cc5a4cd
 		error(_PATH_VOID);
Michael Thomas cc5a4cd
+        DROP_PRIV_GID;
Michael Thomas cc5a4cd
 	if (fstat(fileno(Energyvoidfp), &sb) == -1)
Michael Thomas cc5a4cd
 		error("stat");
Michael Thomas cc5a4cd
 	if (sb.st_size == 0) {
Michael Thomas cc5a4cd
@@ -508,7 +520,9 @@
Michael Thomas cc5a4cd
 		getstring(Databuf, SZ_DATABUF);
Michael Thomas cc5a4cd
 		/* we open the file for writing to erase any data which is
Michael Thomas cc5a4cd
 		 * already there */
Michael Thomas cc5a4cd
+                SET_PRIV_GID;
Michael Thomas cc5a4cd
 		fp = fopen(_PATH_MESS, "w");
Michael Thomas cc5a4cd
+                DROP_PRIV_GID;
Michael Thomas cc5a4cd
 		if (Databuf[0] != '\0')
Michael Thomas cc5a4cd
 			fprintf(fp, "%s: %s", Player.p_name, Databuf);
Michael Thomas cc5a4cd
 		fclose(fp);
Michael Thomas cc5a4cd
diff -Naur --exclude '*.swp' bsd-games-2.17/phantasia/misc.c bsd-games-2.17.new/phantasia/misc.c
Michael Thomas cc5a4cd
--- bsd-games-2.17/phantasia/misc.c	2006-04-27 22:51:04.000000000 -0700
Michael Thomas cc5a4cd
+++ bsd-games-2.17.new/phantasia/misc.c	2006-04-27 21:02:34.000000000 -0700
Michael Thomas cc5a4cd
@@ -651,14 +651,18 @@
Michael Thomas cc5a4cd
 	enterscore();		/* update score board */
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
 	/* put info in last dead file */
Michael Thomas cc5a4cd
+        SET_PRIV_GID;
Michael Thomas cc5a4cd
 	fp = fopen(_PATH_LASTDEAD, "w");
Michael Thomas cc5a4cd
+        DROP_PRIV_GID;
Michael Thomas cc5a4cd
 	fprintf(fp, "%s (%s, run by %s, level %.0f, killed by %s)",
Michael Thomas cc5a4cd
 	    Player.p_name, descrtype(&Player, TRUE),
Michael Thomas cc5a4cd
 	    Player.p_login, Player.p_level, how);
Michael Thomas cc5a4cd
 	fclose(fp);
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
 	/* let other players know */
Michael Thomas cc5a4cd
+        SET_PRIV_GID;
Michael Thomas cc5a4cd
 	fp = fopen(_PATH_MESS, "w");
Michael Thomas cc5a4cd
+        DROP_PRIV_GID;
Michael Thomas cc5a4cd
 	fprintf(fp, "%s was killed by %s.", Player.p_name, how);
Michael Thomas cc5a4cd
 	fclose(fp);
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
@@ -1060,7 +1064,10 @@
Michael Thomas cc5a4cd
 	}
Michael Thomas cc5a4cd
 	Player.p_gold -= taxes;
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
-	if ((fp = fopen(_PATH_GOLD, "r+")) != NULL)
Michael Thomas cc5a4cd
+        SET_PRIV_GID;
Michael Thomas cc5a4cd
+	fp = fopen(_PATH_GOLD, "r+");
Michael Thomas cc5a4cd
+        DROP_PRIV_GID;
Michael Thomas cc5a4cd
+	if (fp != NULL)
Michael Thomas cc5a4cd
 		/* update taxes */
Michael Thomas cc5a4cd
 	{
Michael Thomas cc5a4cd
 		dtemp = 0.0;
Michael Thomas cc5a4cd
diff -Naur --exclude '*.swp' bsd-games-2.17/phantasia/phantglobs.h bsd-games-2.17.new/phantasia/phantglobs.h
Michael Thomas cc5a4cd
--- bsd-games-2.17/phantasia/phantglobs.h	2006-04-27 22:51:04.000000000 -0700
Michael Thomas cc5a4cd
+++ bsd-games-2.17.new/phantasia/phantglobs.h	2006-04-27 20:25:34.000000000 -0700
Michael Thomas cc5a4cd
@@ -4,6 +4,7 @@
Michael Thomas cc5a4cd
  * phantglobs.h - global declarations for Phantasia
Michael Thomas cc5a4cd
  */
Michael Thomas cc5a4cd
 
Michael Thomas cc5a4cd
+extern  gid_t   phant_gid;      /* gid under which the game runs */
Michael Thomas cc5a4cd
 extern	double	Circle;		/* which circle player is in */
Michael Thomas cc5a4cd
 extern	double	Shield;		/* force field thrown up in monster battle */
Michael Thomas cc5a4cd