From bea3329b76cf131ad4ac27acb6728b38984998b9 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Mon, 26 Apr 2021 11:27:07 -0400 Subject: [PATCH] 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 --- gdb/ChangeLog | 6 ++++++ gdb/cli/cli-dump.c | 3 +++ gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.base/dump.exp | 10 ++++++++++ 4 files changed, 24 insertions(+) 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 + + PR gdb/27773 + * cli/cli-dump.c (dump_binary_file): Check result of + gdb_fopen_cloexec. + 2021-04-25 Sergei Trofimovich * 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 + + PR gdb/27773 + * gdb.base/dump.exp: Test dump to non-existent dir. + 2021-04-26 Luis Machado * 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 -- 2.30.2