--- rxvt-unicode/src/main.C 2006/01/08 08:49:20 1.168 +++ rxvt-unicode/src/main.C 2006/01/19 09:47:15 1.189 @@ -48,21 +48,6 @@ # 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]; @@ -78,7 +63,7 @@ return true; } -bool +void rxvt_push_locale (const char *locale) { strcpy (savelocale, curlocale); @@ -163,9 +148,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 @@ -189,6 +171,7 @@ #endif termwin_ev (this, &rxvt_term::x_cb), vt_ev (this, &rxvt_term::x_cb), + child_ev (this, &rxvt_term::child_cb), check_ev (this, &rxvt_term::check_cb), flush_ev (this, &rxvt_term::flush_cb), destroy_ev (this, &rxvt_term::destroy_cb), @@ -214,11 +197,7 @@ if (cmd_pid) kill (-cmd_pid, SIGHUP); -#ifdef UTMP_SUPPORT - privileged_utmp (RESTORE); -#endif - - pty.put (); + delete pty; pty = 0; } rxvt_term::~rxvt_term () @@ -245,9 +224,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); @@ -267,18 +243,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]) @@ -286,14 +257,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); @@ -321,9 +288,12 @@ #endif } +// child has exited, usually destroys void -rxvt_term::child_exit () +rxvt_term::child_cb (child_watcher &w, int status) { + HOOK_INVOKE ((this, HOOK_CHILD_EXIT, DT_INT, status, DT_END)); + cmd_pid = 0; if (!OPTION (Opt_hold)) @@ -348,9 +318,6 @@ #if HAVE_SCROLLBARS scrollbar_ev.stop (display); #endif -#if MENUBAR - menubar_ev.stop (display); -#endif #if TRANSPARENT rootwin_ev.stop (display); #endif @@ -383,7 +350,7 @@ void rxvt_term::destroy_cb (time_watcher &w) { - SET_R (this); + make_current (); delete this; } @@ -484,8 +451,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; @@ -498,9 +465,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 */ @@ -514,31 +478,20 @@ || (rs[Rs_perl_ext_2] && *rs[Rs_perl_ext_2]) || (rs[Rs_perl_eval] && *rs[Rs_perl_eval])) { -#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 (); + 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); @@ -548,10 +501,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)) { @@ -570,8 +519,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 (); @@ -582,22 +531,8 @@ static struct sig_handlers { - sig_watcher sw_chld, sw_term, sw_int; + sig_watcher sw_term, sw_int; - void sig_chld (sig_watcher &w) - { - // we are being called for every SIGCHLD, find the corresponding term - int pid; - - while ((pid = waitpid (-1, NULL, WNOHANG)) > 0) - for (rxvt_term **t = rxvt_term::termlist.begin (); t < rxvt_term::termlist.end (); t++) - if (pid == (*t)->cmd_pid) - { - (*t)->child_exit (); - break; - } - } - /* * Catch a fatal signal and tidy up before quitting */ @@ -613,30 +548,53 @@ } sig_handlers () - : sw_chld (this, &sig_handlers::sig_chld), - sw_term (this, &sig_handlers::sig_term), + : sw_term (this, &sig_handlers::sig_term), sw_int (this, &sig_handlers::sig_term) { } } sig_handlers; +char **rxvt_environ; // startup environment + void rxvt_init () { - /* - * Save and then give up any super-user privileges - * If we need privileges in any area then we must specifically request it. - * We should only need to be root in these cases: - * 1. write utmp entries on some systems - * 2. chown tty on some systems - */ - rxvt_privileges (SAVE); - rxvt_privileges (IGNORE); + uid_t uid = getuid (); + gid_t gid = getgid (); + + // before doing anything else, check for setuid/setgid operation, + // start the helper process and drop privileges + if (uid != geteuid () + || gid != getegid ()) + { +#if PTYTTY_HELPER + rxvt_ptytty_server (); +#else + rxvt_warn ("running setuid/setgid without pty helper compiled in, continuing unprivileged.\n"); +#endif + + // drop privileges +#if HAVE_SETRESUID + setresgid (gid, gid, gid); + setresuid (uid, uid, uid); +#elif HAVE_SETREUID + setregid (gid, gid); + setreuid (uid, uid); +#elif HAVE_SETUID + setgid (gid); + setuid (uid); +#endif + + if (uid != geteuid () + || gid != getegid ()) + rxvt_fatal ("unable to drop privileges, aborting.\n"); + } + + rxvt_environ = environ; signal (SIGHUP, SIG_IGN); signal (SIGPIPE, SIG_IGN); - sig_handlers.sw_chld.start (SIGCHLD); sig_handlers.sw_term.start (SIGTERM); sig_handlers.sw_int.start (SIGINT); @@ -647,9 +605,7 @@ // TODO: handle this with exceptions and tolerate the memory loss XSetIOErrorHandler (rxvt_xioerror_handler); -#ifdef USE_XGETDEFAULT XrmInitialize (); -#endif } /* ------------------------------------------------------------------------- * @@ -688,75 +644,6 @@ return p; } -/* ------------------------------------------------------------------------- * - * PRIVILEGED OPERATIONS * - * ------------------------------------------------------------------------- */ -/* take care of suid/sgid super-user (root) privileges */ -void -rxvt_privileges (rxvt_privaction action) -{ -#if ! defined(__CYGWIN32__) -# if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) - /* setreuid () is the poor man's setuid (), seteuid () */ -# define seteuid(a) setreuid(-1, (a)) -# define setegid(a) setregid(-1, (a)) -# define HAVE_SETEUID -# endif -# ifdef HAVE_SETEUID - switch (action) - { - case IGNORE: - /* - * change effective uid/gid - not real uid/gid - so we can switch - * back to root later, as required - */ - seteuid (getuid ()); - setegid (getgid ()); - break; - case SAVE: - saved_euid = geteuid (); - saved_egid = getegid (); - break; - case RESTORE: - seteuid (saved_euid); - setegid (saved_egid); - break; - } -# else - switch (action) - { - case IGNORE: - setuid (getuid ()); - setgid (getgid ()); - /* FALLTHROUGH */ - case SAVE: - /* FALLTHROUGH */ - case RESTORE: - break; - } -# endif -#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. @@ -766,7 +653,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; @@ -837,10 +724,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; @@ -848,13 +735,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; @@ -882,7 +762,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) @@ -906,7 +786,7 @@ void rxvt_term::tt_winch () { - if (pty.pty < 0) + if (pty->pty < 0) return; struct winsize ws; @@ -915,7 +795,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 @@ -1247,7 +1127,7 @@ if (fix_screen || newwidth != old_width || newheight != old_height) { - if (scrollbar_visible ()) + if (scrollBar.state) { XMoveResizeWindow (disp, scrollBar.win, window_sb_x, 0, @@ -1255,11 +1135,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); @@ -1453,6 +1328,8 @@ char **s; XIMStyles *xim_styles; + set_environ (envv); + if (! ((p = XSetLocaleModifiers (modifiers)) && *p)) return false; @@ -1627,7 +1504,7 @@ char **s; char buf[IMBUFSIZ]; - SET_R (this); + make_current (); im_destroy ();