diff --git a/srogue/daemon.c b/srogue/daemon.c index f405990..0888437 100644 --- a/srogue/daemon.c +++ b/srogue/daemon.c @@ -173,5 +173,5 @@ do_fuses() activity() { msg("Daemons = %d : Memory Items = %d : Memory Used = %d", - demoncnt,total,sbrk(0)); + demoncnt,total,md_memused()); } diff --git a/srogue/list.c b/srogue/list.c index 776b4e8..473f38d 100644 --- a/srogue/list.c +++ b/srogue/list.c @@ -102,7 +102,7 @@ int size; register char *space = ALLOC(size); if (space == NULL) { - sprintf(prbuf,"Rogue ran out of memory (%d).",sbrk(0)); + sprintf(prbuf,"Rogue ran out of memory (%d).", md_memused()); fatal(prbuf); } total++; diff --git a/srogue/main.c b/srogue/main.c index 8494add..c68a3d6 100644 --- a/srogue/main.c +++ b/srogue/main.c @@ -29,8 +29,6 @@ #endif #ifdef BSD -#define srand48(seed) srandom(seed) -#define lrand48() random() #include #endif @@ -57,13 +55,8 @@ char **envp; if (homedir == NULL) homedir = ""; - playuid = getuid(); - - if (setuid(playuid) < 0) { - printf("Cannot change to effective uid: %d\n", playuid); - exit(1); - } - playgid = getgid(); + playuid = md_getuid(); + playgid = md_getgid(); /* check for print-score option */ #ifdef SCOREFILE @@ -121,6 +114,9 @@ char **envp; } #endif + if (!use_savedir) + md_droppriv(); + /* get home and options from environment */ if ((env = getenv("HOME")) != NULL) @@ -177,7 +173,7 @@ char **envp; fflush(stdout); seed = dnum; - srand48(seed); /* init rnd number gen */ + srandom(seed); /* init rnd number gen */ md_onsignal_exit(); /* just in case */ @@ -358,7 +354,7 @@ int range; if (range == 0) wh = 0; else { - wh = lrand48() % range; + wh = random() % range; wh &= 0x7FFFFFFF; } return wh; diff --git a/srogue/mdport.c b/srogue/mdport.c index 6160c30..57e5d31 100644 --- a/srogue/mdport.c +++ b/srogue/mdport.c @@ -413,6 +413,16 @@ md_getuid(void) #endif } +gid_t +md_getgid(void) +{ +#ifdef HAVE_GETGID + return( getgid() ); +#else + return(42); +#endif +} + pid_t md_getpid(void) { @@ -1509,3 +1519,51 @@ md_stop_checkout_timer(void) #endif +long +md_memused(void) +{ +#ifdef _WIN32 + MEMORYSTATUS stat; + + GlobalMemoryStatus(&stat); + + return((long)stat.dwTotalPageFile); +#else + return( (long)sbrk(0) ); +#endif +} + +void +md_droppriv(void) +{ +#if defined(HAVE_GETUID) + uid_t realuid = getuid(); + +#if defined(HAVE_SETRESUID) + if (setresuid(-1, realuid, realuid) != 0) { +#elif defined (HAVE_SETREUID) + if (setreuid(realuid, realuid) != 0) { +#elif defined (HAVE_SETUID) + if (setuid(realuid) != 0) { +#else + if (0) { +#endif + printf("Cannot change to effective uid: %d\n", realuid); + exit(1); + } +#endif +} + +extern uid_t playuid; +extern gid_t playgid; + +void +md_resetpriv(void) +{ +#if defined (HAVE_SETUID) + setuid(playuid); +#endif +#if defined (HAVE_SETGID) + setgid(playgid); +#endif +} diff --git a/srogue/rogue.h b/srogue/rogue.h index 9c9a8a4..b66191c 100644 --- a/srogue/rogue.h +++ b/srogue/rogue.h @@ -43,6 +43,7 @@ int md_erasechar(void); char *md_gethomedir(void); char *md_getusername(void); uid_t md_getuid(void); +gid_t md_getgid(void); char *md_getpass(char *prompt); pid_t md_getpid(void); char *md_getrealname(uid_t uid); @@ -67,6 +68,9 @@ void md_onsignal_autosave(void); void md_onsignal_exit(void); void md_onsignal_default(void); int md_issymlink(char *sp); +long md_memused(void); +void md_droppriv(void); +void md_resetpriv(void); char *xcrypt(const char *key, const char *setting); #define reg register /* register abbr. */ diff --git a/srogue/save.c b/srogue/save.c index db1400f..1a97d00 100644 --- a/srogue/save.c +++ b/srogue/save.c @@ -26,10 +26,6 @@ #include "rogue.h" #include "rogue.ext" -#ifdef BSD -#define srand48(seed) srandom(seed) -#endif - EXTCHAR version[]; EXTCHAR *ctime(); @@ -144,8 +140,7 @@ dosave() ignore(); if (!use_savedir) { - setuid(playuid); - setgid(playgid); + md_resetpriv(); } umask(022); @@ -302,8 +297,7 @@ char *file, **envp; /* set id to unlink file */ if(pid == 0) { - setuid(playuid); - setgid(playgid); + md_resetpriv(); unlink(file); exit(0); } @@ -350,6 +344,6 @@ char *file, **envp; strcpy(file_name, file); setup(); restscr(cw); - srand48(getpid()); + srandom(getpid()); playit(); }