--- rxvt-unicode/src/main.C 2006/01/08 08:43:11 1.167 +++ rxvt-unicode/src/main.C 2006/01/12 00:11:13 1.174 @@ -53,6 +53,16 @@ static gid_t saved_egid; #endif +bool +rxvt_tainted () +{ +#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__) + return getuid () != saved_euid || getgid () != saved_egid; +#else + return false; +#endif +} + vector rxvt_term::termlist; static char curlocale[128], savelocale[128]; @@ -68,7 +78,7 @@ return true; } -bool +void rxvt_push_locale (const char *locale) { strcpy (savelocale, curlocale); @@ -276,14 +286,10 @@ } // TODO: free pixcolours, colours should become part of rxvt_display - delete pix_colors_focused; #if OFF_FOCUS_FADING delete pix_colors_unfocused; #endif -#if USE_XGETDEFAULT - XrmDestroyDatabase (xrmdatabase); -#endif displays.put (display); @@ -475,26 +481,32 @@ { SET_R (this); - set_locale (""); + const char **cmd_argv; + + { + TEMP_ENV; // few things in X do not call setlocale :( - if (!init_vars ()) - return false; + set_locale (""); - init_secondary (); + if (!init_vars ()) + return false; - const char **cmd_argv = init_resources (argc, argv); + init_secondary (); + + cmd_argv = init_resources (argc, argv); #ifdef KEYSYM_RESOURCE - keyboard->register_done (); + keyboard->register_done (); #endif #if MENUBAR_MAX - menubar_read (rs[Rs_menu]); + menubar_read (rs[Rs_menu]); #endif #ifdef HAVE_SCROLLBARS - if (OPTION (Opt_scrollBar)) - scrollBar.setIdle (); /* set existence for size calculations */ + if (OPTION (Opt_scrollBar)) + scrollBar.setIdle (); /* set existence for size calculations */ #endif + } #if ENABLE_PERL if (!rs[Rs_perl_ext_1]) @@ -504,72 +516,73 @@ || (rs[Rs_perl_ext_2] && *rs[Rs_perl_ext_2]) || (rs[Rs_perl_eval] && *rs[Rs_perl_eval])) { - 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) + if (rxvt_tainted ()) { - 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"; + rs[Rs_perl_lib] = 0; + rs[Rs_perl_eval] = 0; } } #endif - rxvt_perl.init (tainted); + rxvt_perl.init (); + setlocale (LC_CTYPE, curlocale); // perl destroys this info HOOK_INVOKE ((this, HOOK_INIT, DT_END)); } #endif - create_windows (argc, argv); + { + TEMP_ENV; - dDisp; + create_windows (argc, argv); + + dDisp; - init_xlocale (); + init_xlocale (); - scr_reset (); /* initialize screen */ + scr_reset (); // initialize screen #if 0 - XSynchronize (disp, True); + XSynchronize (disp, True); #endif #ifdef HAVE_SCROLLBARS - if (OPTION (Opt_scrollBar)) - resize_scrollbar (); /* create and map scrollbar */ + if (OPTION (Opt_scrollBar)) + resize_scrollbar (); /* create and map scrollbar */ #endif #if (MENUBAR_MAX) - if (menubar_visible ()) - XMapWindow (disp, menuBar.win); + if (menubar_visible ()) + XMapWindow (disp, menuBar.win); #endif #ifdef TRANSPARENT - if (OPTION (Opt_transparent)) - { - XSelectInput (disp, display->root, PropertyChangeMask); - check_our_parents (); - rootwin_ev.start (display, display->root); - } + if (OPTION (Opt_transparent)) + { + XSelectInput (disp, display->root, PropertyChangeMask); + check_our_parents (); + rootwin_ev.start (display, display->root); + } #endif - XMapWindow (disp, vt); - XMapWindow (disp, parent[0]); + XMapWindow (disp, vt); + XMapWindow (disp, parent[0]); - set_colorfgbg (); + set_colorfgbg (); - init_command (cmd_argv); + init_command (cmd_argv); - free (cmd_argv); + free (cmd_argv); - if (pty.pty >= 0) - pty_ev.start (pty.pty, EVENT_READ); + if (pty.pty >= 0) + pty_ev.start (pty.pty, EVENT_READ); - check_ev.start (); + check_ev.start (); - HOOK_INVOKE ((this, HOOK_START, DT_END)); + HOOK_INVOKE ((this, HOOK_START, DT_END)); + } return true; } @@ -641,9 +654,7 @@ // TODO: handle this with exceptions and tolerate the memory loss XSetIOErrorHandler (rxvt_xioerror_handler); -#ifdef USE_XGETDEFAULT XrmInitialize (); -#endif } /* ------------------------------------------------------------------------- * @@ -704,24 +715,24 @@ * change effective uid/gid - not real uid/gid - so we can switch * back to root later, as required */ - seteuid (getuid ()); setegid (getgid ()); + seteuid (getuid ()); break; case SAVE: - saved_euid = geteuid (); saved_egid = getegid (); + saved_euid = geteuid (); break; case RESTORE: - seteuid (saved_euid); setegid (saved_egid); + seteuid (saved_euid); break; } # else switch (action) { case IGNORE: - setuid (getuid ()); setgid (getgid ()); + setuid (getuid ()); /* FALLTHROUGH */ case SAVE: /* FALLTHROUGH */ @@ -1447,6 +1458,8 @@ char **s; XIMStyles *xim_styles; + TEMP_ENV; + if (! ((p = XSetLocaleModifiers (modifiers)) && *p)) return false;