diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2025-08-09 12:23:21 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2025-08-09 12:23:21 +0200 |
| commit | 4eb4141b225e229b7263ded195307dd9d228c2af (patch) | |
| tree | f2967cb7e26eade126946b5a9b88c739d320e565 /shell | |
| parent | 6d4476258993d82a14ec060c53e41199d2f5eef5 (diff) | |
| download | busybox-w32-4eb4141b225e229b7263ded195307dd9d228c2af.tar.gz busybox-w32-4eb4141b225e229b7263ded195307dd9d228c2af.tar.bz2 busybox-w32-4eb4141b225e229b7263ded195307dd9d228c2af.zip | |
ash: eval: Always set exitstatus in evaltree
Upstream commit:
Date: Tue, 6 Dec 2022 16:49:14 +0800
eval: Always set exitstatus in evaltree
There is no harm in setting exitstatus unconditionally in evaltree.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/shell/ash.c b/shell/ash.c index aaea641a9..f1339cf3c 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
| @@ -9357,7 +9357,7 @@ evaltree(union node *n, int flags) | |||
| 9357 | #endif | 9357 | #endif |
| 9358 | case NNOT: | 9358 | case NNOT: |
| 9359 | status = !evaltree(n->nnot.com, EV_TESTED); | 9359 | status = !evaltree(n->nnot.com, EV_TESTED); |
| 9360 | goto setstatus; | 9360 | break; |
| 9361 | case NREDIR: | 9361 | case NREDIR: |
| 9362 | errlinno = lineno = n->nredir.linno; | 9362 | errlinno = lineno = n->nredir.linno; |
| 9363 | expredir(n->nredir.redirect); | 9363 | expredir(n->nredir.redirect); |
| @@ -9368,7 +9368,7 @@ evaltree(union node *n, int flags) | |||
| 9368 | } | 9368 | } |
| 9369 | if (n->nredir.redirect) | 9369 | if (n->nredir.redirect) |
| 9370 | popredir(/*drop:*/ 0); | 9370 | popredir(/*drop:*/ 0); |
| 9371 | goto setstatus; | 9371 | break; |
| 9372 | case NCMD: | 9372 | case NCMD: |
| 9373 | evalfn = evalcommand; | 9373 | evalfn = evalcommand; |
| 9374 | checkexit: | 9374 | checkexit: |
| @@ -9412,7 +9412,7 @@ evaltree(union node *n, int flags) | |||
| 9412 | evalfn = evaltree; | 9412 | evalfn = evaltree; |
| 9413 | calleval: | 9413 | calleval: |
| 9414 | status = evalfn(n, flags); | 9414 | status = evalfn(n, flags); |
| 9415 | goto setstatus; | 9415 | break; |
| 9416 | } | 9416 | } |
| 9417 | case NIF: | 9417 | case NIF: |
| 9418 | status = evaltree(n->nif.test, EV_TESTED); | 9418 | status = evaltree(n->nif.test, EV_TESTED); |
| @@ -9426,17 +9426,18 @@ evaltree(union node *n, int flags) | |||
| 9426 | goto evaln; | 9426 | goto evaln; |
| 9427 | } | 9427 | } |
| 9428 | status = 0; | 9428 | status = 0; |
| 9429 | goto setstatus; | 9429 | break; |
| 9430 | case NDEFUN: | 9430 | case NDEFUN: |
| 9431 | defun(n); | 9431 | defun(n); |
| 9432 | /* Not necessary. To test it: | 9432 | /* Not necessary. To test it: |
| 9433 | * "false; f() { qwerty; }; echo $?" should print 0. | 9433 | * "false; f() { qwerty; }; echo $?" should print 0. |
| 9434 | */ | 9434 | */ |
| 9435 | /* status = 0; */ | 9435 | /* status = 0; */ |
| 9436 | setstatus: | ||
| 9437 | exitstatus = status; | ||
| 9438 | break; | 9436 | break; |
| 9439 | } | 9437 | } |
| 9438 | |||
| 9439 | exitstatus = status; | ||
| 9440 | |||
| 9440 | out: | 9441 | out: |
| 9441 | /* Order of checks below is important: | 9442 | /* Order of checks below is important: |
| 9442 | * signal handlers trigger before exit caused by "set -e". | 9443 | * signal handlers trigger before exit caused by "set -e". |
