tReally _does_ work with GTK+ 1.2.9 now (drops _all_ privileges, even the saved group ID) - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit dce44c4d5f93daa2fee494d82233ad03ce10fd94
 (DIR) parent 445c533b2ee5fa5f4f33fbf0b88b1a21bd75c213
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Wed, 11 Apr 2001 20:24:16 +0000
       
       Really _does_ work with GTK+ 1.2.9 now (drops _all_ privileges, even the
       saved group ID)
       
       
       Diffstat:
         M src/curses_client.c                 |       4 ++++
         M src/dopewars.c                      |      17 -----------------
         M src/dopewars.h                      |       3 ---
         M src/gtk_client.c                    |       4 ++++
         M src/serverside.c                    |      71 +++++++++++++++++--------------
         M src/serverside.h                    |       3 ++-
         M src/winmain.c                       |       2 --
       
       7 files changed, 48 insertions(+), 56 deletions(-)
       ---
 (DIR) diff --git a/src/curses_client.c b/src/curses_client.c
       t@@ -1824,6 +1824,8 @@ void CursesLoop() {
           start_curses();
           Width=COLS; Depth=LINES;
        
       +   InitHighScoreFile();
       +
        /* Set up message handlers */
           ClientMessageHandlerPt = HandleClientMessage;
           SocketWriteTestPt = NULL;
       t@@ -1849,6 +1851,8 @@ void CursesLoop() {
           }
           g_free(Name);
           end_curses();
       +
       +   CloseHighScoreFile();
        }
        
        #else
 (DIR) diff --git a/src/dopewars.c b/src/dopewars.c
       t@@ -43,8 +43,6 @@
        #include "tstring.h"
        #include "AIPlayer.h"
        
       -static gid_t RealGID,EffGID;
       -
        int ClientSock,ListenSock;     
        char Network,Client,Server,NotifyMetaServer,AIPlayer;
        /* dopewars acting as standalone TCP server:
       t@@ -1666,25 +1664,10 @@ void HandleCmdLine(int argc,char *argv[]) {
           }
        }
        
       -void GetGroupIDs() {
       -   RealGID = getgid();
       -   EffGID = getegid();
       -}
       -
       -void DropPrivileges() {
       -   if (setgid(RealGID)!=0) perror("setgid");
       -}
       -
       -void GoPrivileged() {
       -   if (setgid(EffGID)!=0) perror("setgid");
       -}
       -
        #ifndef CYGWIN
        
        /* Standard program entry - Win32 uses WinMain() instead, in winmain.c */
        int main(int argc,char *argv[]) {
       -   GetGroupIDs();
       -   DropPrivileges();
        #ifdef ENABLE_NLS
           setlocale(LC_ALL,"");
           bindtextdomain(PACKAGE,LOCALEDIR);
 (DIR) diff --git a/src/dopewars.h b/src/dopewars.h
       t@@ -405,7 +405,4 @@ void PrintConfigValue(int GlobalIndex,int StructIndex,gboolean IndexGiven,
        void SetConfigValue(int GlobalIndex,int StructIndex,gboolean IndexGiven,
                            GScanner *scanner);
        gboolean IsCop(Player *Play);
       -void GetGroupIDs();
       -void DropPrivileges();
       -void GoPrivileged();
        #endif
 (DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
       t@@ -1618,6 +1618,8 @@ char GtkLoop(int *argc,char **argv[],char ReturnOnFail) {
           GtkAdjustment *adj;
           gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
        
       +   InitHighScoreFile();
       +
        #ifdef CYGWIN
           win32_init(hInstance,hPrevInstance);
        #else
       t@@ -1709,6 +1711,8 @@ char GtkLoop(int *argc,char **argv[],char ReturnOnFail) {
           gtk_widget_show(window);
        
           gtk_main();
       +
       +   CloseHighScoreFile();
           return TRUE;
        }
        
 (DIR) diff --git a/src/serverside.c b/src/serverside.c
       t@@ -65,6 +65,9 @@ GSList *FirstServer=NULL;
        
        static GScanner *Scanner;
        
       +/* Handle to the high score file */
       +static FILE *ScoreFP=NULL;
       +
        /* Pointer to the filename of a pid file (if non-NULL) */
        char *PidFile;
        
       t@@ -564,14 +567,9 @@ gboolean ReadServerKey(GString *LineBuf,gboolean *EndOfLine) {
        void StartServer() {
           struct sockaddr_in ServerAddr;
           struct sigaction sact;
       +
           Scanner=g_scanner_new(&ScannerConfig);
           Scanner->input_name="(stdin)";
       -   if (!CheckHighScoreFile()) {
       -      g_error(_("Cannot open high score file %s.\n"
       -                "Either ensure you have permissions to access this file and "
       -                "directory, or\nspecify an alternate high score file with "
       -                "the -f command line option."),HiScoreFile);
       -   }
           CreatePidFile();
        
        /* Make the output line-buffered, so that the log file (if used) is */
       t@@ -741,6 +739,8 @@ void ServerLoop() {
           GString *LineBuf;
           gboolean EndOfLine;
        
       +   InitHighScoreFile();
       +
           StartServer();
        
           LineBuf=g_string_new("");
       t@@ -826,6 +826,8 @@ void ServerLoop() {
           }
           StopServer();
           g_string_free(LineBuf,TRUE);
       +
       +   CloseHighScoreFile();
        }
        #endif /* NETWORKING */
        
       t@@ -872,33 +874,39 @@ void HighScoreTypeWrite(struct HISCORE *HiScore,FILE *fp) {
           }
        }
        
       -gboolean CheckHighScoreFile() {
       -/* Tests to see whether the high score file is is read-and-writable        */
       -   FILE *fp;
       -   GoPrivileged();
       -   fp=fopen(HiScoreFile,"a+");
       -   DropPrivileges();
       -   if (fp) {
       -      fclose(fp);
       -      return TRUE;
       -   } else {
       -      return FALSE;
       +void CloseHighScoreFile() {
       +/* Closes the high score file opened by InitHighScoreFile, below */
       +   if (ScoreFP) fclose(ScoreFP);
       +}
       +
       +void InitHighScoreFile() {
       +/* Opens the high score file for later use, and then drops privileges.      */
       +/* If the high score file cannot be found, exits the program with an error. */
       +
       +   if (ScoreFP) return;  /* If already opened, then we're done */
       +
       +   ScoreFP=fopen(HiScoreFile,"a+");
       +
       +   if (setregid(getgid(),getgid())!=0) perror("setregid");
       +
       +   if (!ScoreFP) {
       +      g_warning(_("Cannot open high score file %s.\n"
       +                "Either ensure you have permissions to access this file and "
       +                "directory, or\nspecify an alternate high score file with "
       +                "the -f command line option."),HiScoreFile);
       +      exit(1);
           }
        }
        
        int HighScoreRead(struct HISCORE *MultiScore,struct HISCORE *AntiqueScore) {
        /* Reads all the high scores into MultiScore and                           */
        /* AntiqueScore (antique mode scores). Returns 1 on success, 0 on failure. */
       -   FILE *fp;
           memset(MultiScore,0,sizeof(struct HISCORE)*NUMHISCORE);
           memset(AntiqueScore,0,sizeof(struct HISCORE)*NUMHISCORE);
       -   GoPrivileged();
       -   fp=fopen(HiScoreFile,"r");
       -   DropPrivileges();
       -   if (fp) {
       -      HighScoreTypeRead(AntiqueScore,fp);
       -      HighScoreTypeRead(MultiScore,fp);
       -      fclose(fp);
       +   if (ScoreFP) {
       +      rewind(ScoreFP);
       +      HighScoreTypeRead(AntiqueScore,ScoreFP);
       +      HighScoreTypeRead(MultiScore,ScoreFP);
           } else return 0;
           return 1;
        }
       t@@ -906,14 +914,11 @@ int HighScoreRead(struct HISCORE *MultiScore,struct HISCORE *AntiqueScore) {
        int HighScoreWrite(struct HISCORE *MultiScore,struct HISCORE *AntiqueScore) {
        /* Writes out all the high scores from MultiScore and AntiqueScore; returns */
        /* 1 on success, 0 on failure.                                              */
       -   FILE *fp;
       -   GoPrivileged();
       -   fp=fopen(HiScoreFile,"w");
       -   DropPrivileges();
       -   if (fp) {
       -      HighScoreTypeWrite(AntiqueScore,fp);
       -      HighScoreTypeWrite(MultiScore,fp);
       -      fclose(fp);
       +   if (ScoreFP) {
       +      ftruncate(fileno(ScoreFP),0);
       +      rewind(ScoreFP);
       +      HighScoreTypeWrite(AntiqueScore,ScoreFP);
       +      HighScoreTypeWrite(MultiScore,ScoreFP);
           } else return 0;
           return 1;
        }
 (DIR) diff --git a/src/serverside.h b/src/serverside.h
       t@@ -65,7 +65,8 @@ void SetFightTimeout(Player *Play);
        void ClearFightTimeout(Player *Play);
        int GetMinimumTimeout(GSList *First);
        GSList *HandleTimeouts(GSList *First);
       -gboolean CheckHighScoreFile();
       +void InitHighScoreFile();
       +void CloseHighScoreFile();
        int HighScoreRead(struct HISCORE *MultiScore,struct HISCORE *AntiqueScore);
        void CopsAttackPlayer(Player *Play);
        void AttackPlayer(Player *Play,Player *Attacked);
 (DIR) diff --git a/src/winmain.c b/src/winmain.c
       t@@ -59,8 +59,6 @@ int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
                             LPSTR lpszCmdParam,int nCmdShow) {
           gchar **split;
           int argc;
       -   GetGroupIDs();
       -   DropPrivileges();
        #ifdef ENABLE_NLS
           setlocale(LC_ALL,"");
           bindtextdomain(PACKAGE,LOCALEDIR);