NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

bin/49125: /bin/sh does not support redirecting to or from FDs > 9



>Number:         49125
>Category:       bin
>Synopsis:       /bin/sh does not support redirecting to or from FDs > 9
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    bin-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Aug 19 08:55:00 +0000 2014
>Originator:     Havard Eidnes
>Release:        NetBSD 6.1.4
>Organization:
        None
>Environment:
        
        
System: NetBSD smistad.uninett.no 6.1.4 NetBSD 6.1.4 (MAANEN) #2: Sat May 17 
15:02:30 CEST 2014 
he%smistad.uninett.no@localhost:/usr/obj/sys/arch/i386/compile/MAANEN i386
Architecture: i386
Machine: i386
>Description:
        It does not look like our /bin/sh supports redirection to FDs
        with a numeric value above 9:

$ (echo x) 10>/dev/null
sh: Syntax error: word unexpected
$ 
$ echo x 2>&10      
sh: Syntax error: Bad fd number
$ 

        as opposed to

$ echo x 2>&5 
sh: 5: Bad file descriptor
$ 

        Our /bin/ksh also doesn't do this:

$ (echo x) 10>/dev/null
ksh: syntax error: `10' unexpected
ksh: 
$ (echo x) 9>/dev/null
x
$ 

        while bash accepts it willingly:

bash-4.3$ (echo x) 10>/dev/null
x
bash-4.3$ 


>How-To-Repeat:
        See above.

>Fix:
        Looking at the /bin/sh parser.c, it's evident that
        readtoken1() has something to do with this.  I suspect the
        test for len<=2 in this has something to do with it:

        if (eofmark == NULL) {
                if ((c == '>' || c == '<')
                 && quotef == 0
                 && len <= 2
                 && (*out == '\0' || is_digit(*out))) {
                        PARSEREDIR();
                        return lasttoken = TREDIR;
                } else {
                        pungetc();
                }
        }

        If len > 2, a "word" token is returned, and you get the error
        listed in the first example above.

        The handling under the parseredir label also assumes that the
        FD just consists of a single digit, since it just does
        "digit_val(fd)" and "fd" is just a single char.

        The code in fixredir() (same file) is responsible for the "Bad
        fd number" error message, and also assumes just a single
        digit.

        Our sh(1) man page just says "number", and not that it needs
        to be just a single digit.

        The ksh(1) man page does specify, though, that "fd" needs to
        be a single digit with the "<&" and ">&" redirections.  It
        does however look like the ksh(1) man page doesn't actually
        document the "fd>" redirections, although it has an example
        using it at the end of the "Input/Output Redirection" section.

        Whether FDs over 9 are supposed to be supported or whether
        it's a bash extension should be looked into; if our shell
        should not support it, the example in the flock(1) man page
        needs to be fixed, since it doesn't work with either our
        /bin/sh or our /bin/ksh.

>Unformatted:
        
        


Home | Main Index | Thread Index | Old Index