summary refs log tree commit diff
path: root/Src/exec.c
Commit message (Collapse)AuthorAgeFilesLines
* 47794: exec: run final pipeline command in a subshell in sh modebrian m. carlson2021-04-101-4/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | zsh typically runs the final command in a pipeline in the main shell instead of a subshell. However, POSIX specifies that all commands in a pipeline run in a subshell, but permits zsh's behavior as an extension. The default /bin/sh implementations on various Linux distros and the BSDs always use a subshell for all components of a pipeline. Since zsh may be used as /bin/sh in some cases (such as macOS Catalina), it makes sense to have the common sh behavior when emulating sh, so do that by checking for being the final item of a multi-item pipeline and creating a subshell in that case. From the comment above execpline(), we know the following: last1 is a flag that this command is the last command in a shell that is about to exit, so we can exec instead of forking. It gets passed all the way down to execcmd() which actually makes the decision. A 0 is always passed if the command is not the last in the pipeline. […] If last1 is zero but the command is at the end of a pipeline, we pass 2 down to execcmd(). So there are three cases to consider in this code: • last1 is 0, which means we are not at the end of a pipeline, in which case we should not change behavior. • last1 is 1, which means we are effectively running in a subshell, because nothing that happens due to the exec is going to affect the actual shell, since it will have been replaced. So there is nothing to do here. • last1 is 2, which means our command is at the end of the pipeline, so in sh mode we should create a subshell by forking. input is nonzero if the input to this process is a pipe that we've opened. At the end of a multi-stage pipeline, it will necessarily be nonzero. Note that several of the tests may appear bizarre, since most developers do not place useless variable assignments directly at the end of a pipeline. However, as the function tests demonstrate, there are cases where assignments may occur when a shell function is used at the end of a command. The remaining assignment tests simply test additional cases, such as the use of local, that would otherwise be untested.
* Allow more scripts without #!Justine Tunney2021-02-161-4/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This change modifies the zsh binary safety check surrounding execve() so it can run shell scripts having concatenated binary content. We're using the same safety check as FreeBSD /bin/sh [1]. POSIX was recently revised to require this behavior: "The input file may be of any type, but the initial portion of the file intended to be parsed according to the shell grammar (XREF to XSH 2.10.2 Shell Grammar Rules) shall consist of characters and shall not contain the NUL character. The shell shall not enforce any line length limits." "Earlier versions of this standard required that input files to the shell be text files except that line lengths were unlimited. However, that was overly restrictive in relation to the fact that shells can parse a script without a trailing newline, and in relation to a common practice of concatenating a shell script ending with an 'exit' or 'exec $command' with a binary data payload to form a single-file self-extracting archive." [2] [3] One example use case of such scripts, is the Cosmopolitan C Library [4] which configuse the GNU Linker to output a polyglot shell+binary format that runs on Linux / Mac / Windows / FreeBSD / OpenBSD. [1] https://github.com/freebsd/freebsd-src/commit/9a1cd363318b7e9e70ef6af27d1675b371c16b1a [2] http://austingroupbugs.net/view.php?id=1250 [3] http://austingroupbugs.net/view.php?id=1226#c4394 [4] https://justine.lol/cosmopolitan/index.html
* 46268: suppress a useless compiler warning around nice()Roman Perepelitsa2020-07-281-2/+1
| | | | | | | From nice(2): To detect an error, set errno to 0 before the call, and check whether it is nonzero after nice() returns -1.
* 46175/0003: Fix the RM_STAR_SILENT bug from the parent commit.Daniel Shahaf2020-07-051-1/+1
|
* 46026: Add CLOBBER_EMPTY option.Peter Stephenson2020-06-091-5/+22
|
* users/24909: Don't clean up special file list too early.Peter Stephenson2020-06-081-1/+1
| | | | | When running a function, remove special files used for substitution after the function has run rather than before.
* 45923 (with memory leak fixed, cf. 45924): zprof: Don't tally all anonymous ↵Daniel Shahaf2020-05-281-2/+18
| | | | | | | | | | | | | | | | | | | | | | | | | functions as though they were a single function named "(anon)". Before: % zmodload zsh/zprof % () : % () : % zprof num calls time self name ----------------------------------------------------------------------------------- 1) 2 0.08 0.04 100.00% 0.08 0.04 100.00% (anon) After: % zmodload zsh/zprof % () : % () : % zprof num calls time self name ----------------------------------------------------------------------------------- 1) 1 0.04 0.04 50.45% 0.04 0.04 50.45% (anon) [:3] 2) 1 0.04 0.04 49.55% 0.04 0.04 49.55% (anon) [:2]
* 45583/0008: Add the 'function -T' syntax.Daniel Shahaf2020-03-221-3/+5
| | | | Config/version.mk was bumped in the previous commit.
* 45583/0007: WC_FUNCDEF: Add a placeholder element.Daniel Shahaf2020-03-221-1/+2
|
* 45583/0001: internal: Remove a redundant assignment.Daniel Shahaf2020-03-221-1/+0
| | | | The value is overwritten five lines below, without being read in the interim.
* Merge remote-tracking branch 'origin/master' into 5.9Daniel Shahaf2020-03-071-4/+2
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Test/D02glob.ztst: On the "unreadable directories can be globbed (users/24619, users/24626)" test, resolve conflicts by removing the Cygwin-only skip that has been added in master, since the test is passing on this branch. This effectively reverts workers/45492. See discussion starting in workers/45504. * origin/master: unposted: Remove 'sgi', as that OpenBSD port has been discontinued. 45509: fix typos in B01cd.ztst 45490 (+45495 and a test): refactor rlimits.c github #49: Fix typo: longson should be loongson users/24710: Fix job control problem with sudo. 45492: skip test added by users/24633 on Cygwin 45488: COMP_WORDS for bash need "$@"-style quoting 45487: Missing mod_export declarations for AIX 45447: Complete vcs_info_hookadd and vcs_info_hookdel. Expose _vcs_info_hooks as a top-level helper function. 45463: test: kill: Document why we use SIGURG 45453: builtins: kill: Do not signal current process group when pid is empty 45452: builtins: kill: Add `kill ''` regression test with explicit sigspec 45451: builtins: kill: Add basic test suite github #48/0002: vcs_info git: properly detect bare repositories github #48/0001: vcs_info git: avoid warnings in bare repositories unposted: Post-release version bump unposted: Release 5.8 CVE-2019-20044: Update change log for preceding commits Update NEWS/README Add unsetopt/PRIVILEGED tests Clean up error-message white space Improve PRIVILEGED fixes (again) Improve PRIVILEGED fixes Drop privileges securely unposted: V01zmodload: Fix failing test from workers/45385 45423: _su: Improve arg handling, shell look-ups unposted: _zip: Recognise '--' 45385: Add a test for 'zmodload -Fa' preemptively disabling ("blacklisting"?) features. unposted: Test release: 5.7.1-test-3 zsh/system: Fix infinite loop in sysread _diff_options: Restore -w completion lost in workers/43351 unposted: Fix ChangeLog typo. 45368: Add tests for workers/45367's issue about double slashes in 'cd -P' and /home/daniel/in/zsh. 45373: Fix ERR_EXIT bug in else branch of if. 45372: Record a symlink loop bug involving :P 45365: _git: Fix __git_recent_branches for the case when a commit has an empty message 45343: Queue signals around arithmetic evaluations 45344: Document where third-party completion functions should be installed. 45345: internal: ztst.vim: Fix highlighting of zsh comments in test payload unposted: internal: Add some comments and fix indentation. No functional change. 45340: internal: Document the difference between paramtab and realparamtab. 45332: _git: add completion for git-version _brace_parameter: add missing \ Conflicts: ChangeLog Test/D02glob.ztst Test/V01zmodload.ztst
| * users/24710: Fix job control problem with sudo.Peter Stephenson2020-02-271-1/+2
| | | | | | | | | | | | | | If we use kill to test for continued existence of a process group, we should check on failure that the error is ESRCH, as EPERM indicates the group still has memebers but running privileged so should be left alone.
| * 45343: Queue signals around arithmetic evaluationsDaniel Shahaf2020-01-291-3/+0
| | | | | | | | | | The queueing added in execarith() in 45083 is reverted since the callee does this now.
* | 45131: Make a function that redefines itself preserve its tracedness.Daniel Shahaf2019-12-261-0/+6
|/ | | | | This makes it easy to apply local tracing ('functions -T') to autoloadable functions that redefines themselves when first loaded.
* 45083: Add signal protection to execarith().Peter Stephenson2019-12-181-0/+3
| | | | | Otherwise we could get re-entrancy in memory functions when setting variables.
* 45066: internal: Document forklevel, locallevel, and exit_pending.Daniel Shahaf2019-12-181-0/+4
|
* 45058: internal: Add symbolic names to possible values of zexit()'s ↵Daniel Shahaf2019-12-171-1/+1
| | | | "from_where" parameter. No functional change.
* 45025: fix re-entrancy problem with memory management in readoutput().Peter Stephenson2019-12-151-25/+36
| | | | This could cause a signal received during $(...) to corrupt memory.
* 45004: Fix typos in commentsMartijn Dekker2019-12-111-1/+1
|
* 44841: Better checking of errors from "nice"_RuRo_ (Андрей Стоцкий)2019-10-161-2/+5
|
* 44635: Don't apply STAT_NOPRINT to backgrounded jobsPeter Stephenson2019-08-031-1/+2
|
* 44480: Don't automatically close externally visible file descroptors.Peter Stephenson2019-07-021-1/+4
| | | | | | | | | | These are descriptors marked FDT_EXTERNAL. Make all sysopen'ed file descriptors FDT_EXTERNAL. Make =(...) call closem() consistent with other substitutions. Document file descriptors are left open.
* 44307: allow for atoi() returning a negative numberOliver Kiddle2019-05-201-1/+1
|
* 44214: <(...) substitutions shouldn't grab the terminalEric Freese2019-04-101-1/+1
|
* 44132: don't hash commands beginning with /Charles Blake2019-03-191-0/+2
|
* 43723: file descriptor could leak on fork errorKamil Dudka2018-11-091-1/+2
|
* 43660: extend 43653 when final exit is implicit.Peter Stephenson2018-10-091-24/+25
| | | | | | | Combine logic for case after committed to exit (shell_exiting) with case where exit occurred in a function we nee to unwind (exit_pending). Add sarky note for future generations to be confused at.
* 43489: Add error checking on a new write() call.Daniel Shahaf2018-09-251-1/+4
| | | | | Silences a compiler warning (write(2) is declared with warn_unused_result in current Debian Unstable).
* 43464: Another attachtty() fix.Peter Stephenson2018-09-161-6/+7
| | | | | | | | | If list_pipe_job triggered more than once we need to know the most recent process group leader, so record that both if the attach happened in the main shell on in entersubsh(). Also don't pass back proocess group for ESUB_ASYNC subshells.
* 43446: More entersubsh() / addproc() wiring.Peter Stephenson2018-09-121-15/+22
| | | | | Fix additional races by passing back use of list_pipe_job from subshell.
* 43409: Fix process group setting in main shell.Peter Stephenson2018-09-071-17/+28
| | | | | | | | | A newly forked subshell now reports back the process group it will be using for the main shell to record. This prevents an error where the shell incorrectly thought an exiting process owned the terminal and so grabbed it back, putting the foreground process into the background.
* CVE-2018-0502, CVE-2018-13259: Fix two security issues in shebang line parsing.Anthony Sottile2018-09-031-16/+20
| | | | | | See NEWS for more information. Patch by Anthony Sottile and Buck Evan.
* 43156, 43157: Need to allow for extra space in gethere().Peter Stephenson2018-07-101-3/+5
| | | | The point can now increment twice per iteration.
* users/23531: Error exit/return fixes.Peter Stephenson2018-07-091-0/+17
| | | | | | | | | | Fix regression with trap on left hand side of pipe. Fix forced return from shell structure within nested function. Fix tests exiting too early. Add new test case.
* users/23472: Add $sysparams[procsubstpid] to zsh/systemPeter Stephenson2018-06-151-0/+10
|
* 42101 (tweaked): assigning shell status to array was brokendana2018-05-111-2/+6
|
* unposted (branch fork_early): Fork early for pipelines.Peter Stephenson2018-05-011-82/+63
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If executing a command not at the end of a pipeline, and not optimised in the calling code, we can fork before "prefork" substitutions, at the same point as for background commands. Move fork before our preliminary scan of arguments to find a command: in the cases of early fork we don't need this information before forking. Ensure we _exit if forked in execcmd_exec(). Rationalise use of forks and pipes. Ensure we _exit instead of returning from execcmd_exec() if we have forked. Before the optimisation code after the fork always ran to the check at the end, but that code is overkill for the logic between the early fork and the existing one. Remove old workaround to fork in caller of execcmd for current shell constructs as no longer needed with early fork below. Close input of newly created pipe on fork (destined for RHS of pipe which we never execute): this replaces a workaround from zsh-workers/32171, commit 9887fc3d7b. Set last1 on early fork as needed by some instances of shell constructs on LHS of pipeline to know they are exiting.
* 47201: fix 42355 for multiple backslashesRicardo Giorni2018-04-291-6/+6
|
* unposted: Correct process substitution buffer size in the PATH_DEV_FD codepath.Daniel Shahaf2018-04-251-1/+1
|
* 42708: fix for process substitution.Peter Stephenson2018-04-241-8/+16
| | | | | | | | | Don't close associated file descriptors in the closem() tidy up function as they should remain visible to external processes. Override if about to exit. Unit test for the failing case: note this relies on the existence of /proc/self/fd or equivalent.
* 42684 (with extra comments): Fork early if in bg.Peter Stephenson2018-04-201-95/+135
| | | | | | | In execcmd the case of running the last command in a pipeline asynchronously for the purpose of & and &! is easy to work out, and we can avoid side effects and unnecessary execution time in the parent shell by forking earlier.
* 42630: Improve process group handling in pipelines.Peter Stephenson2018-04-171-1/+16
| | | | | | | | | If process group leader exits, allow a newly forked process to become process leader. If a foreground job, reattach the shell to the terminal until that happens. Unblock signals when reading output for command subsitution so that we can do this reattaching immediately.
* 42624 (plus test): avoid freeing memory that's still neededOliver Kiddle2018-04-121-5/+9
| | | | | This was occurring in a multiple function definition where a function name is duplicated.
* 42518, CVE-2018-1071: check bounds when copying path in hashcmd()Oliver Kiddle2018-03-241-1/+1
|
* 42469: necessary repairs to 42465 found by "make check"Stephane Chazelas2018-03-181-2/+2
|
* 42465: Pass up error status from readoutput().Stephane Chazelas2018-03-151-3/+13
| | | | This improves the consistency of error reporting from $(...) constructs.
* 42355: Fix use of backslashes on here doc input.Peter Stephenson2018-02-121-1/+10
| | | | | Handling of white space in particular was confusing and inconsistent with other shells.
* 42043: ZSH_DEBUG_CMD should not WARN_CREATE_GLOBALBarton E. Schaefer2018-01-141-1/+3
|
* 33395: Improvments for function managment.Peter Stephenson2017-12-221-1/+6
| | | | | | | | Functions defined inside other fucntions needs file line number adding. Particularly useful for anonymous fucntions. Add flag to indicate a function is anonymous. Done up to now by comparing the name to a pointer but this is more consistent.
* users/13148 (and workers/42060): Abort the command line when replyingDaniel Shahaf2017-12-201-6/+11
| | | | | | "[n] No" to the RM_STAR_SILENT prompt. Patch by Stephane, rebased by Mikael.