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);