call chroot right before exec instead of right after fork

This is because we still need access to /dev/pts/1 until
right before exec
This commit is contained in:
Ray Strode 2007-10-21 19:49:44 -04:00
parent 78302f06c3
commit 431924effe
3 changed files with 14 additions and 9 deletions

View file

@ -54,6 +54,7 @@ struct _ply_terminal_session
uint32_t is_running : 1;
uint32_t console_is_redirected : 1;
uint32_t change_root_to_current_directory : 1;
};
static bool ply_terminal_session_open_console (ply_terminal_session_t *session);
@ -109,6 +110,12 @@ ply_terminal_session_execute (ply_terminal_session_t *session,
if (!ply_terminal_session_open_console (session))
return false;
if (session->change_root_to_current_directory)
{
if (chroot (".") < 0)
return false;
}
if (look_in_path)
execvp (session->argv[0], session->argv);
else
@ -132,6 +139,7 @@ ply_terminal_session_new (const char * const *argv)
session->logger = ply_logger_new ();
session->is_running = false;
session->console_is_redirected = false;
session->change_root_to_current_directory = false;
return session;
}
@ -237,6 +245,9 @@ ply_terminal_session_run (ply_terminal_session_t *session,
should_redirect_console =
(flags & PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE) != 0;
session->change_root_to_current_directory =
(flags & PLY_TERMINAL_SESSION_FLAGS_CHANGE_ROOT_TO_CURRENT_DIRECTORY) != 0;
ply_trace ("creating terminal device");
if (!ply_terminal_create_device (session->terminal))
return false;

View file

@ -41,7 +41,8 @@ typedef enum
PLY_TERMINAL_SESSION_FLAGS_NONE = 0x0,
PLY_TERMINAL_SESSION_FLAGS_RUN_IN_PARENT = 0x1,
PLY_TERMINAL_SESSION_FLAGS_LOOK_IN_PATH = 0x2,
PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE = 0x4
PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE = 0x4,
PLY_TERMINAL_SESSION_FLAGS_CHANGE_ROOT_TO_CURRENT_DIRECTORY = 0x8,
} ply_terminal_session_flags_t;
#ifndef PLY_HIDE_FUNCTION_DECLARATIONS

View file

@ -62,14 +62,6 @@ on_session_start (state_t *state)
"to start session: %m");
return;
}
if (chroot (".") < 0)
{
ply_trace ("Could not change root back to original directory "
"to start session: %m");
return;
}
ply_trace ("changed to original root fs");
}
static void
@ -165,6 +157,7 @@ spawn_session (state_t *state,
flags |= PLY_TERMINAL_SESSION_FLAGS_RUN_IN_PARENT;
flags |= PLY_TERMINAL_SESSION_FLAGS_LOOK_IN_PATH;
flags |= PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE;
flags |= PLY_TERMINAL_SESSION_FLAGS_CHANGE_ROOT_TO_CURRENT_DIRECTORY;
ply_trace ("opening terminal session for '%s'", argv[0]);
session = ply_terminal_session_new ((const char * const *) argv);