Skip to content

Commit ff1cc05

Browse files
committed
Limit emulated signals to TERM and KILL
1 parent f245016 commit ff1cc05

File tree

2 files changed

+36
-19
lines changed

2 files changed

+36
-19
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
4747
import static com.oracle.graal.python.util.TimeUtils.SEC_TO_US;
4848

49+
import java.util.HashMap;
4950
import java.util.List;
5051
import java.util.Map;
5152
import java.util.concurrent.ConcurrentHashMap;
@@ -85,6 +86,7 @@
8586
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
8687
import com.oracle.graal.python.runtime.AsyncHandler;
8788
import com.oracle.graal.python.runtime.PosixSupportLibrary;
89+
import com.oracle.graal.python.runtime.PythonContext;
8890
import com.oracle.graal.python.runtime.PythonOptions;
8991
import com.oracle.graal.python.runtime.exception.PException;
9092
import com.oracle.graal.python.runtime.exception.PythonErrorType;
@@ -127,18 +129,20 @@ public void initialize(Python3Core core) {
127129
addBuiltinConstant("NSIG", Signals.SIGMAX + 1);
128130
}
129131

130-
public enum EmulatedSignal {
131-
SIGTERM(15),
132-
SIGKILL(9),
133-
SIGINT(2),
134-
SIGABRT(6),
135-
SIGQUIT(3);
132+
/*
133+
* When using emulated posix mode (where we esentially emulate Linux), we rely on some signals
134+
* being present even if they don't exist on the underlying platform, i.e. SIGKILL doesn't exist
135+
* on Windows, but we still need to pass it to emulated kill.
136+
*/
137+
private enum EmulatedSignal {
138+
TERM(15),
139+
KILL(9);
136140

137141
public final TruffleString name;
138142
public final int number;
139143

140144
EmulatedSignal(int number) {
141-
this.name = tsLiteral(name());
145+
this.name = tsLiteral("SIG" + name());
142146
this.number = number;
143147
}
144148
}
@@ -151,15 +155,19 @@ public void postInitialize(Python3Core core) {
151155
ModuleData moduleData = new ModuleData();
152156
signalModule.setModuleState(moduleData);
153157

158+
for (int i = 0; i < Signals.PYTHON_SIGNAL_NAMES.length; i++) {
159+
TruffleString name = Signals.PYTHON_SIGNAL_NAMES[i];
160+
if (name != null) {
161+
moduleData.signals.put(Signals.SIGNAL_NAMES[i], i);
162+
signalModule.setAttribute(name, i);
163+
}
164+
}
165+
154166
if (PosixSupportLibrary.getUncached().getBackend(core.getContext().getPosixSupport()).equalsUncached(T_JAVA, TS_ENCODING)) {
155167
for (EmulatedSignal signal : EmulatedSignal.values()) {
156-
signalModule.setAttribute(signal.name, signal.number);
157-
}
158-
} else {
159-
for (int i = 0; i < Signals.PYTHON_SIGNAL_NAMES.length; i++) {
160-
TruffleString name = Signals.PYTHON_SIGNAL_NAMES[i];
161-
if (name != null) {
162-
signalModule.setAttribute(name, i);
168+
if (signalModule.getAttribute(signal.name) == PNone.NO_VALUE) {
169+
moduleData.signals.put(signal.name(), signal.number);
170+
signalModule.setAttribute(signal.name, signal.number);
163171
}
164172
}
165173
}
@@ -186,6 +194,12 @@ public void postInitialize(Python3Core core) {
186194
}
187195
}
188196

197+
@TruffleBoundary
198+
public static int signalFromName(PythonContext context, String name) {
199+
PythonModule mod = context.lookupBuiltinModule(T__SIGNAL);
200+
return mod.getModuleState(ModuleData.class).signals.getOrDefault(name, -1);
201+
}
202+
189203
public static void resetSignalHandlers(PythonModule mod) {
190204
ModuleData data = mod.getModuleState(ModuleData.class);
191205
if (data != null) {
@@ -546,6 +560,7 @@ static long getOldDelay(ModuleData moduleData) {
546560
}
547561

548562
private static final class ModuleData {
563+
final Map<String, Integer> signals = new HashMap<>();
549564
final ConcurrentHashMap<Integer, Object> signalHandlers = new ConcurrentHashMap<>();
550565
final ConcurrentHashMap<Integer, SignalHandler> defaultSignalHandlers = new ConcurrentHashMap<>();
551566
final ConcurrentLinkedDeque<SignalTriggerAction> signalQueue = new ConcurrentLinkedDeque<>();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import static com.oracle.graal.python.builtins.PythonOS.PLATFORM_LINUX;
4444
import static com.oracle.graal.python.builtins.PythonOS.PLATFORM_WIN32;
4545
import static com.oracle.graal.python.builtins.PythonOS.getPythonOS;
46+
import static com.oracle.graal.python.builtins.modules.SignalModuleBuiltins.signalFromName;
4647
import static com.oracle.graal.python.builtins.objects.thread.PThread.getThreadId;
4748
import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING;
4849
import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA;
@@ -216,7 +217,6 @@
216217
import com.oracle.graal.python.PythonLanguage;
217218
import com.oracle.graal.python.builtins.PythonOS;
218219
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins;
219-
import com.oracle.graal.python.builtins.modules.SignalModuleBuiltins.EmulatedSignal;
220220
import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum;
221221
import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.ErrorAndMessagePair;
222222
import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.OperationWouldBlockException;
@@ -1895,16 +1895,18 @@ public Object readlinkat(int dirFd, Object path,
18951895
}
18961896

18971897
@ExportMessage
1898-
public void kill(long pid, int signal) throws PosixException {
1898+
public void kill(long pid, int signal,
1899+
@Bind("$node") Node inliningTarget) throws PosixException {
1900+
PythonContext context = PythonContext.get(inliningTarget);
18991901
try {
1900-
if (signal == EmulatedSignal.SIGKILL.number) {
1902+
if (signal == signalFromName(context, "KILL")) {
19011903
sigkill((int) pid);
1902-
} else if (signal == EmulatedSignal.SIGTERM.number || signal == EmulatedSignal.SIGQUIT.number || signal == EmulatedSignal.SIGABRT.number || signal == EmulatedSignal.SIGINT.number) {
1904+
} else if (signal == signalFromName(context, "TERM")) {
19031905
sigterm((int) pid);
19041906
} else if (signal == 0) {
19051907
sigdfl((int) pid);
19061908
} else {
1907-
throw new UnsupportedPosixFeatureException("Sending arbitrary signals to child processes. Can only send some kill and term signals.");
1909+
throw new UnsupportedPosixFeatureException("Sending arbitrary signals to child processes. Can only send KILL and TERM signals.");
19081910
}
19091911
} catch (IndexOutOfBoundsException e) {
19101912
throw posixException(OSErrorEnum.ESRCH);

0 commit comments

Comments
 (0)