[PATCH 5] shell: Only clear std handles when the shell task exits
Gedare Bloom
gedare at rtems.org
Sat Aug 8 14:10:39 UTC 2020
it should be applied with the doco patch from sebastian
On Sat, Aug 8, 2020 at 2:13 AM <chrisj at rtems.org> wrote:
>
> From: Chris Johns <chrisj at rtems.org>
>
> Clearing the std file handles when the main loop exited crashes
> telnetd as it reuses its session threads.
>
> Closes #3859
> ---
> cpukit/libmisc/shell/shell.c | 26 ++++++++++++++++++++++----
> 1 file changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/cpukit/libmisc/shell/shell.c b/cpukit/libmisc/shell/shell.c
> index 0b06e8b4d1..13ae411f9c 100644
> --- a/cpukit/libmisc/shell/shell.c
> +++ b/cpukit/libmisc/shell/shell.c
> @@ -234,12 +234,16 @@ static void rtems_shell_clear_shell_env(void)
> eno = pthread_setspecific(rtems_shell_current_env_key, NULL);
> if (eno != 0)
> rtems_error(0, "pthread_setspecific(shell_current_env_key): clear");
> +}
>
> - /*
> - * Clear stdin and stdout file pointers of they will be closed
> - */
> +/*
> + * Clear stdin, stdout and stderr file pointers so they will not be closed.
> + */
> +static void rtems_shell_clear_shell_std_handles(void)
> +{
> stdin = NULL;
> stdout = NULL;
> + stderr = NULL;
> }
>
> /*
> @@ -775,6 +779,7 @@ void rtems_shell_print_env(
> {
> if ( !shell_env ) {
> printk( "shell_env is NULL\n" );
> +
> return;
> }
> printk( "shell_env=%p\n"
> @@ -797,6 +802,7 @@ static rtems_task rtems_shell_task(rtems_task_argument task_argument)
> rtems_shell_env_t *shell_env = (rtems_shell_env_t*) task_argument;
> rtems_id wake_on_end = shell_env->wake_on_end;
> rtems_shell_main_loop( shell_env );
> + rtems_shell_clear_shell_std_handles();
> if (wake_on_end != RTEMS_INVALID_ID)
> rtems_event_send (wake_on_end, RTEMS_EVENT_1);
> rtems_task_exit();
> @@ -872,6 +878,11 @@ bool rtems_shell_main_loop(
> else
> stdout = stderr;
> } else if (strcmp(shell_env->output, "/dev/null") == 0) {
> + if (stdout == NULL) {
> + fprintf(stderr, "shell: stdout is NULLs\n");
> + rtems_shell_clear_shell_env();
> + return false;
> + }
> fclose (stdout);
> } else {
> FILE *output = fopen(shell_env->output,
> @@ -906,6 +917,13 @@ bool rtems_shell_main_loop(
> }
>
> if (!input_file) {
> + if (stdin == NULL) {
> + fprintf(stderr, "shell: stdin is NULLs\n");
> + if (stdoutToClose != NULL)
> + fclose(stdoutToClose);
> + rtems_shell_clear_shell_env();
> + return false;
> + }
> /* Make a raw terminal, Linux Manuals */
> if (tcgetattr(fileno(stdin), &previous_term) >= 0) {
> term = previous_term;
> @@ -967,7 +985,7 @@ bool rtems_shell_main_loop(
> * keep on trucking.
> */
> if (shell_env->login_check != NULL) {
> - result = rtems_shell_login(shell_env, stdin,stdout);
> + result = rtems_shell_login(shell_env, stdin, stdout);
> } else {
> setuid(shell_env->uid);
> setgid(shell_env->gid);
> --
> 2.19.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list