From 16b7a7199881fa26fc863279bbf08741e5674b5d Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 19 Jun 2017 12:46:47 +0100 Subject: [PATCH] .gdb_index writer: close the file before unlinking it We should close the file before unlinking because on MS-Windows one cannot delete a file that is still open. I considered making 'gdb::unlinker::unlinker(const char *)' 'noexcept(true)' and then adding static_assert (noexcept (gdb::unlinker (filename.c_str ())), ""); but that doesn't really work because gdb::unlinker has a gdb_assert, which can throw a QUIT if/when the assertion fails. 'noexcept(true)' would cause GDB to abruptly terminate if/when the assertion fails. gdb/ChangeLog: 2017-06-19 Pedro Alves * dwarf2read.c (write_psymtabs_to_index): Construct file_closer after gdb::unlinker. --- gdb/ChangeLog | 5 +++++ gdb/dwarf2read.c | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aaf4b891aee..c7cf4101317 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-06-19 Pedro Alves + + * dwarf2read.c (write_psymtabs_to_index): Construct file_closer + after gdb::unlinker. + 2017-06-19 Sergio Durigan Junior * mi/mi-cm-env.c (_initialize_mi_cmd_env): Use getenv instead of diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index abe14b25fd3..2369d4b73b4 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -23776,8 +23776,12 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir) if (!out_file) error (_("Can't open `%s' for writing"), filename.c_str ()); - file_closer close_out_file (out_file); + /* Order matters here; we want FILE to be closed before FILENAME is + unlinked, because on MS-Windows one cannot delete a file that is + still open. (Don't call anything here that might throw until + file_closer is created.) */ gdb::unlinker unlink_file (filename.c_str ()); + file_closer close_out_file (out_file); mapped_symtab symtab; data_buf cu_list; -- 2.30.2