--- rxvt-unicode/src/main.C 2006/01/08 00:20:12 1.165 +++ rxvt-unicode/src/main.C 2006/01/17 15:17:39 1.185 @@ -48,6 +48,21 @@ # include #endif +#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__) +static uid_t saved_euid; +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]; @@ -63,7 +78,7 @@ return true; } -bool +void rxvt_push_locale (const char *locale) { strcpy (savelocale, curlocale); @@ -148,9 +163,6 @@ #ifdef HAVE_SCROLLBARS scrollbar_ev (this, &rxvt_term::x_cb), #endif -#ifdef MENUBAR - menubar_ev (this, &rxvt_term::x_cb), -#endif #ifdef CURSOR_BLINK cursor_blink_ev (this, &rxvt_term::cursor_blink_cb), #endif @@ -203,7 +215,7 @@ privileged_utmp (RESTORE); #endif - pty.put (); + delete pty; pty = 0; } rxvt_term::~rxvt_term () @@ -230,9 +242,6 @@ #ifdef USE_XIM im_destroy (); #endif -#ifdef MENUBAR - if (menubarGC) XFreeGC (disp, menubarGC); -#endif #ifdef XTERM_SCROLLBAR if (xscrollbarGC) XFreeGC (disp, xscrollbarGC); if (ShadowGC) XFreeGC (disp, ShadowGC); @@ -252,18 +261,13 @@ if (upArrowHi) XFreePixmap (disp, upArrowHi); if (downArrowHi) XFreePixmap (disp, downArrowHi); #endif -#if defined(MENUBAR) || defined(RXVT_SCROLLBAR) +#ifdef RXVT_SCROLLBAR if (topShadowGC) XFreeGC (disp, topShadowGC); if (botShadowGC) XFreeGC (disp, botShadowGC); if (scrollbarGC) XFreeGC (disp, scrollbarGC); #endif if (gc) XFreeGC (disp, gc); -#if defined(MENUBAR) && (MENUBAR_MAX > 1) - delete menuBar.drawable; - //if (menuBar.win) - // XDestroyWindow (disp, menuBar.win); -#endif delete drawable; // destroy all windows if (parent[0]) @@ -271,7 +275,6 @@ } // TODO: free pixcolours, colours should become part of rxvt_display - delete pix_colors_focused; #if OFF_FOCUS_FADING delete pix_colors_unfocused; @@ -330,9 +333,6 @@ #if HAVE_SCROLLBARS scrollbar_ev.stop (display); #endif -#if MENUBAR - menubar_ev.stop (display); -#endif #if TRANSPARENT rootwin_ev.stop (display); #endif @@ -365,7 +365,7 @@ void rxvt_term::destroy_cb (time_watcher &w) { - SET_R (this); + make_current (); delete this; } @@ -466,8 +466,8 @@ rxvt_term::init (int argc, const char *const *argv) { SET_R (this); - set_locale (""); + set_environ (envv); // few things in X do not call setlocale :( if (!init_vars ()) return false; @@ -480,9 +480,6 @@ keyboard->register_done (); #endif -#if MENUBAR_MAX - menubar_read (rs[Rs_menu]); -#endif #ifdef HAVE_SCROLLBARS if (OPTION (Opt_scrollBar)) scrollBar.setIdle (); /* set existence for size calculations */ @@ -496,18 +493,33 @@ || (rs[Rs_perl_ext_2] && *rs[Rs_perl_ext_2]) || (rs[Rs_perl_eval] && *rs[Rs_perl_eval])) { - rxvt_perl.init (); +#if (defined(HAVE_SETEUID) || defined(HAVE_SETREUID)) && !defined(__CYGWIN32__) + // ignore some perl-related arguments if some bozo installed us set[ug]id + if (rxvt_tainted ()) + { + 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] = 0; + } + } +#endif + rxvt_perl.init (this); HOOK_INVOKE ((this, HOOK_INIT, DT_END)); } #endif + pty = rxvt_new_ptytty (); + create_windows (argc, argv); dDisp; init_xlocale (); - scr_reset (); /* initialize screen */ + scr_reset (); // initialize screen #if 0 XSynchronize (disp, True); @@ -517,10 +529,6 @@ if (OPTION (Opt_scrollBar)) resize_scrollbar (); /* create and map scrollbar */ #endif -#if (MENUBAR_MAX) - if (menubar_visible ()) - XMapWindow (disp, menuBar.win); -#endif #ifdef TRANSPARENT if (OPTION (Opt_transparent)) { @@ -539,8 +547,8 @@ 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 (); @@ -589,9 +597,13 @@ } } sig_handlers; +char **rxvt_environ; // startup environment + void rxvt_init () { + rxvt_environ = environ; + /* * Save and then give up any super-user privileges * If we need privileges in any area then we must specifically request it. @@ -615,6 +627,8 @@ old_xerror_handler = XSetErrorHandler ((XErrorHandler) rxvt_xerror_handler); // TODO: handle this with exceptions and tolerate the memory loss XSetIOErrorHandler (rxvt_xioerror_handler); + + XrmInitialize (); } /* ------------------------------------------------------------------------- * @@ -660,11 +674,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 () */ @@ -680,24 +689,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: - euid = geteuid (); - egid = getegid (); + saved_egid = getegid (); + saved_euid = geteuid (); break; case RESTORE: - seteuid (euid); - setegid (egid); + setegid (saved_egid); + seteuid (saved_euid); break; } # else switch (action) { case IGNORE: - setuid (getuid ()); setgid (getgid ()); + setuid (getuid ()); /* FALLTHROUGH */ case SAVE: /* FALLTHROUGH */ @@ -708,25 +717,6 @@ #endif } -#ifdef UTMP_SUPPORT -void -rxvt_term::privileged_utmp (rxvt_privaction action) -{ - if (OPTION (Opt_utmpInhibit) - || !pty.name || !*pty.name) - return; - - rxvt_privileges (RESTORE); - - if (action == SAVE) - makeutent (pty.name, rs[Rs_display_name]); - else - cleanutent (); - - rxvt_privileges (IGNORE); -} -#endif - /*----------------------------------------------------------------------*/ /* * window size/position calculcations for XSizeHint and other storage. @@ -736,7 +726,7 @@ rxvt_term::window_calc (unsigned int newwidth, unsigned int newheight) { short recalc_x, recalc_y; - int x, y, sb_w, mb_h, flags; + int x, y, sb_w, flags; unsigned int w, h; unsigned int max_width, max_height; dDisp; @@ -807,10 +797,10 @@ szHint.base_width = szHint.base_height = 2 * int_bwidth; - sb_w = mb_h = 0; + sb_w = 0; window_vt_x = window_vt_y = int_bwidth; - if (scrollbar_visible ()) + if (scrollBar.state) { sb_w = scrollbar_TotalWidth (); szHint.base_width += sb_w; @@ -818,13 +808,6 @@ window_vt_x += sb_w; } - if (menubar_visible ()) - { - mb_h = menuBar_TotalHeight (); - szHint.base_height += mb_h; - window_vt_y += mb_h; - } - szHint.width_inc = fwidth; szHint.height_inc = fheight; szHint.min_width = szHint.base_width + szHint.width_inc; @@ -852,7 +835,7 @@ szHint.height = szHint.base_height + height; } - if (scrollbar_visible () && OPTION (Opt_scrollBar_right)) + if (scrollBar.state && OPTION (Opt_scrollBar_right)) window_sb_x = szHint.width - sb_w; if (recalc_x) @@ -876,7 +859,7 @@ void rxvt_term::tt_winch () { - if (pty.pty < 0) + if (pty->pty < 0) return; struct winsize ws; @@ -885,7 +868,7 @@ ws.ws_row = nrow; ws.ws_xpixel = width; ws.ws_ypixel = height; - (void)ioctl (pty.pty, TIOCSWINSZ, &ws); + (void)ioctl (pty->pty, TIOCSWINSZ, &ws); #if 0 // TIOCSWINSZ⎈ is supposed to do this automatically and correctly @@ -1217,7 +1200,7 @@ if (fix_screen || newwidth != old_width || newheight != old_height) { - if (scrollbar_visible ()) + if (scrollBar.state) { XMoveResizeWindow (disp, scrollBar.win, window_sb_x, 0, @@ -1225,11 +1208,6 @@ resize_scrollbar (); } - if (menubar_visible ()) - XMoveResizeWindow (disp, menuBar.win, - window_vt_x, 0, - width, menuBar_TotalHeight ()); - XMoveResizeWindow (disp, vt, window_vt_x, window_vt_y, width, height); @@ -1423,6 +1401,8 @@ char **s; XIMStyles *xim_styles; + set_environ (envv); + if (! ((p = XSetLocaleModifiers (modifiers)) && *p)) return false; @@ -1597,7 +1577,7 @@ char **s; char buf[IMBUFSIZ]; - SET_R (this); + make_current (); im_destroy ();