forked from BSC-RM/slurm_simulator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ptrace.patch
126 lines (93 loc) · 4.14 KB
/
ptrace.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<http://linux.llnl.gov/software/kernel/ptrace.html>
The Linux kernels must implement ptrace semantics required by the TotalView
debugger. In order to initiate a parallel job under debugger control, a
resource manager or job launch utility must be able to start all tasks
in a stopped state, notify TotalView, and then allow TotalView debugger
servers to attach to all tasks. This functionality requires the ability to:
* Detach from a traced process and leave the process stopped
* Attach to a stopped process
Most newer versions of the Linux kernel support this functionality. For
some older Linux kernels, both of the above are impossible without the
following patch by Vic Zandy:
* initial posting <http://seclists.org/linux-kernel/2001/Dec/5146.html>
* follow up <http://seclists.org/lists/linux-kernel/2002/Mar/4490.html>
Further discussion of Vic's patch can be found in this thread
<http://seclists.org/lists/linux-kernel/2003/Mar/4457.html>. The main
objections to the patch seemed to be
* It causes a behavior change for ptrace()
* No apparent agreement on the "right" thing to do when attaching to
a stopped process.
[Any Etnus or Quadrics references to patches available?]
On a vanilla 2.6.4 kernel, the ptrace() test is able to accomplish part
1 of the test (detaching from a process and leaving the process
stopped), but part 2 (attaching to a stopped process) appears to still
be failing.
It is possible to workaround a failure of step 2. Technically, it is not
the attach that hangs when doing a ptrace() of a stopped process, but
the subsequent call to waitpid(). Since the process was already stopped,
the waitpid() never returns. Perhaps Etnus has implemented a workaround
for this behavior.
Testing:
The followinbg piece of test code can be used to verify that the proper
functionality exists in the current kernel:
testptrace.c <http://linux.llnl.gov/software/kernel/testptrace.c>
This test should succeed when run without any arguments.
------------------------------------------------------------------------
<http://www.seclists.org/lists/linux-kernel/202/Mar/4490.html>
Linux Kernel: Re: [PATCH] ptrace on stopped processes (2.4)
From: Vic Zandy@cs.wisc.edu
Date: Mar 18 2002
This is a repost of the ptrace patch to 2.4 kernels
we've discussed in recent months.
Since the last post, I have updated it to linux 2.4.18
(no changes) and tested it with subterfuge and uml.
Subterfuge seems to be unaffected.
UML needs minor modifications; I've discussed them with
Jeff Dike and (I believe) he is happy.
I believe I have addressed everyone's concerns.
The patch fixes these two bugs:
1. gdb and other tools cannot attach to a stopped
process. The wait that follows the PTRACE_ATTACH
will block indefinitely.
2. It is not possible to use PTRACE_DETACH to leave
a process stopped, because ptrace ignores SIGSTOPs
sent by the tracing process.
Vic
--- /home/vic/p/linux-2.4.18.orig/kernel/ptrace.c Wed Mar 13 13:14:54 2002
+++ /home/vic/p/linux-2.4.18/kernel/ptrace.c Mon Mar 18 21:58:11 2002
@@ -54,6 +54,7 @@
int ptrace_attach(struct task_struct *task)
{
+ int stopped;
task_lock(task);
if (task->pid <= 1)
goto bad;
@@ -90,7 +91,13 @@
}
write_unlock_irq(&tasklist_lock);
+ stopped = (task->state == TASK_STOPPED);
send_sig(SIGSTOP, task, 1);
+ /* If it was stopped when we got here,
+ clear the pending SIGSTOP. */
+ if (stopped)
+ wake_up_process(task);
+
return 0;
bad:
--- /home/vic/p/linux-2.4.18.orig/arch/i386/kernel/signal.c Wed Mar 13
13:16:44 2002
+++ /home/vic/p/linux-2.4.18/arch/i386/kernel/signal.c Wed Mar 13
16:31:38 2002
@@ -620,9 +620,9 @@
continue;
current->exit_code = 0;
- /* The debugger continued. Ignore SIGSTOP. */
- if (signr == SIGSTOP)
- continue;
+ /* The debugger continued. */
+ if (signr == SIGSTOP && current->ptrace & PT_PTRACED)
+ continue; /* ignore SIGSTOP */
/* Update the siginfo structure. Is this good? */
if (signr != info.si_signo) {
-
------------------------------------------------------------------------