mirror of https://github.com/pwndbg/pwndbg.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.abc
|
|
import os
|
|
import sys
|
|
import traceback
|
|
|
|
import gdb
|
|
|
|
|
|
def fix_exit():
|
|
major_ver = int(gdb.VERSION.split(".")[0])
|
|
if major_ver <= 15:
|
|
# On certain verions of gdb (used on ubuntu 24.04) using sys.exit() can cause
|
|
# a segfault. See:
|
|
# https://github.com/pwndbg/pwndbg/pull/2900#issuecomment-2825456636
|
|
# https://sourceware.org/bugzilla/show_bug.cgi?id=31946
|
|
def _patched_exit(exit_code):
|
|
# argparse requires a SystemExit exception, otherwise our CLI commands will exit incorrectly on invalid arguments
|
|
stack_list = traceback.extract_stack(limit=2)
|
|
if len(stack_list) == 2:
|
|
p = stack_list[0]
|
|
if p.filename.endswith("/argparse.py"):
|
|
raise SystemExit()
|
|
|
|
sys.stdout.flush()
|
|
sys.stderr.flush()
|
|
os._exit(exit_code)
|
|
|
|
sys.exit = _patched_exit
|
|
|
|
|
|
def fix_stdout():
|
|
# Add the original stdout methods back to gdb._GdbOutputFile for pwnlib colors
|
|
sys.stdout.isatty = sys.__stdout__.isatty
|
|
sys.stdout.fileno = sys.__stdout__.fileno
|
|
|
|
|
|
def fix_readline():
|
|
# Fix gdb readline bug: https://github.com/pwndbg/pwndbg/issues/2232#issuecomment-2542564965
|
|
class GdbRemoveReadlineFinder(importlib.abc.MetaPathFinder):
|
|
def find_spec(self, fullname, path=None, target=None):
|
|
if fullname == "readline":
|
|
raise ImportError("readline module disabled under GDB")
|
|
return None
|
|
|
|
sys.meta_path.insert(0, GdbRemoveReadlineFinder())
|
|
|
|
|
|
fix_stdout()
|
|
fix_readline()
|
|
fix_exit()
|