mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-25 14:30:06 +00:00
Fix race conditions in pldd that may leave the process stopped after detaching
Fixes bug 15804
This commit is contained in:
parent
d4ec6ae19e
commit
b04acb2651
@ -1,3 +1,9 @@
|
|||||||
|
2014-02-24 Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
[BZ #15804]
|
||||||
|
* elf/pldd.c (wait_for_ptrace_stop): New function.
|
||||||
|
(main): Call it after attaching.
|
||||||
|
|
||||||
2014-02-22 Roland McGrath <roland@hack.frob.com>
|
2014-02-22 Roland McGrath <roland@hack.frob.com>
|
||||||
|
|
||||||
* Makerules ($(common-objpfx)Versions.v.i): No longer depend
|
* Makerules ($(common-objpfx)Versions.v.i): No longer depend
|
||||||
|
2
NEWS
2
NEWS
@ -9,7 +9,7 @@ Version 2.20
|
|||||||
|
|
||||||
* The following bugs are resolved with this release:
|
* The following bugs are resolved with this release:
|
||||||
|
|
||||||
15894, 16447, 16545, 16574, 16600, 16609, 16610, 16611.
|
15804, 15894, 16447, 16545, 16574, 16600, 16609, 16610, 16611.
|
||||||
|
|
||||||
* The am33 port, which had not worked for several years, has been removed
|
* The am33 port, which had not worked for several years, has been removed
|
||||||
from ports.
|
from ports.
|
||||||
|
25
elf/pldd.c
25
elf/pldd.c
@ -34,6 +34,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/ptrace.h>
|
#include <sys/ptrace.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#include <ldsodefs.h>
|
#include <ldsodefs.h>
|
||||||
#include <version.h>
|
#include <version.h>
|
||||||
@ -82,6 +83,7 @@ static char *exe;
|
|||||||
|
|
||||||
/* Local functions. */
|
/* Local functions. */
|
||||||
static int get_process_info (int dfd, long int pid);
|
static int get_process_info (int dfd, long int pid);
|
||||||
|
static void wait_for_ptrace_stop (long int pid);
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -170,6 +172,8 @@ main (int argc, char *argv[])
|
|||||||
tid);
|
tid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wait_for_ptrace_stop (tid);
|
||||||
|
|
||||||
struct thread_list *newp = alloca (sizeof (*newp));
|
struct thread_list *newp = alloca (sizeof (*newp));
|
||||||
newp->tid = tid;
|
newp->tid = tid;
|
||||||
newp->next = thread_list;
|
newp->next = thread_list;
|
||||||
@ -194,6 +198,27 @@ main (int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Wait for PID to enter ptrace-stop state after being attached. */
|
||||||
|
static void
|
||||||
|
wait_for_ptrace_stop (long int pid)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
/* While waiting for SIGSTOP being delivered to the tracee we have to
|
||||||
|
reinject any other pending signal. Ignore all other errors. */
|
||||||
|
while (waitpid (pid, &status, __WALL) == pid && WIFSTOPPED (status))
|
||||||
|
{
|
||||||
|
/* The STOP signal should not be delivered to the tracee. */
|
||||||
|
if (WSTOPSIG (status) == SIGSTOP)
|
||||||
|
return;
|
||||||
|
if (ptrace (PTRACE_CONT, pid, NULL,
|
||||||
|
(void *) (uintptr_t) WSTOPSIG (status)))
|
||||||
|
/* The only possible error is that the process died. */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Handle program arguments. */
|
/* Handle program arguments. */
|
||||||
static error_t
|
static error_t
|
||||||
parse_opt (int key, char *arg, struct argp_state *state)
|
parse_opt (int key, char *arg, struct argp_state *state)
|
||||||
|
Loading…
Reference in New Issue
Block a user