Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAKrOiPTWdBkU57EDzvypAu=W6hDB5HRhr9KAnAUNabhD5PnVFw@mail.gmail.com>
Date: Sun, 27 Feb 2022 21:29:49 +0000
From: naruto canada <narutocanada@...il.com>
To: Rich Felker <dalias@...c.org>
Cc: musl@...ts.openwall.com
Subject: Re: Re: anyone know how to approach this problem (expect5.x.x hangs)

On 2/27/22, naruto canada <narutocanada@...il.com> wrote:
> On 2/26/22, Rich Felker <dalias@...c.org> wrote:
>> On Sat, Feb 26, 2022 at 02:46:10AM +0000, naruto canada wrote:
>>> On 2/25/22, Rich Felker <dalias@...c.org> wrote:
>>> > On Fri, Feb 25, 2022 at 07:35:39PM +0000, naruto canada wrote:
>>> >> On 2/25/22, naruto canada <narutocanada@...il.com> wrote:
>>> >> > hi
>>> >> >
>>> >> > I'm in the process of porting all my desktop env. over to musl.
>>> >> > I'm about 70% done. I hit a few minor snags but got over them.
>>> >> > I had expected a lot more painful experience, but it turned out ok.
>>> >> > I could not get xserver to compile but will work around using vnc
>>> >> > for
>>> >> > now.
>>> >> > I am quite happy I got qemu to compile.
>>> >> > The last 30% (Browsers !!!), I dare not approach them right now.
>>> >> >
>>> >> > Anyway, back to my probem, expect5.x.x hangs,
>>> >> > no seg fault, so I do not know how to approach this problem.
>>> >> > normally I do a simple test:
>>> >> > expect -c "spawn ls" # this always succeeds.
>>> >> >
>>> >> > (I use expect to automate password creation)
>>> >> > VNCRP=123456 # need 6 characters # create ~/.vnc/passwd
>>> >> > echo '#!/usr/bin/expect
>>> >> > set timeout -1
>>> >> > spawn vncpasswd
>>> >> > expect "Password:"
>>> >> > send "'$VNCRP'\r"
>>> >> > expect "Verify:"
>>> >> > send "'$VNCRP'\r"
>>> >> > expect "Would you like to enter a view-only password (y/n)?"
>>> >> > send "n\r"
>>> >> > interact' > /tmp/p.ex
>>> >> > expect /tmp/p.ex
>>> >> > This script works fine under glibc, but hangs under musl.
>>> >> >
>>> >> > I've already tried the same version of expect and patches from
>>> >> > aports-3.15.0/main/expect/*.patch
>>> >> > I got the same result. (it hangs)
>>> >> >
>>> >> > This is not a priority problem for me. I can easily work around it
>>> >> > without using expect.
>>> >> > Just wondering if anyone know how to approach this problem (when
>>> >> > there
>>> >> > is no seg fault)
>>> >>
>>> >> I did a quick strace, and compare it with glibc:
>>> >> GLIBC CASE:
>>> >> ....
>>> >> open("/tmp/p.ex", O_RDONLY)             = 4
>>> >> spawn vncpasswd
>>> >> open("/dev/ptmx", O_RDWR)               = 4
>>> >> open("/etc/group", O_RDONLY|O_CLOEXEC)  = 5
>>> >> open("/dev/pts/18", O_RDWR|O_NOCTTY)    = 5
>>> >> Password:
>>> >> Verify:
>>> >> Would you like to enter a view-only password (y/n)? n
>>> >> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=956,
>>> >> si_status=0, si_utime=0, si_stime=0} ---
>>> >>
>>> >>                                 open("/dev/null", O_RDONLY)
>>> >>  = 4
>>> >>                      open("/dev/null", O_RDONLY)             = 3
>>> >> open("/dev/null", O_RDONLY)             = 2
>>> >> open("/dev/null", O_RDONLY)             = 0
>>> >> +++ exited with 0 +++
>>> >>
>>> >> MUSL CASE:
>>> >> open("/tmp/p.ex", O_RDONLY|O_LARGEFILE) = 7
>>> >> spawn vncpasswd
>>> >> open("/dev/ptmx", O_RDWR|O_NOCTTY|O_LARGEFILE) = 7
>>> >> open("/dev/pts/3", O_RDWR|O_NOCTTY|O_LARGEFILE) = 8
>>> >> syscall_397(0xffffff9c, 0xb6f624e0, 0, 0x7ff, 0xbe927e48, 0xb6f624e0)
>>> >> = -1 (errno 38)
>>> >> syscall_397(0x8, 0xb6f58350, 0x1000, 0x7ff, 0xbe927e48, 0xb6f624e0) =
>>> >> -1 (errno 38)
>>> >> syscall_403(0, 0xbe928258, 0xb6e82de0, 0, 0xbe928334, 0) = -1 (errno
>>> >> 38)
>>> >> syscall_389(0x10, 0, 0, 0xb6f62170, 0xbe92815c, 0xbe92808c) = -1
>>> >> (errno
>>> >> 38)
>>> >>
>>> >> It seems to block or stopped at syscall_389
>>> >> ( arch/arm/bits/syscall.h.in:#define __NR_membarrier		389 )
>>> >
>>> > The syscall has returned, so it's something after that which is
>>> > hanging. Running under gdb and hitting ^C could show where.
>>> >
>>> > Something very wrong is going on here, since the syscalls are failing
>>> > with ENOSYS but no fallback path has been taken. If it's musl making
>>> > them, it will not assume these exist but will check for ENOSYS and
>>> > make an alternate syscall if that happens. So it would seem that
>>> > either these syscalls are being made directly by the application
>>> > (expect) or something went very wrong in building musl (weird patches?
>>> > stale build dir previously used for another arch? ..?) that has the
>>> > wrong thing happening.
>>> >
>>> > What kernel version are you using? There was a recent thread on the
>>> > list where someone had a badly patched kernel from Google that did
>>> > something to mess up ENOSYS, and strace hid the bug, so perhaps this
>>> > is similar.
>>>
>>> It is compiled on (and running on) android phone.
>>> I have no control over the kernel (3.4.0-perf-g63c3cac) (LG G3).
>>> (I have already matched kernel header (3.4.0) when compile the tool
>>> and the World)
>>> I used 3.10.x before and got into problem, so I matched the kernel
>>> header
>>> this time. This is the gdb result (I ran 3 times). It always stopped
>>> at the same place:
>>
>> The kernel headers you use should not matter at all. Do you know where
>> we can find the sources for LG's kernel? I'm guessing they did
>> something horrible...
> Actually I have downloaded the source code, but I do not know how to config
> and
> match the device tree. There is no config.gz in /proc.
> Besides, there are many variants for different countries, there is no way
> to be certain that the source file is the one that
> was built for and running on the phone.
>
> Ok, here is the results from 2 phones and i686.
> I will describe the common build script:
> To eliminate complications I switched back to musl-1.1.24.
> If there is any time64 issues this should have made it irrelevant.
> C(XX)FLAGS enforced by specs file: -ggdb -O0
> libssp enabled in gcc-5.3.0. linux-3.4 headers.
> I am also monitoring any selinux denied messages from logcat.
>
> 0. Linux localhost 4.1.49 #1 SMP Sat Feb 12 17:41:04 UTC 2022 i686
> GNU/Linux
> 1. Linux localhost 3.4.0-perf-g63c3cac #1 SMP PREEMPT Mon Nov 9
> 19:33:11 KST 2015 armv7l GNU/Linux (LG G3)
> 2. Linux localhost 3.10.49-g441c924c #1 SMP PREEMPT Mon May 16
> 19:35:10 CST 2016 armv7l GNU/Linux (Another cheap android phone but
> slightly newer kernel)
>
> i686 CASE:
> strace -f -ff -o 1 expect /tmp/p.ex
> tail 1.*
>
> ==> 1.14236 <==
> close(0)                                = 0
> write(6, "q", 1)                        = 1
> close(6)                                = 0
> futex(0xbf7fd53c, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
> futex(0xb76cf838, FUTEX_WAIT_PRIVATE, -2147483632, NULL) = 0
> futex(0xb74dddac, FUTEX_WAIT_PRIVATE, 1, NULL) = 0
> futex(0xb77ca568, FUTEX_WAIT, 14240, NULL) = 0
> munmap(0xb74bb000, 143360)              = 0
> exit_group(130)                         = ?
> +++ exited with 130 +++
>
> ==> 1.14237 <==
> set_thread_area({entry_number:6, base_addr:0xb76c2064, limit:1048575,
> seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1,
> seg_not_present:0, useable:1}) = 0
> set_tid_address(0xb7781568)             = 14237
> brk(0)                                  = 0x86bf000
> brk(0x86c4000)                          = 0x86c4000
> mkdir("/root/.vnc/", 0777)              = -1 EEXIST (File exists)
> ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or
> TCGETS, {B115200 opost isig icanon echo ...}) = 0
> ioctl(0, SNDCTL_TMR_CONTINUE or SNDRV_TIMER_IOCTL_GPARAMS or TCSETSF,
> {B115200 opost isig icanon -echo ...}) = 0
> read(0, 0xb777ffe8, 1024)               = -1 EIO (I/O error)
> --- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
> +++ killed by SIGHUP +++
>
> ==> 1.14238 <==
> wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14239
> rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0xb7787836},
> {0x808c34a, [], SA_RESTORER, 0xb7787836}, 8) = 0
> rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14239,
> si_status=0, si_utime=0, si_stime=0} ---
> wait4(-1, 0xbfb515d4, WNOHANG, NULL)    = -1 ECHILD (No child process)
> sigreturn() (mask [])                   = 0
> rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
> rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
> exit_group(0)                           = ?
> +++ exited with 0 +++
>
> ==> 1.14239 <==
> close(4)                                = 0
> execve("/bin/stty", ["/bin/stty", "sane"], [/* 40 vars */]) = 0
> set_thread_area({entry_number:-1 -> 6, base_addr:0x81d55cc,
> limit:1048575, seg_32bit:1, contents:0, read_exec_only:0,
> limit_in_pages:1, seg_not_present:0, useable:1}) = 0
> set_tid_address(0x81d5e30)              = 14239
> getuid32()                              = 0
> ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or
> TCGETS, {B115200 opost isig icanon echo ...}) = 0
> ioctl(0, SNDCTL_TMR_STOP or SNDRV_TIMER_IOCTL_GINFO or TCSETSW,
> {B115200 opost isig icanon echo ...}) = 0
> ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or
> TCGETS, {B115200 opost isig icanon echo ...}) = 0
> exit_group(0)                           = ?
> +++ exited with 0 +++
>
> ==> 1.14240 <==
> read(5, "\0", 1)                        = 1
> select(6, [5], [], [], NULL)            = 1 (in [5])
> read(5, "q", 1)                         = 1
> close(5)                                = 0
> futex(0xbf7fd53c, FUTEX_WAKE_PRIVATE, 1) = 1
> futex(0xb76cf838, FUTEX_WAKE_PRIVATE, 1) = 1
> rt_sigprocmask(SIG_BLOCK, ~[RTMIN 33 34], [], 8) = 0
> futex(0xb74dddac, FUTEX_WAKE_PRIVATE, 1) = 1
> _exit(0)                                = ?
> +++ exited with 130 +++
>
> Total of 5 processes:
> 2 processes existed normally.
> One is killed SIGHUP (main expect script I think)
> Two existed with 130 (they are blocked by kernel till ctrl-c ?)
> So 3 processes blocked, till ctrl-c was pressed.
>
> LG.G3 CASE:
> strace -f -ff -o 1 expect /tmp/p.ex
> pstree -w
> ...
>  |     |           \-+= 28384 root strace -f -ff -o 1 expect /tmp/p.ex
>  |     |             \-+- 28389 root expect /tmp/p.ex
>  |     |               \--= 28390 root vncpasswd
> ...
>
> tail 1.*
> ==> 1.27818 <==
> fcntl64(2, F_SETFD, FD_CLOEXEC)         = 0
> close(0)                                = 0
> close(1)                                = 0
> open("/dev/null", O_RDONLY|O_LARGEFILE) = 0
> fcntl64(0, F_SETFD, FD_CLOEXEC)         = 0
> close(3)                                = 0
> close(2)                                = 0
> close(0)                                = 0
> exit_group(1)                           = ?
> +++ exited with 1 +++
>
> ==> 1.28389 <==
> fcntl64(0, F_SETFD, FD_CLOEXEC)         = 0
> close(4)                                = 0
> close(3)                                = 0
> close(2)                                = 0
> close(0)                                = 0
> write(6, "q", 1)                        = 1
> close(-1)                               = -1 EBADF (Bad file descriptor)
> munmap(0xb6c27000, 143360)              = 0
> exit_group(130)                         = ?
> +++ exited with 130 +++
>
> ==> 1.28390 <==
> set_tls(0x29268, 0x29268, 0xb6f40c60, 0x29268, 0x200) = 0
> set_tid_address(0xb6f96e18)             = 28390
> brk(0)                                  = 0x125d000
> brk(0x1262000)                          = 0x1262000
> mkdir("/root/.vnc/", 0777)              = -1 EEXIST (File exists)
> ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or
> TCGETS, {B38400 opost isig icanon echo ...}) = 0
> ioctl(0, SNDCTL_TMR_CONTINUE or SNDRV_TIMER_IOCTL_GPARAMS or TCSETSF,
> {B38400 opost isig icanon -echo ...}) = 0
> read(0, 0xb6f95e44, 1024)               = -1 EIO (I/O error)
> --- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
> +++ killed by SIGHUP +++
>
> ==> 1.28391 <==
> wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 28392
> rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0xb6f3229c}, {0x5d550,
> [], SA_RESTORER, 0xb6f3229c}, 8) = 0
> rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=28392,
> si_status=0, si_utime=0, si_stime=0} ---
> wait4(-1, 0xbece8ebc, WNOHANG, NULL)    = -1 ECHILD (No child process)
> sigreturn() (mask [])                   = 0
> rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
> rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
> exit_group(0)                           = ?
> +++ exited with 0 +++
>
> ==> 1.28392 <==
> close(4)                                = 0
> execve("/bin/stty", ["/bin/stty", "sane"], [/* 42 vars */]) = 0
> set_tls(0x20d25c, 0x20d25c, 0x1c1e28, 0x20d25c, 0) = 0
> set_tid_address(0x20d788)               = 28392
> getuid32()                              = 0
> ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or
> TCGETS, {B38400 opost isig icanon echo ...}) = 0
> ioctl(0, SNDCTL_TMR_STOP or SNDRV_TIMER_IOCTL_GINFO or TCSETSW,
> {B38400 opost isig icanon echo ...}) = 0
> ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or
> TCGETS, {B38400 opost isig icanon echo ...}) = 0
> exit_group(0)                           = ?
> +++ exited with 0 +++
>
> ==> 1.28393 <==
> read(5, "\0", 1)                        = 1
> select(6, [5], [], [], NULL)            = ? ERESTARTNOHAND (To be
> restarted if no handler)
> --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=28390,
> si_status=SIGHUP, si_utime=1, si_stime=1} ---
> select(6, [5], [], [], NULL)            = 1 (in [5])
> read(5, "q", 1)                         = 1
> close(5)                                = 0
> rt_sigprocmask(SIG_BLOCK, ~[RTMIN 33 34], [], 8) = 0
> futex(0xb6c49da0, FUTEX_WAKE_PRIVATE, 1) = 0
> exit(0)                                 = ?
> +++ exited with 0 +++
>
> With LG G3, I have a total of 6 processes instead of 5.
> Strange. Anyway, the same result, blocked till ctrl-c is pressed.
>
> CHEAPO ANDROID PHONE with linux-3.10.x:
> still compiling slowly. I am going to guess I will have similar result.
> If it turns out differently, I will post another message.

It turns out, I was over thinking the problem, thinking
maybe it is something buried deep. The problem was not "expect" but
the program "vncpasswd". I manually tried the program and it behaved
differently when compiled with musl. For some reason, it failed to flush
the prompt to the user, and "expect" was waiting forever instead.
I am not sure if this is correct fix for tigervnc-1.7.1, it works around
no prompt on my system:
sed -i.bak "s/\(fputs(prompt, stdout)\)/\1;fflush(stdout)/"
unix/vncpasswd/vncpasswd.cxx

>
> Since, the i686 kernel is my daily kernel, with no selinux enabled,
> I am going to guess, this is not kernel related.
> I have no method of getting to the bottom of this issue right now.
> I am going to leave it for now.
> Maybe it will go away if I use newer gcc.
>
> I am going to test icewm and qemu first, they have only been compiled
> but not tested.
>
>>
>> Rich
>>
>

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.