diff options
Diffstat (limited to 'games/battlestar/save.c')
-rw-r--r-- | games/battlestar/save.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/games/battlestar/save.c b/games/battlestar/save.c index ec4b4f5..8b72506 100644 --- a/games/battlestar/save.c +++ b/games/battlestar/save.c @@ -55,10 +55,13 @@ restore() sprintf(home1, "%.*s/Bstar", MAXPATHLEN - 7, home); else return; + setegid(egid); if ((fp = fopen(home1, "r")) == 0) { perror(home1); + setegid(getgid()); return; } + setegid(getgid()); fread(&WEIGHT, sizeof WEIGHT, 1, fp); fread(&CUMBER, sizeof CUMBER, 1, fp); fread(&gclock, sizeof gclock, 1, fp); @@ -112,30 +115,36 @@ save() return; sprintf(home1, "%.*s/Bstar", MAXPATHLEN - 7, home); + setegid(egid); /* Try to open the file safely. */ if (stat(home1, &sbuf) < 0) { fd = open(home1, O_WRONLY|O_CREAT|O_EXCL); if (fd < 0) { fprintf(stderr, "Can't create %s\n", home1); + setegid(getgid()); return; } } else { - if (sbuf.st_nlink > 1) { + if (sbuf.st_mode & S_IFLNK) { fprintf(stderr, "No symlinks!\n"); + setegid(getgid()); return; } fd = open(home1, O_WRONLY|O_EXCL); if (fd < 0) { fprintf(stderr, "Can't open %s for writing\n", home1); + setegid(getgid()); return; } } if ((fp = fdopen(fd, "w")) == 0) { perror(home1); + setegid(getgid()); return; } + setegid(getgid()); printf("Saved in %s.\n", home1); fwrite(&WEIGHT, sizeof WEIGHT, 1, fp); |