Package: dash
Version: 0.5.8-2.4+edit
Severity: normal
Tags: patch

Dear Maintainer,

This bug applies when dash is compiled with libedit support, which enables the 
'fc' command.

'fc -s' can either take no arguments, in which it executes the last command, or 
one numerical argument, in which it executes the command with the given number 
as shown in 'fc -l'. On my system, either usage results in an infinite loop.

dash has a built-in recursive block, which can be seen in action when calling 
'fc -s' with no commands in history, starting a recursive 'fc -s' call. But the 
block seems ineffective against anything other than that specific case.

A few tests:

(1) start shell, 'fc -s'

Recursive call, blocked after a few iterations.

(2) start shell, 'echo Vanilla', 'fc -s'
(3) start shell, 'man dash', 'fc -s'

Both infinite loop..

(4) start shell, 'fc -l', 'fc -s'

Successfully repeats 'fc -l', without infinite loop.

(5) start shell, 'echo Vanilla, 'echo Chocolate', 'fc -l', 'fc -s 2'
(6) start shell, 'coffee() { echo Coffee; }', coffee, 'fc -s'

Infinite loop.

I can provide text logs or video recordings for these cases, if needed!

Aside from repeating a command at very high speeds, these infinite loops aren't 
very dangerous. They can easily be stopped with CTRL-C (or a combination of q 
and CTRl-C, for 'man dash').

-----

I played around with the source code for a few hours - both that of the version 
in stable and the version in sid - and tried making a few changes.

The change from '==' to '>=' in the patch I'm including seems to be the only 
effective one. (Since it works, I suspect the problem is because because the 
he.num somehow surpasses last before the check finishes)

I know Debian doesn't compile dash with libedit support for the repositories. 
But.. if this patch is not disagreeable, please consider incorporating it..!

I will also appreciate it if someone can reproduce this issue.

-----

he.num may somehow overrun last, causing an infinite loop when using fc -s.
This mild change to the check plugs it.

Index: dash/src/histedit.c
===================================================================
--- dash.orig/src/histedit.c
+++ dash/src/histedit.c
@@ -388,7 +388,7 @@ histcmd(int argc, char **argv)
* At end?  (if we were to lose last, we'd sure be
* messed up).
*/
-        if (he.num == last)
+        if (he.num >= last)
break;
}
if (editor) {


-- System Information:
Debian Release: 9.8
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 4.9.0-8-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=
(charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages dash depends on:
ii  debianutils  4.8.1.1
ii  dpkg         1.18.25
ii  libc6        2.24-11+deb9u4
ii  libedit2     3.1-20160903-3

dash recommends no packages.

dash suggests no packages.

Reply via email to