| #
bd208c69 |
| 06-Oct-2017 |
kre <kre@NetBSD.org> |
Three fixes and a change to ~ expansions
1. A serious bug introduced 3 1/2 months ago (approx) (rev 1.116) which broke all but the simple cases of ~ expansions is fixed (amazingly, given the m
Three fixes and a change to ~ expansions
1. A serious bug introduced 3 1/2 months ago (approx) (rev 1.116) which broke all but the simple cases of ~ expansions is fixed (amazingly, given the magnitude of this problem, no-one noticed!)
2. An ancient bug (probably from when ~ expansion was first addedin 1994, and certainly is in NetBSD-6 vintage shells) where ${UnSeT:-~} (and similar) does not expand the ~ is fixed (note that ${UnSeT:-~/} does expand, this should give a clue to the cause of the problem.
3. A fix/change to make the effects of ~ expansions on ${UnSeT:=whatever} identical to those in UnSeT=whatever In particular, with HOME=/foo ${UnSeT:=~:~} now assigns, and expands to, /foo:/foo rather than ~:~ just as VAR=~:~ assigns /foo:/foo to VAR. Note this is even after the previous fix (ie: appending a '/' would not change the results here.)
It is hard to call this one a bug fix for certain (though I believe it is) as many other shells also produce different results for the ${V:=...} expansions than they do for V=... (though not all the same as we did).
POSIX is not clear about this, expanding ~ after : in VAR=whatever assignments is clear, whether ${U:=whatever} assignments should be treated the same way is not stated, one way or the other.
4. Change to make ':' terminate the user name in a ~ expansion in all cases, not only in assignments. This makes sense, as ':' is one character that cannot occur in user names, no matter how otherwise weird they become. bash (incl in posix mode) ksh93 and bosh all act this way, whereas most other shells (and POSIX) do not. Because this is clearly an extension to POSIX, do this one only when not in posix mode (not set -o posix).
show more ...
|
| #
5f92382c |
| 21-Aug-2017 |
kre <kre@NetBSD.org> |
Add support for $'...' quoting (based upon C "..." strings, with \ expansions.)
Implementation largely obtained from FreeBSD, with adaptations to meet the needs and style of this sh, some updates to
Add support for $'...' quoting (based upon C "..." strings, with \ expansions.)
Implementation largely obtained from FreeBSD, with adaptations to meet the needs and style of this sh, some updates to agree with the current POSIX spec, and a few other minor changes.
The POSIX spec for this ( http://austingroupbugs.net/view.php?id=249 ) [see note 2809 for the current proposed text] is yet to be approved, so might change. It currently leaves several aspects as unspecified, this implementation handles those as:
Where more than 2 hex digits follow \x this implementation processes the first two as hex, the following characters are processed as if the \x sequence was not present. The value obtained from a \nnn octal sequence is truncated to the low 8 bits (if a bigger value is written, eg: \456.) Invalid escape sequences are errors. Invalid \u (or \U) code points are errors if known to be invalid, otherwise can generate a '?' character. Where any escape sequence generates nul ('\0') that char, and the rest of the $'...' string is discarded, but anything remaining in the word is processed, ie: aaa$'bbb\0ccc'ddd produces the same as aaa'bbb'ddd.
Differences from FreeBSD: FreeBSD allows only exactly 4 or 8 hex digits for \u and \U (as does C, but the current sh proposal differs.) reeBSD also continues consuming as many hex digits as exist after \x (permitted by the spec, but insane), and reject \u0000 as invalid). Some of this is possibly because that their implementation is based upon an earlier proposal, perhaps note 590 - though that has been updated several times.
Differences from the current POSIX proposal: We currently always generate UTF-8 for the \u & \U escapes. We should generate the equivalent character from the current locale's character set (and UTF8 only if that is what the current locale uses.) If anyone would like to correct that, go ahead.
We (and FreeBSD) generate (X & 0x1F) for \cX escapes where we should generate the appropriate control character (SOH for \cA for example) with whatever value that has in the current character set. Apart from EBCDIC, which we do not support, I've never seen a case where they differ, so ...
show more ...
|
| #
1fca9bbf |
| 30-Jun-2017 |
kre <kre@NetBSD.org> |
Implement PS1, PS2 and PS4 expansions (variable expansions, arithmetic expansions, and if enabled by the promptcmds option, command substitutions.)
|
| #
701ac132 |
| 19-Jun-2017 |
kre <kre@NetBSD.org> |
Now that excessive use of STACKSTRNUL has served its purpose (well, accidental purpose) in exposing the bug in its implementation, go back to not using it when not needed for DEBUG TRACE purposes.
Now that excessive use of STACKSTRNUL has served its purpose (well, accidental purpose) in exposing the bug in its implementation, go back to not using it when not needed for DEBUG TRACE purposes. This change should have no practical effect on either a DEBUG shell (where the STACKSTRNUL() calls remain) or a non DEBUG shell where they are not needed.
show more ...
|
| #
f72bc19e |
| 18-Jun-2017 |
kre <kre@NetBSD.org> |
NFC: DEBUG mode only change. Fix botched cleanup of one TRACE().
|
| #
ee3b307f |
| 17-Jun-2017 |
kre <kre@NetBSD.org> |
Many internal memory management type fixes.
PR bin/52302 (core dump with interactive shell, here doc and error on same line) is fixed. (An old bug.)
echo "$( echo x; for a in $( seq 1000 ); do
Many internal memory management type fixes.
PR bin/52302 (core dump with interactive shell, here doc and error on same line) is fixed. (An old bug.)
echo "$( echo x; for a in $( seq 1000 ); do printf '%s\n'; done; echo y )" consistently prints 1002 lines (x, 1000 empty ones, then y) as it should (And you don't want to know what it did before, or why.) (Another old one.)
(Recently added) Problems with ~ expansion fixed (mem management related).
Proper fix for the cwrappers configure problem (which includes the quick fix that was done earlier, but extends upon that to be correct). (This was another newly added problem.)
And the really devious (and rare) old bug - if STACKSTRNUL() needs to allocate a new buffer in which to store the \0, calculate the size of the string space remaining correctly, unlike when SPUTC() grows the buffer, there is no actual data being stored in the STACKSTRNUL() case - the string space remaining was calculated as one byte too few. That would be harmless, unless the next buffer also filled, in which case it was assumed that it was really full, not one byte less, meaning one junk char (a nul, or anything) was being copied into the next (even bigger buffer) corrupting the data.
Consistent use of stalloc() to allocate a new block of (stack) memory, and grabstackstr() to claim a block of (stack) memory that had already been occupied but not claimed as in use. Since grabstackstr is implemented as just a call to stalloc() this is a no-op change in practice, but makes it much easier to comprehend what is really happening. Previous code sometimes used stalloc() when the use case was really for grabstackstr(). Change grabstackstr() to actually use the arg passed to it, instead of (not much better than) guessing how much space to claim,
More care when using unstalloc()/ungrabstackstr() to return space, and in particular when the stack must be returned to its previous state, rather than just returning no-longer needed space, neither of those work. They also don't work properly if there have been (really, even might have been) any stack mem allocations since the last stalloc()/grabstackstr(). (If we know there cannot have been then the alloc/release sequence is kind of pointless.) To work correctly in general we must use setstackmark()/popstackmark() so do that when needed. Have those also save/restore the top of stack string space remaining.
[Aside: for those reading this, the "stack" mentioned is not in any way related to the thing used for maintaining the C function call state, ie: the "stack segment" of the program, but the shell's internal memory management strategy.]
More comments to better explain what is happening in some cases. Also cleaned up some hopelessly broken DEBUG mode data that were recently added (no effect on anyone but the poor semi-human attempting to make sense of it...).
User visible changes:
Proper counting of line numbers when a here document is delimited by a multi-line end-delimiter, as in
cat << 'REALLY END' here doc line 1 here doc line 2 REALLY END
(which is an obscure case, but nothing says should not work.) The \n in the end-delimiter of the here doc (the last one) was not incrementing the line number, which from that point on in the script would be 1 too low (or more, for end-delimiters with more than one \n in them.)
With tilde expansion: unset HOME; echo ~ changed to return getpwuid(getuid())->pw_home instead of failing (returning ~)
POSIX says this is unspecified, which makes it difficult for a script to compensate for being run without HOME set (as in env -i sh script), so while not able to be used portably, this seems like a useful extension (and is implemented the same way by some other shells).
Further, with HOME=; printf %s ~ we now write nothing (which is required by POSIX - which requires ~ to expand to the value of $HOME if it is set) previously if $HOME (in this case) or a user's directory in the passwd file (for ~user) were a null STRING, We failed the ~ expansion and left behind '~' or '~user'.
show more ...
|
| #
51791eab |
| 07-Jun-2017 |
kre <kre@NetBSD.org> |
PR bin/52280
removescapes_nl in expari() even when not quoted, CRTNONL's appear regardless of quoting (unlike CTLESC).
|
| #
69c48e32 |
| 07-Jun-2017 |
kre <kre@NetBSD.org> |
Set the line number before expanding args, not after. As the line_number would have usually been set earlier, this change is mostly an effective no-op, but it is better this way (just in case) - no
Set the line number before expanding args, not after. As the line_number would have usually been set earlier, this change is mostly an effective no-op, but it is better this way (just in case) - not observed to have caused any problems.
show more ...
|
| #
727a69dc |
| 07-Jun-2017 |
kre <kre@NetBSD.org> |
A better LINENO implementation. This version deletes (well, #if 0's out) the LINENO hack, and uses the LINENO var for both ${LINENO} and $((LINENO)). (Code to invert the LINENO hack when required,
A better LINENO implementation. This version deletes (well, #if 0's out) the LINENO hack, and uses the LINENO var for both ${LINENO} and $((LINENO)). (Code to invert the LINENO hack when required, like when de-compiling the execution tree to provide the "jobs" command strings, is still included, that can be deleted when the LINENO hack is completely removed - look for refs to VSLINENO throughout the code. The var funclinno in parser.c can also be removed, it is used only for the LINENO hack.)
This version produces accurate results: $((LINENO)) was made as accurate as the LINENO hack made ${LINENO} which is very good. That's why the LINENO hack is not yet completely removed, so it can be easily re-enabled. If you can tell the difference when it is in use, or not in use, then something has broken (or I managed to miss a case somewhere.)
The way that LINENO works is documented in its own (new) section in the man page, so nothing more about that, or the new options, etc, here.
This version introduces the possibility of having a "reference" function associated with a variable, which gets called whenever the value of the variable is required (that's what implements LINENO). There is just one function pointer however, so any particular variable gets at most one of the set function (as used for PATH, etc) or the reference function. The VFUNCREF bit in the var flags indicates which func the variable in question uses (if any - the func ptr, as before, can be NULL).
I would not call the results of this perfect yet, but it is close.
show more ...
|
| #
58810bf0 |
| 05-Jun-2017 |
kre <kre@NetBSD.org> |
Another arithmetic expansion recordregion() fix, this time calculate the lenght (used to calculate the end) based upon the correct starting point.
Thanks to John Klos for finding and reporting this
Another arithmetic expansion recordregion() fix, this time calculate the lenght (used to calculate the end) based upon the correct starting point.
Thanks to John Klos for finding and reporting this one.
show more ...
|
| #
aa681add |
| 04-Jun-2017 |
kre <kre@NetBSD.org> |
PR bin/52272 - fix an off-by one that broke ~ expansions.
|
| #
ea89b130 |
| 03-Jun-2017 |
kre <kre@NetBSD.org> |
DEBUG mode only change. Convert old trace style to new, and add some more. NFC for any non-DEBUG shell.
|
| #
d3573c91 |
| 03-Jun-2017 |
kre <kre@NetBSD.org> |
NFC: Code style only. Rather than being perverse and adding the negative of a negative number, just add a positive number instead... (the previous version came about purely as an accident of the wa
NFC: Code style only. Rather than being perverse and adding the negative of a negative number, just add a positive number instead... (the previous version came about purely as an accident of the way the relevant piece of code was added and debugged.... that's my story anyway!)
show more ...
|
| #
4dd9bbfe |
| 03-Jun-2017 |
kre <kre@NetBSD.org> |
The correct usage of recordregion() is (begin, end) not (begin, length).
Fixing this fixes a regression introduced earlier today (UTC) where arithmetic expressions would be split correctly when the
The correct usage of recordregion() is (begin, end) not (begin, length).
Fixing this fixes a regression introduced earlier today (UTC) where arithmetic expressions would be split correctly when the arithmetic started at the beginning of a word: echo $(( expression )) where "begin" is 0, and so (begin, length) is the same as (begin, begin+length) (aka: (begin,end) - and yes, "end" means 1 after last to consider). but did not work correctly when the usage was echo XXX$( expression )) (begin !+ 0) and would only split (some part of) the result of the expression.
This regression was also foung by the new t_fsplit:split_arith test case added earlier to the ATF tests for sh.
show more ...
|
| #
dd6b6414 |
| 03-Jun-2017 |
kre <kre@NetBSD.org> |
Fixes to shell expand (that is, $ stuff) from FreeBSD (implemented differently...)
In particular ${01} is now $1 not $0 (for ${0any-digits})
${4294967297} is most probably now "" (unless you
Fixes to shell expand (that is, $ stuff) from FreeBSD (implemented differently...)
In particular ${01} is now $1 not $0 (for ${0any-digits})
${4294967297} is most probably now "" (unless you have a very large number of params) it is no longer an alias for $1 (4294967297 & 0xFFFFFFFF) == 1
$(( expr $(( more )) stuff )) is no longer the same as $(( expr (( more )) stuff )) which was sometimes OK, as in: $(( 3 + $(( 2 - 1 )) * 3 )) but not always as in: $(( 1$((1 + 1))1 )) which should be 121, but was an arith syntax error as 1((1 + 1))1 is meaningless.
Probably some more. This also sprinkles a little const, splits a big func that had 2 (kind of unrelated) purposes into two simpler ones, and avoids some (semi-dubious) modifications (and restores) in the input string to insert \0's when they were needed.
show more ...
|
| #
f359a311 |
| 28-May-2017 |
kre <kre@NetBSD.org> |
Arrange for set -o and $- output to be sorted, rather than more or less random (and becoming worse as more options are added.) Since the data is known at compile time, sort at compile time, rather th
Arrange for set -o and $- output to be sorted, rather than more or less random (and becoming worse as more options are added.) Since the data is known at compile time, sort at compile time, rather than at run time.
show more ...
|
| #
8e4a570f |
| 26-Apr-2017 |
christos <christos@NetBSD.org> |
Convert the pattern matcher from recursive to backtracking (from FreeBSD).
|
| #
bda1f28d |
| 20-Mar-2017 |
kre <kre@NetBSD.org> |
PR bin/52090 - fix expansion of unquoted $*
|
| #
cc8e58ed |
| 20-Mar-2017 |
kre <kre@NetBSD.org> |
Finish support for all required $(( )) (shell arithmetic) operators, closing PR bin/50958
That meant adding the assignment operators ('=', and all of the +=, *= ...) Currently, ++, --, and ',' are n
Finish support for all required $(( )) (shell arithmetic) operators, closing PR bin/50958
That meant adding the assignment operators ('=', and all of the +=, *= ...) Currently, ++, --, and ',' are not implemented (none of those are required by posix) but support for them (most likely ',' first) might be added later.
To do this, I removed the yacc/lex arithmetic parser completely, and replaced it with a hand written recursive descent parser, that I obtained from FreeBSD, who earlier had obtained it from dash (Herbert Xu).
While doing the import, I cleaned up the sources (changed some file names to avoid requiring a clean build, or signifigant surgery to the obj directories if "build.sh -u" was to be used - "build.sh -u" should work fine as it is now) removed some dashisms, applied some KNF, ...
show more ...
|
| #
df029fcc |
| 12-Mar-2017 |
kre <kre@NetBSD.org> |
Fix for the "${unset-var#$(cmd1)}$(cmd2)" runs the wrong command bug. ... From FreeBSD
|
| #
9302f8ef |
| 31-Mar-2016 |
christos <christos@NetBSD.org> |
Implement the NETBSD_SHELL readonly unexportable unimportable variable (with its current value set at 20160401) as discussed on current-users and tech-userlevel. This also includes the necessary supp
Implement the NETBSD_SHELL readonly unexportable unimportable variable (with its current value set at 20160401) as discussed on current-users and tech-userlevel. This also includes the necessary support to implement it properly (particularly the unexportable part) and adds options to the export command to support unexportable variables. Also implement the "posix" option (no single letter equivalent) which gets its default value from whether or not POSIXLY_CORRECT is set in the environment when the shell starts (but can be changed just like any other option using -o and +o on the command line, or the set builtin command.) While there, fix all uses of options so it is possible to have options that have a short (one char) name, and no long name, just as it has been possible to have options with a long name and no short name, though there are currently none (with no long name). For now, the only use of the posix option is to control whether ${ENV} is read at startup by a non-interactive shell, so changing it with set is not usful - that might change in the future. (from kre@)
show more ...
|
| #
b322b670 |
| 31-Mar-2016 |
christos <christos@NetBSD.org> |
After discussions with Jilles Tjoelker (FreeBSD shell) and following a suggestion from him, the way the fix to PR bin/50993 was implemented has changed a little. There are three steps involved in p
After discussions with Jilles Tjoelker (FreeBSD shell) and following a suggestion from him, the way the fix to PR bin/50993 was implemented has changed a little. There are three steps involved in processing a here document, reading it, parsing it, and then evaluating it before applying it to the correct file descriptor for the command to use. The third of those is not related to this problem, and has not changed. The bug was caused by combining the first two steps into one (and not doing it correctly - which would be hard that way.) The fix is to split the first two stages into separate events. The original fix moved the 2nd stage (parsing) to just immediately before the 3rd stage (evaluation.) Jilles pointed out some unwanted side effects from doing it that way, and suggested moving the 2nd stage to immediately after the first. This commit makes that change. The effect is to revert the changes to expand.c and parser.h (which are no longer needed) and simplify slightly the change to parser.c. (from kre@)
show more ...
|
| #
1d1484aa |
| 27-Mar-2016 |
christos <christos@NetBSD.org> |
PR bin/50993 - this is a significant rewrite of the way that here documents are processed. Now, when first detected, they are simply read (the only change made to the text is to join lines ended wit
PR bin/50993 - this is a significant rewrite of the way that here documents are processed. Now, when first detected, they are simply read (the only change made to the text is to join lines ended with a \ to the subsequent line, otherwise end marker detection does not work correctly (for here docs with an unquoted endmarker only of course.) This patch also moves the "internal subroutine" for looking for the end marker out of readtoken1() (which had to happen as readtoken1 is no longer reading the here doc when it is needed) - that uses code mostly taken from FreeBSD's sh (thanks!) and along the way results in some restrictions on what the end marker can be being removed. We still do not allow all we should. (from kre@)
show more ...
|
| #
ca12a0b8 |
| 27-Mar-2016 |
christos <christos@NetBSD.org> |
General KNF and source code cleanups, avoid scattering the magic string " \t\n" all over the place, slightly improved syntax error messages, restructured some of the code for clarity, don't allow IFS
General KNF and source code cleanups, avoid scattering the magic string " \t\n" all over the place, slightly improved syntax error messages, restructured some of the code for clarity, don't allow IFS to be imported through the environment, and remove the (never) conditionally compiled ATTY option. Apart from one or two syntax error messages, and ignoring IFS if present in the environment, this is intended to have no user visible changes. (from kre@)
show more ...
|
| #
8c844a2e |
| 16-Mar-2016 |
christos <christos@NetBSD.org> |
PR/19832, PR/35423: Fix handling 0x81 and 0x82 characters in expansions ($VAR etc) that are used to generate filenames for redirections. (from kre)
|