![]() |
|
Message-ID: <20250702141853.GH1827@brightrain.aerifal.cx> Date: Wed, 2 Jul 2025 10:18:53 -0400 From: Rich Felker <dalias@...c.org> To: "Zhang, Huilin (Rebecca) (CN)" <Rebecca.Zhang.CN@...driver.com> Cc: Markus Wichmann <nullplan@....net>, "musl@...ts.openwall.com" <musl@...ts.openwall.com>, "Deng, Wenbin (CN)" <Wenbin.Deng.CN@...driver.com> Subject: Re: [PATCH] __libc_exit_fini forgets to do pthread_mutex_unlock On Wed, Jul 02, 2025 at 06:06:11AM +0000, Zhang, Huilin (Rebecca) (CN) wrote: > Hello, Markus, > > Please see attached test code main.c. Assume we compile it with MUSL and generate the executable program named myApp. > This myApp needs an input parameter which is an another executable program. If this parameter pointed to a nonexistent > program, this myApp will get stuck. > > For example: (aaa is a nonexistent program) > ./myApp aaa > > > The attached .png file is the snapshot that I ran myApp on ubutntu 22.04.3. > > Thanks, > Rebecca > > > -----Original Message----- > From: Markus Wichmann <nullplan@....net> > Sent: Wednesday, July 2, 2025 12:31 PM > To: musl@...ts.openwall.com > Cc: Zhang, Huilin (Rebecca) (CN) <Rebecca.Zhang.CN@...driver.com>; Deng, Wenbin (CN) <Wenbin.Deng.CN@...driver.com> > Subject: Re: [musl] [PATCH] __libc_exit_fini forgets to do pthread_mutex_unlock > > CAUTION: This email comes from a non Wind River email account! > Do not click links or open attachments unless you recognize the sender and know the content is safe. > > Am Wed, Jul 02, 2025 at 10:28:54AM +0800 schrieb rebecca.zhang.cn@...driver.com: > > From: Rebecca Zhang <rebecca.zhang.cn@...driver.com> > > > > This commit fixes the issue that __libc_exit_fini only do > > pthread_mutex_lock, but forget to do pthread_mutex_unlock. > > --- > > ldso/dynlink.c | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/ldso/dynlink.c b/ldso/dynlink.c index ceca3c9..7885675 > > 100644 > > --- a/ldso/dynlink.c > > +++ b/ldso/dynlink.c > > @@ -1492,6 +1492,7 @@ void __libc_exit_fini() > > fpaddr(p, dyn[DT_FINI])(); #endif > > } > > + pthread_mutex_unlock(&init_fini_lock); > > } > > > > void __ldso_atfork(int who) > > -- > > 2.34.1 > > > I think that is a deliberate omision. __libc_exit_fini() is called > on process exit. After it runs, it must not run again, and no new > initializer must run at all. The process will exit very soon anyway. > The only way to deadlock here is if a destructor calls exit(), which > they aren't allowed to do. > > Ciao, > Markus > #include <errno.h> > #include <stdio.h> > #include <stdlib.h> > #include <sys/types.h> > #include <sys/wait.h> > #include <unistd.h> > > void main(int argc, char *argv[]) { > if (argc < 2) { > fprintf(stderr, "usage: %s <program> [args...]\n", argv[0]); > exit(EXIT_FAILURE); > } > > printf("parent process PID=%d is starting\n", getpid()); > > pid_t pid = vfork(); // use vfork to create child process > > if (pid < 0) { > // vfork fail > perror("vfork fail"); > exit(EXIT_FAILURE); > } else if (pid == 0) { > // child process > printf("child process PID=%d will start: %s\n", getpid(), argv[1]); > > // execute program which is pass in via argv > execvp(argv[1], &argv[1]); > > perror("execvp fail"); > exit(EXIT_FAILURE); > } else { > // parent process > printf("parent process PID=%d wait for child process PID=%d\n", getpid(), pid); > > int status; > pid_t wait_pid = waitpid(pid, &status, 0); // wait for child process terminating > > if (wait_pid < 0) { > perror("waitpid fail"); > } else if (WIFEXITED(status)) { > printf("child process exit???exit code: %d\n", WEXITSTATUS(status)); > } else if (WIFSIGNALED(status)) { > printf("child process is terminated by signal???signal is: %d\n", WTERMSIG(status)); > } > > printf("parent process exit\n"); > } > > exit(0); > } This is completely expected. You cannot call exit in the child after vfork. The only permissible actions are execve (and variants) and _exit. 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.