diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2023-01-17 20:56:21 +0200 | 
|---|---|---|
| committer | akleshchev <117672381+akleshchev@users.noreply.github.com> | 2023-01-18 19:20:36 +0200 | 
| commit | 1c0d47843664e0766e04f60674cb66aab4197f0f (patch) | |
| tree | 92cd8ecf1ad80dd10412bf77626f4261d1605f43 | |
| parent | 752075d6d4b55f329ef21c4b0b78636f8faaa34d (diff) | |
SL-18773 Crash incrementing directory_iterator
make_iterator_range doesn't verify errors, replaced with basic increments
| -rw-r--r-- | indra/llfilesystem/lldiskcache.cpp | 51 | 
1 files changed, 29 insertions, 22 deletions
| diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp index 6de99dfbff..4b7363c8e5 100644 --- a/indra/llfilesystem/lldiskcache.cpp +++ b/indra/llfilesystem/lldiskcache.cpp @@ -35,7 +35,6 @@  #include "llassettype.h"  #include "lldir.h"  #include <boost/filesystem.hpp> -#include <boost/range/iterator_range.hpp>  #include <chrono>  #include "lldiskcache.h" @@ -100,19 +99,20 @@ void LLDiskCache::purge()  #endif      if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())      { -        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {})) +        boost::filesystem::directory_iterator iter(cache_path, ec); +        while (iter != boost::filesystem::directory_iterator() && !ec.failed())          { -            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) +            if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())              { -                if (entry.path().string().find(mCacheFilenamePrefix) != std::string::npos) +                if ((*iter).path().string().find(mCacheFilenamePrefix) != std::string::npos)                  { -                    uintmax_t file_size = boost::filesystem::file_size(entry, ec); +                    uintmax_t file_size = boost::filesystem::file_size(*iter, ec);                      if (ec.failed())                      {                          continue;                      } -                    const std::string file_path = entry.path().string(); -                    const std::time_t file_time = boost::filesystem::last_write_time(entry, ec); +                    const std::string file_path = (*iter).path().string(); +                    const std::time_t file_time = boost::filesystem::last_write_time(*iter, ec);                      if (ec.failed())                      {                          continue; @@ -121,6 +121,7 @@ void LLDiskCache::purge()                      file_info.push_back(file_info_t(file_time, { file_size, file_path }));                  }              } +            iter.increment(ec);          }      } @@ -348,19 +349,21 @@ void LLDiskCache::clearCache()  #endif      if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())      { -        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {})) +        boost::filesystem::directory_iterator iter(cache_path, ec); +        while (iter != boost::filesystem::directory_iterator() && !ec.failed())          { -            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) +            if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())              { -                if (entry.path().string().find(mCacheFilenamePrefix) != std::string::npos) +                if ((*iter).path().string().find(mCacheFilenamePrefix) != std::string::npos)                  { -                    boost::filesystem::remove(entry, ec); +                    boost::filesystem::remove(*iter, ec);                      if (ec.failed())                      { -                        LL_WARNS() << "Failed to delete cache file " << entry << ": " << ec.message() << LL_ENDL; +                        LL_WARNS() << "Failed to delete cache file " << *iter << ": " << ec.message() << LL_ENDL;                      }                  }              } +            iter.increment(ec);          }      }  } @@ -379,20 +382,22 @@ void LLDiskCache::removeOldVFSFiles()  #endif      if (boost::filesystem::is_directory(cache_path, ec) && !ec.failed())      { -        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(cache_path, ec), {})) +        boost::filesystem::directory_iterator iter(cache_path, ec); +        while (iter != boost::filesystem::directory_iterator() && !ec.failed())          { -            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) +            if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())              { -                if ((entry.path().string().find(CACHE_FORMAT) != std::string::npos) || -                    (entry.path().string().find(DB_FORMAT) != std::string::npos)) +                if (((*iter).path().string().find(CACHE_FORMAT) != std::string::npos) || +                    ((*iter).path().string().find(DB_FORMAT) != std::string::npos))                  { -                    boost::filesystem::remove(entry, ec); +                    boost::filesystem::remove(*iter, ec);                      if (ec.failed())                      { -                        LL_WARNS() << "Failed to delete cache file " << entry << ": " << ec.message() << LL_ENDL; +                        LL_WARNS() << "Failed to delete cache file " << *iter << ": " << ec.message() << LL_ENDL;                      }                  }              } +            iter.increment(ec);          }      }  } @@ -418,19 +423,21 @@ uintmax_t LLDiskCache::dirFileSize(const std::string dir)  #endif      if (boost::filesystem::is_directory(dir_path, ec) && !ec.failed())      { -        for (auto& entry : boost::make_iterator_range(boost::filesystem::directory_iterator(dir_path, ec), {})) +        boost::filesystem::directory_iterator iter(dir_path, ec); +        while (iter != boost::filesystem::directory_iterator() && !ec.failed())          { -            if (boost::filesystem::is_regular_file(entry, ec) && !ec.failed()) +            if (boost::filesystem::is_regular_file(*iter, ec) && !ec.failed())              { -                if (entry.path().string().find(mCacheFilenamePrefix) != std::string::npos) +                if ((*iter).path().string().find(mCacheFilenamePrefix) != std::string::npos)                  { -                    uintmax_t file_size = boost::filesystem::file_size(entry, ec); +                    uintmax_t file_size = boost::filesystem::file_size(*iter, ec);                      if (!ec.failed())                      {                          total_file_size += file_size;                      }                  }              } +            iter.increment(ec);          }      } | 
