View Issue Details

IDProjectCategoryView StatusLast Update
00018071003.1(2016/18)/Issue7+TC2Shell and Utilitiespublic2024-03-28 16:23
Reportercquike Assigned To 
PrioritynormalSeverityCommentTypeClarification Requested
Status ClosedResolutionRejected 
NameEnrique Garcia
Organization
User Reference
Section2.7 Redirection
Page Number(page or range of pages)
Line Number(Line or range of lines)
Interp Status---
Final Accepted Text
Summary0001807: Allow number of redirection open files to be up to OPEN_MAX / 2 - 1
DescriptionThe redirection description states that numbers are used to represent the file descriptors and that "all implementations shall support at least 0 to 9, inclusive, for use by the application".

The restriction to have "at least 9" seems a bit low to me, given that the implementation can support up to OPEN_MAX file descriptors. There are many pages in Internet that include examples like "exec 200<lock.file" that will fail in POSIX shells that don't allow more than 9 in the file descriptor.

Some shells, like dash (which by the way has a limit of strictly 9), duplicates the original file descriptor (https://git.kernel.org/pub/scm/utils/dash/dash.git/tree/src/TOUR), so in order to avoid issues with those implementations the file descriptor number shouldn't not be larger than OPEN_MAX / 2 - 1.
Desired ActionOn section "2.7 Redirection" of "Shell Command Language" change:

      ...The largest possible value is implementation-defined; however, all implementations shall support at least 0 to 9, inclusive, for use by the application....

to:

      ...The largest possible value shall be OPEN_MAX / 2 - 1, inclusive, for use by the application, where OPEN_MAX is defined in sysconf....
TagsNo tags attached.

Activities

kre

2024-02-25 05:45

reporter   bugnote:0006673

Limiting the largest value to OPEN_MAX/2 -1, just to support dash, seems
like the wrong thing to do.

I suspect maybe the intent was to require at least that many, rather than
at most that many, in which case the correct change would be to alter the
"however all implentations shall support" clause, and change that from 0 to 9
into something bigger. (That is, to limit applications to use values
less than OPEN_MAX/2 as more cannot be guaranteed to work - with the intent
being that anything up to that must be OK - rather than to make non-conforming
some other shell which allows even bigger values.)

Personally I see no reason for the limit to be less than OPEN_MAX - this
limit applies to the fd used, not to the number of open files that a shell
can support, I can't see how dash would be bothered (if it supported it)
by a script which did 1999>/dev/null (if on an implementation where OPEN_MAX
was 2000 - just as an example). When it does its dup (why I wonder?) so
it apparently has 2 fds internally, the other one (the internal only one) would
just be 20 or something.

On the other hand, and while the shell I maintain does allow fds to be much
bigger than 9 (anything the kernel will allow is OK), I'm not sure I see
a lot of reason for changing the standard to require it.

cquike

2024-03-06 10:37

reporter   bugnote:0006704

Yes, good point. Indeed the intention was to support "at least OPEN_MAX/2", so that POSIX-conforming applications can rely on using up to OPEN_MAX/2 in a portable way.

I rephrase the proposed change with feedback above:


 On section "2.7 Redirection" of "Shell Command Language" change:

      ...The largest possible value is implementation-defined; however, all implementations shall support at least 0 to 9, inclusive, for use by the application....

to:

      ...The largest possible value is implementation-defined; however, all implementations shall support at least OPEN_MAX / 2 - 1, inclusive, for use by the application....

geoffclare

2024-03-28 16:23

manager   bugnote:0006730

Making this change would actually have no effect on the highest fixed fd number a portable script can use in a redirection. This is because if the limit is OPEN_MAX/2 - 1, a portable script has to assume OPEN_MAX could have its lowest allowed value, _POSIX_OPEN_MAX, which happens to be 20, and 20/2 - 1 is 9.

So a use such as "exec 200<lock.file" as stated in the bug description would still be non-portable.

Higher fd numbers could be used if they are not fixed, by querying OPEN_MAX using getconf and using this to calculate a suitable fd number to put in a variable, then using "eval" to have the variable be expanded in a redirection, but the number of scripts that would take advantage of that is likely to be very small. Scripts can already use higher fd numbers, when supported by the particular shell being used, by checking using "eval" whether the number they want to use is accepted.

Therefore this bug is being rejected.

Issue History

Date Modified Username Field Change
2024-02-03 01:20 cquike New Issue
2024-02-03 01:20 cquike Name => Enrique Garcia
2024-02-03 01:20 cquike Section => 2.7 Redirection
2024-02-03 01:20 cquike Page Number => (page or range of pages)
2024-02-03 01:20 cquike Line Number => (Line or range of lines)
2024-02-25 05:45 kre Note Added: 0006673
2024-03-06 10:37 cquike Note Added: 0006704
2024-03-28 16:23 geoffclare Interp Status => ---
2024-03-28 16:23 geoffclare Note Added: 0006730
2024-03-28 16:23 geoffclare Status New => Closed
2024-03-28 16:23 geoffclare Resolution Open => Rejected