gdb: check result of gdb_fopen_cloexec in dump_binary_file
authorSimon Marchi <simon.marchi@polymtl.ca>
Mon, 26 Apr 2021 15:27:07 +0000 (11:27 -0400)
committerSimon Marchi <simon.marchi@polymtl.ca>
Mon, 26 Apr 2021 15:27:07 +0000 (11:27 -0400)
Bug 27773 shows that passing a filename in a non-existent directory to
the "dump binary" command leads to a gdb crash.  This is because the
gdb_fopen_cloexec in dump_binary_file fails (returns nullptr) and the
return value is not checked.  Fix that by erroring out if
gdb_fopen_cloexec fails.

gdb/ChangeLog:

PR gdb/27773
* cli/cli-dump.c (dump_binary_file): Check result of
gdb_fopen_cloexec.

gdb/testsuite/ChangeLog:

PR gdb/27773
* gdb.base/dump.exp: Test dump to non-existent dir.

Change-Id: Iea89a3bf9e6b9dcc31142faa5ae17bc855759328

gdb/ChangeLog
gdb/cli/cli-dump.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/dump.exp

index 2fc74f5592aaf7d3fde4b5536a4c2bade92bdc7b..a180c32058d70d6e258d6c53e35f618eaeed94e3 100644 (file)
@@ -1,3 +1,9 @@
+2021-04-26  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       PR gdb/27773
+       * cli/cli-dump.c (dump_binary_file): Check result of
+       gdb_fopen_cloexec.
+
 2021-04-25  Sergei Trofimovich  <siarheit@google.com>
 
        * sparc-linux-nat.c (sparc_linux_nat_target): fix sparc build
index ee3ce03be035df520c2e857166080170c9ba97bf..1df26626f9d2b1e52af8e7fa72232d5fbce8dd4b 100644 (file)
@@ -135,6 +135,9 @@ dump_binary_file (const char *filename, const char *mode,
   int status;
 
   gdb_file_up file = gdb_fopen_cloexec (filename, mode);
+  if (file == nullptr)
+    perror_with_name (filename);
+
   status = fwrite (buf, len, 1, file.get ());
   if (status != 1)
     perror_with_name (filename);
index 6a400dc3c5d4ba4ea707bdc6b2678ef4aaf4bc00..8c4e34728b4199a09c710c06dd1eba16763bfcb9 100644 (file)
@@ -1,3 +1,8 @@
+2021-04-26  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       PR gdb/27773
+       * gdb.base/dump.exp: Test dump to non-existent dir.
+
 2021-04-26  Luis Machado  <luis.machado@linaro.org>
 
        * gdb.arch/aarch64-dbreg-contents.c (set_watchpoint): Fix arch level
index 2b792373c6cd8364fc939be7b37268171fbb9427..52c698333d205508ad69cea09cd76fbbf2c097c0 100644 (file)
@@ -24,6 +24,8 @@ set options  {debug}
 set is64bitonly "no"
 set endian "auto"
 
+set formats {binary ihex srec tekhex  verilog}
+
 if [istarget "alpha*-*-*"] then {
     # SREC etc cannot handle 64-bit addresses.  Force the test
     # program into the low 31 bits of the address space.
@@ -467,6 +469,14 @@ if ![string compare $is64bitonly "no"] then {
 }
 
 
+# Test writing a file of each format to a directory that does not exist.
+
+foreach_with_prefix format $formats {
+    gdb_test "dump $format memory /tmp/non/existent/directory/file $array_start $array_end" \
+       "/tmp/non/existent/directory/file: No such file or directory." \
+       "dump to non-existent directory"
+}
+
 # Now start a fresh gdb session, and reload the saved value files.
 
 gdb_exit