[2/2] gdb/source.c: Fix matching path substitute rule listing

Message ID 1401316902-12320-3-git-send-email-brad.mouring@ni.com
State Superseded
Headers

Commit Message

Brad Mouring May 28, 2014, 10:41 p.m. UTC
  The check for the source (or "from") directory snippet in listing
matching path substitution rules currently will not match anything
other than a direct match of the "from" field in a substitution rule,
resulting in the incorrect behavior below

...
(gdb) set substitute-path /a/path /another/path
(gdb) show substitute-path
List of all source path substitution rules:
  `/a/path' -> `/another/path'.
(gdb) show substitute-path /a/path/to/a/file.ext
Source path substitution rule matching `/a/path/to/a/file.ext':
(gdb) show substitute-path /a/path
Source path substitution rule matching `/a/path':
  `/a/path' -> `/another/path'.
...

This change effects the following behavior by (sanely) checking
with the length of the "from" portion of a rule and ensuring that
the next character of the path considered for substitution is a path
delimiter. With this change, the following behavior is garnered
...
(gdb) set substitute-path /a/path /another/path
(gdb) show substitute-path
List of all source path substitution rules:
  `/a/path' -> `/another/path'.
(gdb) show substitute-path /a/path/to/a/file.ext
Source path substitution rule matching `/a/path/to/a/file.ext':
  `/a/path' -> `/another/path'.
(gdb) show substitute-path /a/pathological/case/that/should/fail.err
Source path substitution rule matching `/a/pathological/case/that/should/fail.err':
(gdb)

Signed-off-by: Brad Mouring <brad.mouring@ni.com>
---
 gdb/source.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)
  

Comments

Joel Brobecker June 2, 2014, 3:14 p.m. UTC | #1
Brad,

I would merge both patches into one, in this case, as I suspect
this will simplify submission for you. Make sure to always include
the ChangeLog entry in your revision log for every patch.

The introduction email (aka cover letter) explains very well what
you are trying to do, and I would use that as your revision log
for the merged patch.

> diff --git a/gdb/source.c b/gdb/source.c
> index c77a4f4..a32872f 100644
> --- a/gdb/source.c
> +++ b/gdb/source.c
> @@ -1875,6 +1875,7 @@ show_substitute_path_command (char *args, int from_tty)
>    char **argv;
>    char *from = NULL;
>    struct cleanup *cleanup;
> +  int rule_from_len;
>    
>    argv = gdb_buildargv (args);
>    cleanup = make_cleanup_freeargv (argv);
> @@ -1897,7 +1898,11 @@ show_substitute_path_command (char *args, int from_tty)
>  
>    while (rule != NULL)
>      {
> -      if (from == NULL || FILENAME_CMP (rule->from, from) == 0)
> +      rule_from_len = strlen(rule->from);
> +      if (from == NULL ||
> +        ((filename_ncmp (rule->from, from, rule_from_len) == 0) &&
> +          (IS_DIR_SEPARATOR (from[rule_from_len]) ||
> +          from[rule_from_len] == 0)))

Why not use substitute_path_rule_matches, here?
  

Patch

diff --git a/gdb/source.c b/gdb/source.c
index c77a4f4..a32872f 100644
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -1875,6 +1875,7 @@  show_substitute_path_command (char *args, int from_tty)
   char **argv;
   char *from = NULL;
   struct cleanup *cleanup;
+  int rule_from_len;
   
   argv = gdb_buildargv (args);
   cleanup = make_cleanup_freeargv (argv);
@@ -1897,7 +1898,11 @@  show_substitute_path_command (char *args, int from_tty)
 
   while (rule != NULL)
     {
-      if (from == NULL || FILENAME_CMP (rule->from, from) == 0)
+      rule_from_len = strlen(rule->from);
+      if (from == NULL ||
+        ((filename_ncmp (rule->from, from, rule_from_len) == 0) &&
+          (IS_DIR_SEPARATOR (from[rule_from_len]) ||
+          from[rule_from_len] == 0)))
         printf_filtered ("  `%s' -> `%s'.\n", rule->from, rule->to);
       rule = rule->next;
     }