Hi David,
David CARLIER wrote on Sun, Mar 15, 2015 at 09:09:25AM +:
As tetris is one of my preferred game :-) ... just did wrapper around
setegid in same manner than xmalloc and such. If it can find any use ...
This doesn't make sense to me.
The global variables gid and egid are only set at one place;
actually, it's visible in your patch itself in tetris.c.
So we know both are always the process's real, effective, or saved GID.
Consequently, setegid() cannot fail, and there is no need to check.
Even if it could fail, error handling is already in place:
err(1, cannot open %s for %s, _PATH_SCOREFILE, human);
err(1, cannot fdopen %s for %s, _PATH_SCOREFILE, human);
That's also visible in your patch.
To summarize, there is no need to change anything.
Yours,
Ingo
Index: scores.c
===
RCS file: /cvs/src/games/tetris/scores.c,v
retrieving revision 1.12
diff -u -p -r1.12 scores.c
--- scores.c 16 Nov 2014 04:49:49 - 1.12
+++ scores.c 15 Mar 2015 09:08:46 -
@@ -111,11 +111,11 @@ getscores(FILE **fpp)
human = reading;
lck = LOCK_SH;
}
- setegid(egid);
+ xsetegid(egid);
mask = umask(S_IWOTH);
sd = open(_PATH_SCOREFILE, mint, 0666);
(void)umask(mask);
- setegid(gid);
+ xsetegid(gid);
if (sd 0) {
if (fpp == NULL) {
nscores = 0;
@@ -123,10 +123,10 @@ getscores(FILE **fpp)
}
err(1, cannot open %s for %s, _PATH_SCOREFILE, human);
}
- setegid(egid);
+ xsetegid(egid);
if ((sf = fdopen(sd, mstr)) == NULL)
err(1, cannot fdopen %s for %s, _PATH_SCOREFILE, human);
- setegid(gid);
+ xsetegid(gid);
/*
* Grab a lock.
Index: tetris.c
===
RCS file: /cvs/src/games/tetris/tetris.c,v
retrieving revision 1.25
diff -u -p -r1.25 tetris.c
--- tetris.c 16 Nov 2014 04:49:49 - 1.25
+++ tetris.c 15 Mar 2015 09:08:46 -
@@ -161,7 +161,7 @@ main(int argc, char *argv[])
gid = getgid();
egid = getegid();
- setegid(gid);
+ xsetegid(gid);
classic = showpreview = 0;
while ((ch = getopt(argc, argv, ck:l:ps)) != -1)
@@ -363,4 +363,11 @@ usage(void)
{
(void)fprintf(stderr, usage: tetris [-cps] [-k keys] [-l level]\n);
exit(1);
+}
+
+void
+xsetegid(gid_t gid)
+{
+if (setegid(gid) == -1)
+err(1, setegid() failed);
}
Index: tetris.h
===
RCS file: /cvs/src/games/tetris/tetris.h,v
retrieving revision 1.10
diff -u -p -r1.10 tetris.h
--- tetris.h 10 Aug 2008 12:23:25 - 1.10
+++ tetris.h 15 Mar 2015 09:08:46 -
@@ -176,3 +176,4 @@ extern intclassic;
int fits_in(const struct shape *, int);
void place(const struct shape *, int, int);
void stop(char *);
+void xsetegid(gid_t);