Ticket #2110 (new defect)

Opened 7 years ago

Last modified 10 months ago

unexpected subshell execution

Reported by: adminX Owned by:
Priority: major Milestone: Future Releases
Component: mc-core Version: master
Keywords: Cc: mc-trac@…, zaytsev, ossi@…, onlyjob@…
Blocked By: Blocking:
Branch state: no branch Votes for changeset:


run mc
have somedir in the current panel and your home in the other panel.
Press <Ctrl-O> to get a subshell
Enter a command with trailing space
Press <Ctrl-O> to get back to mc and switch to the other panel.
This will execute the entered command with additonals parameters cd and your home.
This also works by changing directory in current panel.

I think this is a bug as accidentally executing long running commands, never ending commands like cat or evil commands like rm -rf should not happen.

This bug was introduced in #213.

Change History

comment:1 Changed 7 years ago by adminX

  • Cc mc-trac@… added

comment:2 Changed 7 years ago by zaytsev

  • Cc zaytsev added

Unfortunately, I have also stumbled upon this issue quite a few times. My vote here.

comment:3 Changed 6 years ago by andrew_b

  • Version changed from version not selected to master

See also #2269.

comment:4 Changed 6 years ago by ossi

  • Cc ossi@… added

comment:5 Changed 6 years ago by jmak

'The shell is already running a command' was annoying, but this "solution" only calls for shooting oneself in the foot. I just managed to make a svn commit with a bogus message only because I wanted to review something before smashing enter.

I added -u to mc's parameters. Executing commands without user's content, and with bogus arguments is just too dangerous.

comment:6 Changed 5 years ago by andrew_b

  • Branch state set to no branch
  • Milestone changed from 4.7 to Future Releases

comment:7 Changed 4 years ago by andrew_b

See also #2987.

comment:8 Changed 4 years ago by onlyjob

  • Cc onlyjob@… added

comment:10 Changed 3 years ago by ossi

fwiw, there is also https://mail.gnome.org/archives/mc-devel/2006-May/msg00030.html which contains a somewhat related patch that should be looked at.

comment:11 Changed 23 months ago by onlyjob

In the https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=703741#16

Dmitry Borisyuk proposed the following patch:

A simple solution for this problem is to send C-k C-u to the shell
before sending 'cd' command, which will erase previous unfinished text
(C-k is needed for bash if the cursor is in the middle of the line).
I've tried the following patch with bash, zsh and tcsh and it works fine.

--- a/src/subshell.c
+++ b/src/subshell.c
@@ -1190,7 +1190,7 @@
     /* The initial space keeps this out of the command history (in bash
        because we set "HISTCONTROL=ignorespace") */
-    write_all (mc_global.tty.subshell_pty, " cd ", 4);
+    write_all (mc_global.tty.subshell_pty, "\013\025 cd ", 6);
     directory = vfs_path_to_str (vpath);
     if (directory != '\0')

Please review.

comment:12 Changed 23 months ago by ossi

as a band-aid, the idea isn't bad.
note that the order c-k c-u is important, as a plain tty (as used by ash, for example) will not interpret c-k (but it will interpret c-u).

however, i don't consider this a real solution - it's destructive, after all.
imo, the original patch should be reverted, and a more robust way of detecting shell idleness devised. that could be probably done by looking closer at the shell's tty output, so we can actually know when nothing is on the prompt.

comment:13 Changed 10 months ago by and

summary subshell

mc open one (sub)shell for read/write (subshell_pty)
mc open one fifo for reading by mc and writing by (sub)shell (subshell_pipe)
mc init (sub)shell interpeter with custom precmd shell code
precmd is triggered at each (sub)shell prompt (doing by shell interpreter)
precmd writes CWD info to given fifo (subshell_pipe)
mc subshell is always running
mc subshell can be visible/invisible (aka Crtl-o aka subshell_state?)

after (sub)shell init, mc can send command to (sub)shell itself
for example string " cd " will send when panel toggles

This can be bad because mc cannot see if (sub)shell is ready to accept next shell cmds
for example shells can have page-completions which except certain input response (#2269)
now toggle panel, mc write "cd" to issue precmd but no new fifo data arrived, BOOM.

It must be prevented that mc write shell commands itself in unclear situations.

What is a unclear situation?

  • user input sended to (sub)shell, no fifo/CWD data arrived yet

What is a clear situation?

  • (sub)shell init done and fifo/CWD data just arrived, no user input sended to (sub)shell yet
  • fifo/CWD data arrived and no user input sended to (sub)shell yet


  • subshell_init_done flag TRUE/FALSE
    • TRUE: init process complete (with optional "cd" test successful)
    • FALSE: init process not done yet (will block all mc subshell user functions)
  • subshell_visible flag TRUE/FALSE
    • TRUE: (sub)shell visible
    • FALSE mc panels visible
  • subshell_busy flag TRUE/FALSE
    • TRUE: user input sended
    • FALSE: fifo/CWD received
  • toggle panel
    • subshell_busy=TRUE:
      • no mc data aka "cd" send to (sub)shell
      • when user enter data for (sub)shell inform user with a msgbox
    • subshell_busy=FALSE:
      • mc issue "cd" command
      • send user data to (sub)shell if available (and set subshell_busy=TRUE)
  • reading fifo/CWD
    • after reading fifo/CWD set subshell_busy=FALSE
  • after fresh (sub)shell init do a test "cd" cmd to detect if fifo/CWD working properly if not, give up (sub)shell handling earlier than later

What I miss?

Last edited 10 months ago by and (previous) (diff)
Note: See TracTickets for help on using tickets.