Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH v2] gdb: fix filename matching in skiplist_entry::do_skip_gfile_p
@ 2026-02-03 18:55 Guinevere Larsen
  2026-02-04 21:47 ` Andrew Burgess
  0 siblings, 1 reply; 5+ messages in thread
From: Guinevere Larsen @ 2026-02-03 18:55 UTC (permalink / raw)
  To: gdb-patches; +Cc: Guinevere Larsen

GDB is incorrectly matching -gfile skip entries.  This is a regression
introduced by the following commit:

    commit 02646a4c561ec88491114b87950cbb827c7d614c
    Author: Fangrui Song <maskray@sourceware.org>
    Date:   Sun Dec 29 14:57:44 2024 -0800

    skip -gfile: call fnmatch without FNM_FILE_NAME

The author made the reasonable, but unfortunately incorrect, assumption
that glibc's fnmatch, and consequently gdb_filename_fnmatch, will return
the integer equivalent of a boolean (that is, 0 if the filenames do *not*
match, non-zero if they match), but that is incorrect.  This made it so
using `skip -gfile` would skip all functions except the ones that are
meant to be skipped.  This commit fixes that inverted logic.

This incorrect matching masked a different bug, that we were treating
all user-provided gfiles as absolute paths, and the gdb.base/skip.exp
test happened to not catch it because the "skip.c" file is different
enough to exit earlier in the comparisons. This was solved by making it
so if the gfile is not absolute, the regex "*/" is prepended, allowing
for any number of directories before the first user-provided one, but
ensuring that the beginning of the directory must match what the user
provided.

The limitation of this approach is that, if a user has given the regex
"a/c*.c", and the inferior contains both "/b/a/code.c" and
"/c/a/code.c" and is running on the folder /b, functions from both may
be skipped when it would be reasonable for the user to expect only
/b/a/code.c to be skipped.  This is done anyway because I believe the
likelihood of something like this actually happening is incredibly low,
and it was the behavior of GDB before the aforementioned commit so we'll
just be returning to previous behavior.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33872
---
 gdb/skip.c                      | 15 ++++++++++++++-
 gdb/testsuite/gdb.base/skip.exp | 15 +++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/gdb/skip.c b/gdb/skip.c
index 1255c7d2152..5770d6251a8 100644
--- a/gdb/skip.c
+++ b/gdb/skip.c
@@ -548,7 +548,20 @@ skiplist_entry::do_skip_gfile_p (const symtab_and_line &function_sal) const
       /* Note: symtab_to_fullname caches its result, thus we don't have to.  */
       const char *fullname = symtab_to_fullname (function_sal.symtab);
 
-      result = gdb_filename_fnmatch (m_file.c_str (), fullname, FNM_NOESCAPE);
+      /* If the pattern does not correspond to an absolute path, add a glob
+	 that accepts any leading path.  While this is not technically
+	 correct, it is very likely that a user wished to skip /a/b/code.c and
+	 not skip /c/b/code.c, and both files are relevant to the project.
+	 Plus, this is how GDB has always worked, so users are likely expecting
+	 that behavior.  */
+      std::string glob = "*/";
+      if (IS_ABSOLUTE_PATH (m_file.c_str ()))
+	glob = m_file;
+      else
+	glob += m_file;
+
+      result = gdb_filename_fnmatch
+		(glob.c_str (), fullname, FNM_NOESCAPE) == 0;
     }
 
   if (debug_skip)
diff --git a/gdb/testsuite/gdb.base/skip.exp b/gdb/testsuite/gdb.base/skip.exp
index 4541e61ec00..7cec1fc7021 100644
--- a/gdb/testsuite/gdb.base/skip.exp
+++ b/gdb/testsuite/gdb.base/skip.exp
@@ -336,3 +336,18 @@ with_test_prefix "skip delete completion" {
     test_gdb_complete_none "skip delete a1"
     test_gdb_complete_none "skip delete 2-33"
 }
+
+# PR gdb/33872 was a regression that would happen when using
+# skip -gfile and a full path had to be matched.  The logic had
+# been inverted and it wold skip all files but the one with the
+# one we wanted to skip
+with_test_prefix "PR gdb/33872" {
+    gdb_test "skip -gfi /unused/path/*" \
+	"File\\(s\\) /unused/path/\\* will be skipped when stepping\."
+
+    if {![runto_main]} {
+	return
+    }
+
+    gdb_test "step" "bar \\\(\\\) at .*"
+}

base-commit: a6d46a04ea3e165c0ce2f11cd9d68bdcb81f4e4e
-- 
2.52.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-02-11 14:33 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-02-03 18:55 [PATCH v2] gdb: fix filename matching in skiplist_entry::do_skip_gfile_p Guinevere Larsen
2026-02-04 21:47 ` Andrew Burgess
2026-02-05 12:43   ` Guinevere Larsen
2026-02-09 15:15   ` Andrew Burgess
2026-02-11 14:33     ` Andrew Burgess

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox