[PR gdb/27393] set directories: handle empty dirs.
authorLancelot SIX <lsix@lancelotsix.com>
Thu, 25 Feb 2021 00:30:49 +0000 (00:30 +0000)
committerLancelot SIX <lsix@lancelotsix.com>
Sat, 27 Feb 2021 14:29:39 +0000 (14:29 +0000)
As reported in gdb/27393, the 'directory' and 'set directories' commands
fail when parsing an empty dir name:

    (gdb) set directories ""
    /home/lsix/dev/gnu/binutils-gdb/gdbsupport/pathstuff.cc:132: internal-error: gdb::unique_xmalloc_ptr<char> gdb_abspath(const char*): Assertion `path != NULL && path[0] != '\0'' failed.

or

    (gdb) dir :
    /home/lsix/dev/gnu/binutils-gdb/gdbsupport/pathstuff.cc:132: internal-error: gdb::unique_xmalloc_ptr<char> gdb_abspath(const char*): Assertion `path != NULL && path[0] != '\0'' failed.

This patch fixes this issue by ignoring any attempt to add an empty
name to the source directories list.  'set dir ""' will reset the
directories list the same way 'set dir' would do it.

Tested on x86_64.

gdb/ChangeLog
gdb/source.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/source-dir.exp

index 8a2725368e37472f2a0935b1e287ee525fa3245d..bb7b2de0b58f6e2d21bee6cb6968aec503ed3ef1 100644 (file)
@@ -1,3 +1,8 @@
+2021-02-27  Lancelot Six  <lsix@lancelotsix.com>
+
+       PR gdb/27393
+       * source.c (add_path): Skip empty dirnames.
+
 2021-02-25  Kevin Buettner  <kevinb@redhat.com>
 
        * nat/aarch64-sve-linux-ptrace.h: Add comment regarding
index dc30dac6d78056a241d55f64285603b864f22185..3a8f829759bea1c1d98ca5fbec4ceb0068834a3e 100644 (file)
@@ -572,6 +572,8 @@ add_path (const char *dirname, char **which_path, int parse_separators)
            break;
        }
 
+      if (name[0] == '\0')
+        goto skip_dup;
       if (name[0] == '~')
        new_name_holder.reset (tilde_expand (name));
 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
index 625c4ecf493afab1671a9d8b0d978b5d2d5187c0..b92e67c9557fe68871ae29b07fd3f35d54e23a59 100644 (file)
@@ -1,3 +1,9 @@
+2021-02-27  Lancelot Six  <lsix@lancelotix.com>
+
+       PR gdb/27393
+       * gdb.base/source-dir.exp: Test that empty dirnames are skipped.
+
+
 2021-02-26  Tom Tromey  <tom@tromey.com>
 
        * lib/gdb.exp (skip_ctf_tests): Use expr on result.
index 988ea59afb55419233ff88ae768924ddf2354757..eff683199be57b19fd922e2f493985efb1951586 100644 (file)
@@ -163,5 +163,46 @@ proc test_truncated_comp_dir {} {
        "info source after setting directory search list"
 }
 
+proc test_change_search_directory_with_empty_dirname {} {
+    gdb_start
+
+    # Add 3 entries to the source directories list:
+    # - ""
+    # - "/foo"
+    # - "/bar"
+    # Since /foo and /bar probably do not exist, ignore the warnings printed by
+    # GDB.
+    if { [ishost *-*-mingw*] } {
+       gdb_test "set directories ;/foo;/bar" ".*"
+    } else {
+       gdb_test "set directories :/foo:/bar" ".*"
+    }
+
+    # The first entry added ("") should be ignored, only /foo and /bar are
+    # effectively added.
+    with_test_prefix "initial_directory_state" {
+       gdb_test "show directories" \
+           [search_dir_list [list \
+                                 "/foo" \
+                                 "/bar" \
+                                 "\\\$cdir" \
+                                 "\\\$cwd"]]
+    }
+
+    # Arguments can be quoted.  Check a empty string has the same effect as
+    # 'set directory' (i.e. reset to $cdir:$cwd)
+    gdb_test_no_output "set directories \"\""
+
+    with_test_prefix "directory_after_reset" {
+       gdb_test "show directories" \
+           [search_dir_list [list \
+                                 "\\\$cdir" \
+                                 "\\\$cwd"]]
+    }
+
+    gdb_exit
+}
+
 test_changing_search_directory
+test_change_search_directory_with_empty_dirname
 test_truncated_comp_dir