From 83962f8340726373e0d174dcf688818eb7faea6b Mon Sep 17 00:00:00 2001 From: Hannes Domani Date: Fri, 18 Dec 2020 18:23:41 +0100 Subject: [PATCH] Also compare frame_id_is_next in frapy_richcompare The last frame in a corrupt stack stores the frame_id of the next frame, so these two frames currently compare as equal. So if you have a backtrace where the oldest frame is corrupt, this happens: (gdb) py >f = gdb.selected_frame() >while f.older(): > f = f.older() >print(f == f.newer()) >end True With this change, that same example returns False. gdb/ChangeLog: 2021-02-07 Hannes Domani * python/py-frame.c (frapy_richcompare): Compare frame_id_is_next. --- gdb/ChangeLog | 4 ++++ gdb/python/py-frame.c | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 78cd0590e51..9e66fad0802 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2021-02-07 Hannes Domani + + * python/py-frame.c (frapy_richcompare): Compare frame_id_is_next. + 2021-02-05 Simon Marchi * symmisc.c (std_in, std_out, std_err): Remove. diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index 5c027547825..8e32ba55de4 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -658,8 +658,11 @@ frapy_richcompare (PyObject *self, PyObject *other, int op) return Py_NotImplemented; } - if (frame_id_eq (((frame_object *) self)->frame_id, - ((frame_object *) other)->frame_id)) + frame_object *self_frame = (frame_object *) self; + frame_object *other_frame = (frame_object *) other; + + if (self_frame->frame_id_is_next == other_frame->frame_id_is_next + && frame_id_eq (self_frame->frame_id, other_frame->frame_id)) result = Py_EQ; else result = Py_NE; -- 2.30.2