diff options
author | Pedro Alves <palves@redhat.com> | 2017-06-19 12:46:47 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2017-06-19 12:46:47 +0100 |
commit | 16b7a7199881fa26fc863279bbf08741e5674b5d (patch) | |
tree | 1c6382482a11c0a28d44fd0e5788a5cce8b0e608 | |
parent | 72e84f969481f52daf6741c6bb4d0e92f9668389 (diff) | |
download | gdb-16b7a7199881fa26fc863279bbf08741e5674b5d.zip gdb-16b7a7199881fa26fc863279bbf08741e5674b5d.tar.gz gdb-16b7a7199881fa26fc863279bbf08741e5674b5d.tar.bz2 |
.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 <palves@redhat.com>
* dwarf2read.c (write_psymtabs_to_index): Construct file_closer
after gdb::unlinker.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 6 |
2 files changed, 10 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aaf4b89..c7cf410 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-06-19 Pedro Alves <palves@redhat.com> + + * dwarf2read.c (write_psymtabs_to_index): Construct file_closer + after gdb::unlinker. + 2017-06-19 Sergio Durigan Junior <sergiodj@redhat.com> * mi/mi-cm-env.c (_initialize_mi_cmd_env): Use getenv instead of diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index abe14b2..2369d4b 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; |