I noticed that the OIIO Filesystem class is catching the wrong type of
exception when it calls boost::filesystem functions.  These functions
return an exception of type:
   boost::filesystem::filesystem_error
and OIIO is instead trying to catch the unrelated:
   std::exception

Since filesystem_error does not inherit from std::exception, that means
that any thrown exceptions are missed and can end up crashing the
application.

You can reproduce this easily with the following code provided you first
run the following command in a terminal so we can have a file that is not
accessible due to permission reasons:
   $ mkdir /tmp/deny; chmod a-rwx /tmp/deny


      try {
         printf("testing Filesystem::exists: %d\n",
Filesystem::exists("/tmp/deny/etx"));
      } catch(const boost::filesystem::filesystem_error e) {
         std::cout<< "oiio not catching proper exception:  "<<e.what() <<
std::endl;
      }
      try {
         printf("testing Filesystem::is_directory: %d\n",
Filesystem::is_directory("/tmp/deny/etx"));
      } catch(const boost::filesystem::filesystem_error e) {
         std::cout<< "oiio not catching proper exception:  "<<e.what() <<
std::endl;
      }
      try {
         printf("testing Filesystem::is_regular: %d\n",
Filesystem::is_regular("/tmp/deny/etx"));
      } catch(const boost::filesystem::filesystem_error e) {
         std::cout<< "oiio not catching proper exception:  "<<e.what() <<
std::endl;
      }
      try {
         std::cout <<"testing Filesystem::last_write_time: "<<
Filesystem::last_write_time("/tmp/deny/etx") <<std::endl;
      } catch(const boost::filesystem::filesystem_error e) {
         std::cout<< "oiio not catching proper exception:  "<<e.what() <<
std::endl;
      }

Here's the output using OIIO 1.4 which shows that the exceptions were not
caught by OIIO and instead were caught by our test code:

testing Filesystem::exists: oiio not catching proper exception:
boost::filesystem::status: Permission denied: "/tmp/deny/etx"
testing Filesystem::is_directory: oiio not catching proper exception:
boost::filesystem::status: Permission denied: "/tmp/deny/etx"
testing Filesystem::is_regular: oiio not catching proper exception:
boost::filesystem::status: Permission denied: "/tmp/deny/etx"
testing Filesystem::last_write_time: oiio not catching proper exception:
boost::filesystem::last_write_time: Permission denied: "/tmp/deny/etx"

The fix is a pretty simple search and replace in filesystem.cpp, so I
didn't bother to include a patch.  If a patch is wanted, let me know!

I didn't check the rest of OIIO, but it might be worth doing some quick
investigations to see if this problem exists elsewhere.
_______________________________________________
Oiio-dev mailing list
[email protected]
http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org

Reply via email to