@ -3,11 +3,10 @@ from __future__ import annotations
import argparse
from typing import Optional
import gdb
import pwndbg . aglib . memory
import pwndbg . chain
import pwndbg . commands
import pwndbg . gdblib. memory
import pwndbg . dbg
from pwndbg . color import message
parser = argparse . ArgumentParser (
@ -189,17 +188,17 @@ parser.add_argument(
@pwndbg.commands.ArgparsedCommand ( parser , command_name = " plist " )
def plist (
path : str ,
next : int ,
next : str ,
sentinel : int ,
inner_name : str ,
field_name : str ,
inner_name : Optional [ str ] ,
field_name : Optional [ str ] ,
offset : int ,
count : Optional [ int ] = None ,
) - > None :
# Have GDB parse the path for us and check if it's valid.
try :
first = gdb. parse_and_eval ( path )
except gdb. e rror as e :
first = pwndbg. dbg . selected_frame ( ) . evaluate_expression ( path )
except pwndbg. dbg_mod . E rror as e :
print ( message . error ( f " { e } " ) )
return
@ -219,16 +218,16 @@ def plist(
# for the error mesages.
sep = " . "
deref = " "
if first . type . code == gdb. TYPE_CODE_PT R:
if first . type . code == pwndbg. dbg_mod . TypeCode . POINTE R:
sep = " -> "
deref = " * "
try :
first = first . dereference ( )
except gdb. e rror as e :
except pwndbg. dbg_mod . E rror as e :
print ( message . error ( f " Pointer at { path } could not be dereferenced: { e } " ) )
return
if first . type . code == gdb. TYPE_CODE_PT R:
if first . type . code == pwndbg. dbg_mod . TypeCode . POINTE R:
print ( message . error ( f " { path } is not a value or a single pointer to one " ) )
return
@ -247,7 +246,7 @@ def plist(
try :
inner = first [ inner_name ]
inner_sep = " -> "
except gdb. e rror as e :
except pwndbg. dbg_mod . E rror as e :
print ( message . error ( f " Cannot find component { inner_name } in { path } : { e } " ) )
return
if inner . is_optimized_out :
@ -265,14 +264,14 @@ def plist(
next_ptr = inner [ next ]
next_ptr_loc = inner
next_ptr_name = f " { inner_name } . { next } "
except gdb. e rror as e :
except pwndbg. dbg_mod . E rror as e :
print ( message . error ( f " Cannot find component { next_ptr_name } in { path } : { e } " ) )
return
if next_ptr . is_optimized_out :
print ( message . error ( f " { path } { sep } { next_ptr_name } has been optimized out " ) )
return
if next_ptr . type . code != gdb. TYPE_CODE_PT R:
if next_ptr . type . code != pwndbg. dbg_mod . TypeCode . POINTE R:
print ( message . error ( f " { path } { sep } { next_ptr_name } is not a pointer " ) )
return
@ -282,7 +281,7 @@ def plist(
if field_name is not None :
try :
field = first [ field_name ]
except gdb. e rror as e :
except pwndbg. dbg_mod . E rror as e :
print ( message . error ( f " Cannot find component { field_name } in { path } : { e } " ) )
return
field_type = field . type
@ -409,13 +408,13 @@ def plist(
target_type = field_type
target_address = address + field_offset
value = pwndbg . gdb lib. memory . get_typed_pointer_value ( target_type , target_address )
value = pwndbg . a glib. memory . get_typed_pointer_value ( target_type , target_address )
symbol = pwndbg . gdblib. symbol . get ( target_address )
symbol = pwndbg . dbg. selected_inferior ( ) . symbol_name_at_address ( target_address )
symbol = f " < { symbol } > " if symbol else " "
print ( f " { target_address : #x } { symbol } : { value } " )
except gdb. e rror as e :
print ( f " { target_address : #x } { symbol } : { value . value_to_human_readable ( ) } " )
except pwndbg. dbg_mod . E rror as e :
print ( message . error ( f " Cannot dereference { address : #x } for list link # { i + 1 } : { e } " ) )
print ( message . error ( " Is the linked list corrupted or is the sentinel value wrong? " ) )
return