Commit d22fc0bc authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-32962: python-gdb catchs UnicodeDecodeError (GH-7693)

python-gdb now catchs UnicodeDecodeError exceptions when calling
string().
parent 019d33b7
python-gdb now catchs ``UnicodeDecodeError`` exceptions when calling
``string()``.
...@@ -270,12 +270,13 @@ class PyObjectPtr(object): ...@@ -270,12 +270,13 @@ class PyObjectPtr(object):
def safe_tp_name(self): def safe_tp_name(self):
try: try:
return self.type().field('tp_name').string() ob_type = self.type()
except NullPyObjectPtr: tp_name = ob_type.field('tp_name')
# NULL tp_name? return tp_name.string()
return 'unknown' # NullPyObjectPtr: NULL tp_name?
except RuntimeError: # RuntimeError: Can't even read the object at all?
# Can't even read the object at all? # UnicodeDecodeError: Failed to decode tp_name bytestring
except (NullPyObjectPtr, RuntimeError, UnicodeDecodeError):
return 'unknown' return 'unknown'
def proxyval(self, visited): def proxyval(self, visited):
...@@ -349,7 +350,9 @@ class PyObjectPtr(object): ...@@ -349,7 +350,9 @@ class PyObjectPtr(object):
try: try:
tp_name = t.field('tp_name').string() tp_name = t.field('tp_name').string()
tp_flags = int(t.field('tp_flags')) tp_flags = int(t.field('tp_flags'))
except RuntimeError: # RuntimeError: NULL pointers
# UnicodeDecodeError: string() fails to decode the bytestring
except (RuntimeError, UnicodeDecodeError):
# Handle any kind of error e.g. NULL ptrs by simply using the base # Handle any kind of error e.g. NULL ptrs by simply using the base
# class # class
return cls return cls
...@@ -617,7 +620,10 @@ class PyCFunctionObjectPtr(PyObjectPtr): ...@@ -617,7 +620,10 @@ class PyCFunctionObjectPtr(PyObjectPtr):
def proxyval(self, visited): def proxyval(self, visited):
m_ml = self.field('m_ml') # m_ml is a (PyMethodDef*) m_ml = self.field('m_ml') # m_ml is a (PyMethodDef*)
ml_name = m_ml['ml_name'].string() try:
ml_name = m_ml['ml_name'].string()
except UnicodeDecodeError:
ml_name = '<ml_name:UnicodeDecodeError>'
pyop_m_self = self.pyop_field('m_self') pyop_m_self = self.pyop_field('m_self')
if pyop_m_self.is_null(): if pyop_m_self.is_null():
...@@ -1340,13 +1346,13 @@ class wrapperobject(PyObjectPtr): ...@@ -1340,13 +1346,13 @@ class wrapperobject(PyObjectPtr):
try: try:
name = self.field('descr')['d_base']['name'].string() name = self.field('descr')['d_base']['name'].string()
return repr(name) return repr(name)
except (NullPyObjectPtr, RuntimeError): except (NullPyObjectPtr, RuntimeError, UnicodeDecodeError):
return '<unknown name>' return '<unknown name>'
def safe_tp_name(self): def safe_tp_name(self):
try: try:
return self.field('self')['ob_type']['tp_name'].string() return self.field('self')['ob_type']['tp_name'].string()
except (NullPyObjectPtr, RuntimeError): except (NullPyObjectPtr, RuntimeError, UnicodeDecodeError):
return '<unknown tp_name>' return '<unknown tp_name>'
def safe_self_addresss(self): def safe_self_addresss(self):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment