[klibc] [klibc:update-dash] dash: [JOBS] Fix off-by-one error for multiple of four job numbers

klibc-bot for Harald van Dijk harald at gigawatt.nl
Sat Mar 28 14:48:16 PDT 2020


Commit-ID:  8e4ecd111d7e780e24830ef28093677b30180f4e
Gitweb:     http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=8e4ecd111d7e780e24830ef28093677b30180f4e
Author:     Harald van Dijk <harald at gigawatt.nl>
AuthorDate: Fri, 26 Sep 2014 22:27:13 +0800
Committer:  Ben Hutchings <ben at decadent.org.uk>
CommitDate: Sat, 28 Mar 2020 21:42:54 +0000

[klibc] dash: [JOBS] Fix off-by-one error for multiple of four job numbers

[ dash commit 4c44561d9f97331bb23f900f47a69305091f3ab3 ]

On 29/07/13 23:44, Luigi Tarenga wrote:
> hi list,
> while writing a script to execute parallel ssh command on many host I found
> a strange behavior of dash. I can replicate it with a very simple script but
> didn't find any documentation about dash or POSIX that can explain it.
>
> tested on centos 6.4 (dash 0.5.5.1) and wih dash compiled from source (0.5.7)
> the following script reports error:
>
> #!/bin/dash
>
> sleep 3 &
> sleep 3 &
> sleep 3 &
> sleep 3 &
>
> #/bin/true
> jobs -l
>
> wait %1
> wait %2
> wait %3
> wait %4
>
> [vortex at lizard ~]$ ./dash-0.5.7/src/dash test.sh
> [4] + 4569 Running
> [3] - 4568 Running
> [2]   4567 Running
> [1]   4566 Running
> prova: 14: wait: No such job: %4
> [vortex at lizard ~]$ echo $?
> 2

Yes, this looks like a bug to me. The number of allocated jobs is always
kept as a multiple of four, and the first check in considering whether
the job number is valid is "if it's greater than or equal to the number
of allocated job, it's invalid". That doesn't look right. That would
only be right if jobs were zero-based, but they aren't. If it's exactly
equal to the number of available jobs, it can still be valid. It works
when adding /bin/true, because four more more jobs end up allocated
internally.

Signed-off-by: Herbert Xu <herbert at gondor.apana.org.au>
Signed-off-by: Ben Hutchings <ben at decadent.org.uk>

---
 usr/dash/jobs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/usr/dash/jobs.c b/usr/dash/jobs.c
index b9ff1402..c9b631ac 100644
--- a/usr/dash/jobs.c
+++ b/usr/dash/jobs.c
@@ -698,7 +698,7 @@ check:
 
 	if (is_number(p)) {
 		num = atoi(p);
-		if (num < njobs) {
+		if (num <= njobs) {
 			jp = jobtab + num - 1;
 			if (jp->used)
 				goto gotit;


More information about the klibc mailing list