summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2021-04-26 11:27:07 -0400
committerSimon Marchi <simon.marchi@polymtl.ca>2021-04-26 11:27:07 -0400
commitbea3329b76cf131ad4ac27acb6728b38984998b9 (patch)
tree5c8d8482d6ec1da893061e2e263a55a2fff28a71
parent21f91785752b59d03117f7803b7e1c9a58e62dbe (diff)
downloadbinutils-gdb-bea3329b76cf131ad4ac27acb6728b38984998b9.tar.gz
gdb: check result of gdb_fopen_cloexec in dump_binary_file
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
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/cli/cli-dump.c3
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/dump.exp10
4 files changed, 24 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 2fc74f5592a..a180c32058d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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
diff --git a/gdb/cli/cli-dump.c b/gdb/cli/cli-dump.c
index ee3ce03be03..1df26626f9d 100644
--- a/gdb/cli/cli-dump.c
+++ b/gdb/cli/cli-dump.c
@@ -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);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 6a400dc3c5d..8c4e34728b4 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -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
diff --git a/gdb/testsuite/gdb.base/dump.exp b/gdb/testsuite/gdb.base/dump.exp
index 2b792373c6c..52c698333d2 100644
--- a/gdb/testsuite/gdb.base/dump.exp
+++ b/gdb/testsuite/gdb.base/dump.exp
@@ -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