rtemstoolkit/elf,files: Catch exceptions in destructors.

Catch exceptions in destructures and print a message to avoid
an unhandled exception happening in an exception stack unwind.
This commit is contained in:
Chris Johns
2018-05-08 15:09:46 +10:00
parent f7d303f104
commit b73f905e3a
2 changed files with 101 additions and 28 deletions

View File

@@ -434,9 +434,23 @@ namespace rld
}
file::~file ()
{
try
{
end ();
}
catch (rld::error re)
{
std::cerr << "error: rld::elf::file::~file: "
<< re.where << ": " << re.what
<< std::endl;
}
catch (...)
{
std::cerr << "error: rld::elf::file::~file: unhandled exception"
<< std::endl;
}
}
void
file::reference_obtain ()
@@ -447,6 +461,7 @@ namespace rld
void
file::reference_release ()
{
if (refs > 0)
--refs;
}
@@ -525,8 +540,7 @@ namespace rld
if (archive_ && (ek != ELF_K_ELF))
throw rld::error ("File format in archive not ELF",
"elf:file:begin: " + name__);
else
{
if (ek == ELF_K_AR)
archive = true;
else if (ek == ELF_K_ELF)
@@ -534,7 +548,6 @@ namespace rld
else
throw rld::error ("File format not ELF or archive",
"elf:file:begin: " + name__);
}
if (!writable_)
{
@@ -545,7 +558,7 @@ namespace rld
if (ek == ELF_K_ELF)
{
oclass = ::gelf_getclass (elf__);
ident_str = elf_getident (elf__, &ident_size);
ident_str = ::elf_getident (elf__, &ident_size);
}
}
@@ -567,15 +580,6 @@ namespace rld
if (refs > 0)
throw rld::error ("References still held", "elf:file:end: " + name_);
if (elf_)
{
if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
std::cout << "libelf::end: " << elf_
<< ' ' << name_ << std::endl;
::elf_end (elf_);
elf_ = 0;
}
if (fd_ >= 0)
{
if (!writable)
@@ -595,12 +599,21 @@ namespace rld
fd_ = -1;
name_.clear ();
archive = false;
elf_ = 0;
oclass = 0;
ident_str = 0;
ident_size = 0;
writable = false;
secs.clear ();
if (elf_)
{
if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
std::cout << "libelf::end: " << elf_
<< ' ' << name_ << std::endl;
::elf_end (elf_);
elf_ = 0;
}
}
}

View File

@@ -256,10 +256,12 @@ namespace rld
image::~image ()
{
if (references_)
std::cerr << "rtl:file:image: references when destructing";
std::cerr << "rtl:file:image: references when destructing" << std::endl;
if (fd_ >= 0)
{
::close (fd_);
fd_= -1;
if (writable && remove)
{
if (rld::verbose () >= RLD_VERBOSE_INFO)
@@ -268,6 +270,22 @@ namespace rld
::unlink (name_.path ().c_str ());
}
}
try
{
elf_.end ();
}
catch (rld::error re)
{
std::cerr << "error: rld::files::image:::~image: "
<< re.where << ": " << re.what
<< std::endl;
}
catch (...)
{
std::cerr << "error: rld::files::image:::~image: unhandled exception"
<< std::endl;
}
}
void
@@ -536,10 +554,24 @@ namespace rld
}
archive::~archive ()
{
try
{
end ();
close ();
}
catch (rld::error re)
{
std::cerr << "error: rld::files::archive::~archive: "
<< re.where << ": " << re.what
<< std::endl;
}
catch (...)
{
std::cerr << "error: rld::files::archive::~archive: unhandled exception"
<< std::endl;
}
}
void
archive::begin ()
@@ -959,10 +991,24 @@ namespace rld
}
object::~object ()
{
try
{
end ();
close ();
}
catch (rld::error re)
{
std::cerr << "error: rld::files::object::~object: "
<< re.where << ": " << re.what
<< std::endl;
}
catch (...)
{
std::cerr << "error: rld::files::object::~object: unhandled exception"
<< std::endl;
}
}
void
object::open (bool writable)
@@ -1317,9 +1363,23 @@ namespace rld
}
cache::~cache ()
{
try
{
close ();
}
catch (rld::error re)
{
std::cerr << "error: rld::files:cache::~cache: "
<< re.where << ": " << re.what
<< std::endl;
}
catch (...)
{
std::cerr << "error: rld::files::cache::~cache: unhandled exception"
<< std::endl;
}
}
void
cache::open ()