[PATCH] Prevent wordexp from modyfying terminal parameters

Jeff Johnston jjohnstn@redhat.com
Fri Jul 23 11:57:00 GMT 2010


On 07/22/2010 01:45 PM, Moulding, Dan - 0663 - MITLL wrote:
> I have found that calling wordexp can, as an unfortunate side effect, change
> the controlling terminal's parameters. I tracked the problem down to the way
> wordexp invokes Bash to perform word expansion: stdout and stderr are
> redirected to a pipe, but stdin is left alone. It seems that if Bash sees that
> stdin is connected to a terminal, then Bash will immediately reset the
> terminal's parameters (presumably to some state that Bash considers sane).
>
> The below patch is my first stab at fixing the problem. This makes wordexp also
> redirect stdin to the pipe before invoking Bash. It thereby prevents Bash from
> seeing it is connected to a terminal and avoids the reset of the controlling
> terminal's parameters.
>

Dan, can you provide a sample test scenario?

-- Jeff J.


> 2010-07-22  Dan Moulding<dmoulding@ll.mit.edu>
>
> 	* libc/posix/wordexp.c (wordexp): Prevent wordexp from modifying
> 	terminal parameters.
>
> ---
> Index: newlib/libc/posix/wordexp.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/posix/wordexp.c,v
> retrieving revision 1.1
> diff -u -p -r1.1 wordexp.c
> --- newlib/libc/posix/wordexp.c	31 Oct 2008 21:03:41 -0000	1.1
> +++ newlib/libc/posix/wordexp.c	22 Jul 2010 16:01:23 -0000
> @@ -159,7 +159,6 @@ wordexp(const char *words, wordexp_t *pw
>         /* In child process. */
>
>         /* Close read end of child's pipe. */
> -      close(fd[0]);
>         close(fd_err[0]);
>
>         /* Pipe standard output to parent process via fd. */
> @@ -178,6 +177,14 @@ wordexp(const char *words, wordexp_t *pw
>             close(fd_err[1]);
>           }
>
> +      /* Pipe standard input from parent process via fd. */
> +      if (fd[0] != STDIN_FILENO)
> +        {
> +	  dup2(fd[0], STDIN_FILENO);
> +          /* fd[0] no longer required. */
> +	  close(fd[0]);
> +	}
> +
>         if (flags&  WRDE_NOCMD)
>           execl("/bin/bash", "bash", "--protected", "--wordexp", words, (char *)0);
>         else



More information about the Newlib mailing list