'ls' output with '\"\ \ ' on 1.18.4 - problem with dropbear+mc
Tomasz Czapiewski
xeros at irc.pl
Sun Apr 3 17:19:30 UTC 2011
On Sun, 3 Apr 2011, Denys Vlasenko wrote:
>> 2011/4/2 Tomasz Czapiewski <xeros at irc.pl>:
>>> Hi,
>>> I have replaced BusyBox 1.2.1 with 1.18.1 yestarday on one embedded machine
>>> and I've encountered problems using FISH connection from Midnight Commander
>>> on PC to Dropbear SSH server on embedded machine.
>>>
>>> All the file and dir names (including '.' and '..') are ending with:
>>> '\"\ \ ' - quotation mark (interted commas) and two spaces.
>>>
>>> Unfortunately I don't know how MC executes 'ls' command (which arguments).
>>> I couldn't get the problematic output with 'ls' or 'ls -al' or other
>>> arguments so can't track where's the problem myself.
>>>
>>> BusyBox 1.18.1 (before upgrade, on 1.2.1 everything was fine)
>>> Midnight Commander 4.7.0.6
>
>> On Saturday 02 April 2011 21:59, Tomasz Czapiewski wrote:
>> On Sat, 2 Apr 2011, Sergey Naumov wrote:
>>
>>> It seems that it is problem of new mc. I have similar problems with mc
>>> from Debian 6.0.0 and openssh. mc from debian 5.0.0 works fine with my
>>> busybox-based system.
>>>
>>> Sergey Naumov.
>>
>> Thanks for info, but I haven't upgraded MC in last few moths (it's default
>> one in Kubuntu 10.10) and it worked without any problems with older
>> BusyBox. I can only assume that there were any used by MC parameters which
>> older BusyBox was missing and MC haven't used them. Is there already known
>> workaround for this problem?
>>
>> Here's the strace log from current connection (cut the key exchange and
>> password verification at the beginning):
>> http://www.mediafire.com/?zydc5kkqtb66o2c
>
> $ grep 'execve.*ls' LOG-dropbear-fish-shell.log
> 860 execve("/bin/ls", ["ls", "-1", "/"], [/* 10 vars */] <unfinished ...>
> 861 execve("/bin/ls", ["ls", "-Q", "/"], [/* 10 vars */]) = 0
> 862 execve("/bin/ls", ["ls", "-Qlan", "/"], [/* 10 vars */] <unfinished ...>
> 865 execve("/bin/ls", ["ls", "-Qlan", "/"], [/* 10 vars */] <unfinished ...>
> 869 execve("/bin/ls", ["ls", "-1", "//bin"], [/* 10 vars */] <unfinished ...>
> 870 execve("/bin/ls", ["ls", "-Q", "//bin"], [/* 10 vars */]) = 0
> 871 execve("/bin/ls", ["ls", "-Qlan", "//bin"], [/* 10 vars */] <unfinished ...>
> 874 execve("/bin/ls", ["ls", "-Qlan", "//bin"], [/* 10 vars */] <unfinished ...>
> 878 execve("/bin/ls", ["ls", "-1", "//mnt"], [/* 10 vars */] <unfinished ...>
> 879 execve("/bin/ls", ["ls", "-Q", "//mnt"], [/* 10 vars */] <unfinished ...>
> 880 execve("/bin/ls", ["ls", "-Qlan", "//mnt"], [/* 10 vars */] <unfinished ...>
> 883 execve("/bin/ls", ["ls", "-Qlan", "//mnt"], [/* 10 vars */]) = 0
> 887 execve("/bin/ls", ["ls", "-1", "/tmp"], [/* 10 vars */] <unfinished ...>
> 888 execve("/bin/ls", ["ls", "-Q", "/tmp"], [/* 10 vars */]) = 0
> 889 execve("/bin/ls", ["ls", "-Qlan", "/tmp"], [/* 10 vars */] <unfinished ...>
> 892 execve("/bin/ls", ["ls", "-Qlan", "/tmp"], [/* 10 vars */] <unfinished ...>
> 897 execve("/bin/ls", ["ls", "-1", "/tmp/.stagecraft\" "], [/* 10 vars */] <unfinished ...>
>
> It uses -Q.
> busybox 1.2.1 didn't have -Q at all. Probably mc was detecting that
> and used some other method. Now it uses -Q (because it is supported, but isn't
> happy with results.
>
> Let's check how it ended up using '.stagecraft" '
>
> $ grep 'stagecraft' LOG-dropbear-fish-shell.log
> 889 lstat64("/tmp/.stagecraft", {st_mode=S_IFDIR|0777, st_size=0, ...}) = 0
> 891 write(1, "Pdrwxrwxrwx 0.0\nS0\ndJan 1 00:00\n:\".stagecraft\" \n\n", 50) = 50
> 892 lstat64("/tmp/.stagecraft", {st_mode=S_IFDIR|0777, st_size=0, ...}) = 0
> 855 write(7, "#LIST /tmp/.stagecraft\\\"\\ \\ \nif `perl -v > /dev/null 2>&1` ; then\nperl -e '\nuse strict;\nuse POSIX;\n"..., 2216) = 2216
> 858 <... read resumed> "#LIST /tmp/.stagecraft\\\"\\ \\ \nif `perl -v > /dev/null 2>&1` ; then\nperl -e '\nuse strict;\nuse POSIX;\n"..., 1023) = 1023
> 858 read(0, "osedir(DIR);\n} else {\nprintf(\"### 500\\n\");\n}\nexit 0\n' /tmp/.stagecraft\\\"\\ \\ ||\n echo '### 500'\n"..., 1023) = 1023
> 897 execve("/bin/ls", ["ls", "-1", "/tmp/.stagecraft\" "], [/* 10 vars */] <unfinished ...>
> 897 lstat64("/tmp/.stagecraft\" ", 0x7fa51a38) = -1 ENOENT (No such file or directory)
> 897 write(2, "ls: /tmp/.stagecraft\" : No such file or directory\n", 51) = 51
>
> The second line above is fishy. Let's see where it comes from:
>
> 891 read(0, "d", 1) = 1
> 891 read(0, "r", 1) = 1
> 891 read(0, "w", 1) = 1
> 891 read(0, "x", 1) = 1
> 891 read(0, "r", 1) = 1
> 891 read(0, "w", 1) = 1
> 891 read(0, "x", 1) = 1
> 891 read(0, "r", 1) = 1
> 891 read(0, "w", 1) = 1
> 891 read(0, "x", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, "3", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, "0", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, "0", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, "0", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, "J", 1) = 1
> 891 read(0, "a", 1) = 1
> 891 read(0, "n", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, "1", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, "0", 1) = 1
> 891 read(0, "0", 1) = 1
> 891 read(0, ":", 1) = 1
> 891 read(0, "0", 1) = 1
> 891 read(0, "0", 1) = 1
> 891 read(0, " ", 1) = 1
> 891 read(0, "\"", 1) = 1
> 891 read(0, ".", 1) = 1
> 891 read(0, "s", 1) = 1
> 891 read(0, "t", 1) = 1
> 891 read(0, "a", 1) = 1
> 891 read(0, "g", 1) = 1
> 891 read(0, "e", 1) = 1
> 891 read(0, "c", 1) = 1
> 891 read(0, "r", 1) = 1
> 891 read(0, "a", 1) = 1
> 891 read(0, "f", 1) = 1
> 891 read(0, "t", 1) = 1
> 891 read(0, "\"", 1) = 1
> 891 read(0, "\n", 1) = 1
> 891 waitpid(-1, 0x7f898c50, WNOHANG) = -1 ECHILD (No child processes)
> 891 waitpid(-1, 0x7f898c50, WNOHANG) = -1 ECHILD (No child processes)
> 891 waitpid(-1, 0x7f898c50, WNOHANG) = -1 ECHILD (No child processes)
> 891 waitpid(-1, 0x7f898c50, WNOHANG) = -1 ECHILD (No child processes)
> 891 fcntl64(1, F_GETFL) = 0x1 (flags O_WRONLY)
> 891 write(1, "Pdrwxrwxrwx 0.0\nS0\ndJan 1 00:00\n:\".stagecraft\" \n\n", 50) = 50
>
> I don't see what process 891 is (I see neither fork or clone which created it,
> nor any execve's in it), but this is clearly where bug originates:
> this process reads ls output (byte-by-byte), and then
> translates it in some other format. This translation is buggy:
> it took input in the form ".stagecraft" (quotes included)
> and converted it to ".stagecraft"<space><space>
> which looks wrong to me.
>
> Aha. Looks like we have some docs:
>
> http://cvs.savannah.gnu.org/viewvc/mc/mc/vfs/README.fish?view=markup
>
> According to it, process 891 must be shell running "while read..."
> part of the shell construct similar to:
>
> ls -Qlan /tmp | grep '^[^cbt]' | ( while read p x u g s m d y n; do echo "P$p $u.$g
> S$s
> d$m $d $y
> :$n
> "; done )
>
>
>
>
> Questions for further debugging:
>
> What is your shell?
>
> Can you run this:
>
> ls -Qlan /tmp | grep '^[^cbt]' | ( while read p x u g s m d y n; do echo "P$p $u.$g
> S$s
> d$m $d $y
> :$n
> "; done ) >LOG
>
> and post resulting LOG file?
Looks ok to me:
http://pastebin.com/hGhZUgrV
>
> --
> vda
>
>
Thank you very much for help and yours time spent to solve my problem.
I've reported bug on MC bug tracking and got response to try version
4.7.5 as it should have been fixed there.
I've compiled MC 4.7.5.1 and everything is working now.
Too bad there is no newer version than 4.7.0.9 (yet) in any version of
Debian or Ubuntu.
Best Regards,
Tomasz Czapiewski
More information about the busybox
mailing list