Changeset b73f905 in rtems-tools


Ignore:
Timestamp:
May 8, 2018, 5:09:46 AM (13 months ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
1e21ea7
Parents:
f7d303f
git-author:
Chris Johns <chrisj@…> (05/08/18 05:09:46)
git-committer:
Chris Johns <chrisj@…> (06/18/18 02:26:16)
Message:

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.

Location:
rtemstoolkit
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • rtemstoolkit/rld-elf.cpp

    rf7d303f rb73f905  
    436436    file::~file ()
    437437    {
    438       end ();
     438      try
     439      {
     440        end ();
     441      }
     442      catch (rld::error re)
     443      {
     444        std::cerr << "error: rld::elf::file::~file: "
     445                  << re.where << ": " << re.what
     446                  << std::endl;
     447      }
     448      catch (...)
     449      {
     450        std::cerr << "error: rld::elf::file::~file: unhandled exception"
     451                  << std::endl;
     452      }
    439453    }
    440454
     
    448462    file::reference_release ()
    449463    {
    450       --refs;
     464      if (refs > 0)
     465        --refs;
    451466    }
    452467
     
    526541        throw rld::error ("File format in archive not ELF",
    527542                          "elf:file:begin: " + name__);
     543
     544      if (ek == ELF_K_AR)
     545        archive = true;
     546      else if (ek == ELF_K_ELF)
     547        archive = false;
    528548      else
    529       {
    530         if (ek == ELF_K_AR)
    531           archive = true;
    532         else if (ek == ELF_K_ELF)
    533           archive = false;
    534         else
    535           throw rld::error ("File format not ELF or archive",
    536                             "elf:file:begin: " + name__);
    537       }
     549        throw rld::error ("File format not ELF or archive",
     550                          "elf:file:begin: " + name__);
    538551
    539552      if (!writable_)
     
    546559        {
    547560          oclass = ::gelf_getclass (elf__);
    548           ident_str = elf_getident (elf__, &ident_size);
     561          ident_str = ::elf_getident (elf__, &ident_size);
    549562        }
    550563      }
     
    567580      if (refs > 0)
    568581        throw rld::error ("References still held", "elf:file:end: " + name_);
    569 
    570       if (elf_)
    571       {
    572         if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
    573           std::cout << "libelf::end: " << elf_
    574                     << ' ' << name_ << std::endl;
    575         ::elf_end (elf_);
    576         elf_ = 0;
    577       }
    578582
    579583      if (fd_ >= 0)
     
    596600        name_.clear ();
    597601        archive = false;
    598         elf_ = 0;
    599602        oclass = 0;
    600603        ident_str = 0;
    601604        ident_size = 0;
    602605        writable = false;
     606
    603607        secs.clear ();
     608
     609        if (elf_)
     610        {
     611          if (rld::verbose () >= RLD_VERBOSE_FULL_DEBUG)
     612            std::cout << "libelf::end: " << elf_
     613                      << ' ' << name_ << std::endl;
     614          ::elf_end (elf_);
     615          elf_ = 0;
     616        }
    604617      }
    605618    }
  • rtemstoolkit/rld-files.cpp

    rf7d303f rb73f905  
    257257    {
    258258      if (references_)
    259         std::cerr << "rtl:file:image: references when destructing";
     259        std::cerr << "rtl:file:image: references when destructing" << std::endl;
     260
    260261      if (fd_ >= 0)
    261262      {
    262263        ::close (fd_);
     264        fd_= -1;
    263265        if (writable && remove)
    264266        {
     
    268270          ::unlink (name_.path ().c_str ());
    269271        }
     272      }
     273
     274      try
     275      {
     276        elf_.end ();
     277      }
     278      catch (rld::error re)
     279      {
     280        std::cerr << "error: rld::files::image:::~image: "
     281                  << re.where << ": " << re.what
     282                  << std::endl;
     283      }
     284      catch (...)
     285      {
     286        std::cerr << "error: rld::files::image:::~image: unhandled exception"
     287                  << std::endl;
    270288      }
    271289    }
     
    538556    archive::~archive ()
    539557    {
    540       end ();
    541       close ();
     558      try
     559      {
     560        end ();
     561        close ();
     562      }
     563      catch (rld::error re)
     564      {
     565        std::cerr << "error: rld::files::archive::~archive: "
     566                  << re.where << ": " << re.what
     567                  << std::endl;
     568      }
     569      catch (...)
     570      {
     571        std::cerr << "error: rld::files::archive::~archive: unhandled exception"
     572                  << std::endl;
     573      }
    542574    }
    543575
     
    961993    object::~object ()
    962994    {
    963       end ();
    964       close ();
     995      try
     996      {
     997        end ();
     998        close ();
     999      }
     1000      catch (rld::error re)
     1001      {
     1002        std::cerr << "error: rld::files::object::~object: "
     1003                  << re.where << ": " << re.what
     1004                  << std::endl;
     1005      }
     1006      catch (...)
     1007      {
     1008        std::cerr << "error: rld::files::object::~object: unhandled exception"
     1009                  << std::endl;
     1010      }
    9651011    }
    9661012
     
    13191365    cache::~cache ()
    13201366    {
    1321       close ();
     1367      try
     1368      {
     1369        close ();
     1370      }
     1371      catch (rld::error re)
     1372      {
     1373        std::cerr << "error: rld::files:cache::~cache: "
     1374                  << re.where << ": " << re.what
     1375                  << std::endl;
     1376      }
     1377      catch (...)
     1378      {
     1379        std::cerr << "error: rld::files::cache::~cache: unhandled exception"
     1380                  << std::endl;
     1381      }
    13221382    }
    13231383
Note: See TracChangeset for help on using the changeset viewer.