--- rxvt-unicode/src/main.C 2006/01/08 00:20:12 1.165 +++ rxvt-unicode/src/main.C 2006/01/08 08:43:11 1.167 @@ -48,6 +48,11 @@ # include #endif +#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__) +static uid_t saved_euid; +static gid_t saved_egid; +#endif + vector rxvt_term::termlist; static char curlocale[128], savelocale[128]; @@ -276,6 +281,9 @@ #if OFF_FOCUS_FADING delete pix_colors_unfocused; #endif +#if USE_XGETDEFAULT + XrmDestroyDatabase (xrmdatabase); +#endif displays.put (display); @@ -496,7 +504,24 @@ || (rs[Rs_perl_ext_2] && *rs[Rs_perl_ext_2]) || (rs[Rs_perl_eval] && *rs[Rs_perl_eval])) { - rxvt_perl.init (); + bool tainted = false; + +#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__) + // ignore some perl-related arguments if some bozo installed us set[ug]id + if (getuid () != saved_euid || getgid () != saved_egid) + { + tainted = true; + + if ((rs[Rs_perl_lib] && *rs[Rs_perl_lib]) + || (rs[Rs_perl_eval] && *rs[Rs_perl_eval])) + { + rxvt_warn ("running with elevated privileges: ignoring perl-lib and perl-eval.\n"); + rs[Rs_perl_lib] = 0; + rs[Rs_perl_eval] = "our $tainted = 1"; + } + } +#endif + rxvt_perl.init (tainted); HOOK_INVOKE ((this, HOOK_INIT, DT_END)); } #endif @@ -615,6 +640,10 @@ old_xerror_handler = XSetErrorHandler ((XErrorHandler) rxvt_xerror_handler); // TODO: handle this with exceptions and tolerate the memory loss XSetIOErrorHandler (rxvt_xioerror_handler); + +#ifdef USE_XGETDEFAULT + XrmInitialize (); +#endif } /* ------------------------------------------------------------------------- * @@ -660,11 +689,6 @@ void rxvt_privileges (rxvt_privaction action) { -#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__) - static uid_t euid; - static gid_t egid; -#endif - #if ! defined(__CYGWIN32__) # if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) /* setreuid () is the poor man's setuid (), seteuid () */ @@ -684,12 +708,12 @@ setegid (getgid ()); break; case SAVE: - euid = geteuid (); - egid = getegid (); + saved_euid = geteuid (); + saved_egid = getegid (); break; case RESTORE: - seteuid (euid); - setegid (egid); + seteuid (saved_euid); + setegid (saved_egid); break; } # else