Changeset 273240 in webkit


Ignore:
Timestamp:
Feb 22, 2021 4:27:44 AM (3 years ago)
Author:
Philippe Normand
Message:

[Flatpak SDK] gdb unusable in sandbox
https://bugs.webkit.org/show_bug.cgi?id=222247

Reviewed by Žan Doberšek.

This patch adds support for unix signals disabling in developer builds, for the Flatpak SDK
runtime. Currently SIGINT, SIGHUP and SIGTERM will be ignored by the flatpak and bwrap
processes when they're running gdb in the sandbox runtime. This allows for nicer interactive
debugging sessions where Ctrl-C is actually handled by gdb.

  • PlatformGTK.cmake:
  • PlatformWPE.cmake:
  • flatpak/CMakeLists.txt: Added.
  • flatpak/flatpakutils.py:

(nullcontext):
(disable_signals):
(WebkitFlatpak.execute_command):
(WebkitFlatpak.run_in_sandbox):

  • flatpak/sigaction-disabler.c: Added.

(real_sigaction):
(sigaction):

  • flatpak/webkit-bwrap:
Location:
trunk/Tools
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r273239 r273240  
     12021-02-22  Philippe Normand  <pnormand@igalia.com>
     2
     3        [Flatpak SDK] gdb unusable in sandbox
     4        https://bugs.webkit.org/show_bug.cgi?id=222247
     5
     6        Reviewed by Žan Doberšek.
     7
     8        This patch adds support for unix signals disabling in developer builds, for the Flatpak SDK
     9        runtime. Currently SIGINT, SIGHUP and SIGTERM will be ignored by the flatpak and bwrap
     10        processes when they're running gdb in the sandbox runtime. This allows for nicer interactive
     11        debugging sessions where Ctrl-C is actually handled by gdb.
     12
     13        * PlatformGTK.cmake:
     14        * PlatformWPE.cmake:
     15        * flatpak/CMakeLists.txt: Added.
     16        * flatpak/flatpakutils.py:
     17        (nullcontext):
     18        (disable_signals):
     19        (WebkitFlatpak.execute_command):
     20        (WebkitFlatpak.run_in_sandbox):
     21        * flatpak/sigaction-disabler.c: Added.
     22        (real_sigaction):
     23        (sigaction):
     24        * flatpak/webkit-bwrap:
     25
    1262021-02-22  Philippe Normand  <pnormand@igalia.com>
    227
  • trunk/Tools/PlatformGTK.cmake

    r267177 r273240  
    33    add_subdirectory(WebKitTestRunner)
    44    add_subdirectory(ImageDiff)
     5    add_subdirectory(flatpak)
    56
    67    if (ENABLE_API_TESTS)
  • trunk/Tools/PlatformWPE.cmake

    r272643 r273240  
    77    add_subdirectory(TestRunnerShared)
    88    add_subdirectory(WebKitTestRunner)
     9    add_subdirectory(flatpak)
    910
    1011    if (ENABLE_API_TESTS)
  • trunk/Tools/flatpak/flatpakutils.py

    r273239 r273240  
    5151    from urllib2 import urlopen
    5252
     53try:
     54    from contextlib import nullcontext
     55except ImportError:
     56    @contextmanager
     57    def nullcontext(enter_result=None):
     58        yield enter_result
     59
    5360FLATPAK_REQUIRED_VERSION = "1.4.4"
    5461
     
    390397
    391398@contextmanager
    392 def disable_signals(signals=[signal.SIGINT]):
     399def disable_signals(signals=[signal.SIGINT, signal.SIGTERM, signal.SIGHUP]):
    393400    old_signal_handlers = []
    394401
    395402    for disabled_signal in signals:
    396         old_signal_handlers.append((disabled_signal, signal.getsignal(disabled_signal)))
     403        handler = signal.getsignal(disabled_signal)
     404        if handler:
     405            old_signal_handlers.append((disabled_signal, handler))
    397406        signal.signal(disabled_signal, signal.SIG_IGN)
    398407
     
    518527        self.sccache_scheduler = DEFAULT_SCCACHE_SCHEDULER
    519528
    520     def execute_command(self, args, stdout=None, stderr=None, env=None):
     529    def execute_command(self, args, stdout=None, stderr=None, env=None, keep_signals=True):
     530        if keep_signals:
     531            ctx_manager = nullcontext()
     532        else:
     533            ctx_manager = disable_signals()
    521534        _log.debug('Running: %s\n' % ' '.join(string_utils.decode(arg) for arg in args))
    522535        result = 0
    523         try:
    524             result = subprocess.check_call(args, stdout=stdout, stderr=stderr, env=env)
    525         except subprocess.CalledProcessError as err:
    526             if self.verbose:
    527                 cmd = ' '.join(string_utils.decode(arg) for arg in err.cmd)
    528                 message = "'%s' returned a non-zero exit code." % cmd
    529                 if stderr:
    530                     with open(stderr.name, 'r') as stderrf:
    531                         message += " Stderr: %s" % stderrf.read()
    532                 Console.error_message(message)
    533             return err.returncode
     536        with ctx_manager:
     537            try:
     538                result = subprocess.check_call(args, stdout=stdout, stderr=stderr, env=env)
     539            except subprocess.CalledProcessError as err:
     540                if self.verbose:
     541                    cmd = ' '.join(string_utils.decode(arg) for arg in err.cmd)
     542                    message = "'%s' returned a non-zero exit code." % cmd
     543                    if stderr:
     544                        with open(stderr.name, 'r') as stderrf:
     545                            message += " Stderr: %s" % stderrf.read()
     546                    Console.error_message(message)
     547                return err.returncode
    534548        return result
    535549
     
    884898        flatpak_env["LANG"] = "en_US.UTF-8"
    885899
     900        keep_signals = args[0] != "gdb"
     901        if not keep_signals:
     902            module_path = os.path.join(self.build_path, "lib", "libsigaction-disabler.so")
     903            # Enable module in bwrap child processes.
     904            extra_flatpak_args.append("--env=WEBKIT_FLATPAK_LD_PRELOAD=%s" % module_path)
     905            # Enable module in `flatpak run`.
     906            flatpak_env["LD_PRELOAD"] = module_path
     907
    886908        flatpak_command += extra_flatpak_args + ['--command=%s' % args[0], "org.webkit.Sdk"] + args[1:]
    887909
     
    897919
    898920        try:
    899             return self.execute_command(flatpak_command, stdout=stdout, env=flatpak_env)
     921            return self.execute_command(flatpak_command, stdout=stdout, env=flatpak_env, keep_signals=keep_signals)
    900922        except KeyboardInterrupt:
    901923            return 0
  • trunk/Tools/flatpak/webkit-bwrap

    r273238 r273240  
    111111    bwrap_args.extend(("--setenv", "PATH", "/usr/bin:/usr/lib/sdk/rust-stable/bin/"))
    112112
     113    if environ.get("WEBKIT_FLATPAK_LD_PRELOAD"):
     114        os.environ["LD_PRELOAD"] = environ["WEBKIT_FLATPAK_LD_PRELOAD"]
     115
    113116    command_line = ' '.join(map(shlex.quote, itertools.chain(bwrap_args, args)))
    114117
Note: See TracChangeset for help on using the changeset viewer.