python / python/cpython

Sending many signals to a Python process crashes the interpreter

Offen
#118,143 9 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

type-bug
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
36k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug report

Bug description:

Consider the following simple program (test-breakage.py):

from time import sleep
import os
import signal


class Foreman:
    def __init__(self):
        signal.signal(signal.SIGUSR1, self.handle_sigusr1)
        pid = os.getpid()
        print("Test script created, my pid is %s", pid)
        with open("/tmp/test-breakage.pid", "w") as f:
            f.write(str(pid))

    def handle_sigusr1(self, sig, frame):
        print("handle_sigusr1")

    def run_forever(self):
        sleep(3600)


Foreman().run_forever()

Now, a tool to send "a lot" of signal to it:

import os
import sys
import signal


pid = int(sys.argv[1])
iterations = int(sys.argv[2])

for i in range(iterations):
    os.kill(pid, signal.SIGUSR1)

Or, if you want the signals to be sent more quickly, implemented in c:

#include <stdlib.h>
#include <signal.h>


int main(int argc, char*argv[]) {
    long pid, iterations;
    if (argc > 2) {
        pid = strtol(argv[1], NULL, 0);
        iterations = strtol(argv[2], NULL, 0);

        for (int i = 0; i < iterations; i++) {
            kill(pid, SIGUSR1);
        }
   }
   return 0;
}

Running these scripts with "sufficiently high" numbers results in various crashes in test-breakage

  • Exit with "User defined signal 1" (shouldn't happen, we've defined a handler)
  • RuntimeError without any further information
  • Exit without any printed string
  • RuntimeError: reentrant call inside <_io.BufferedWriter name=''>

(In all cases, after repeating "handle_sigusr1" a number of times first)

tested on Linux w. Python 3.10

CPython versions tested on:

3.10

Operating systems tested on:

Linux

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Start by reproducing the failure with the test-breakage.py signal handler and the Python or C signal-sending scripts on Linux. Compare the reported outcomes under sustained SIGUSR1 delivery; done means the interpreter remains stable and the registered handler continues to behave correctly without the listed crashes or unintended termination.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
operating-systems
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.