mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-02-25 17:21:27 -05:00
fixed possible uninitialised memory read in folderiterator for windows, and changed file folderiterator.cc to unix format
This commit is contained in:
parent
fb302002d6
commit
d433713bd0
@ -19,6 +19,13 @@ namespace librs { namespace util {
|
||||
FolderIterator::FolderIterator(const std::string& folderName)
|
||||
: mFolderName(folderName)
|
||||
{
|
||||
is_open = false ;
|
||||
validity = false ;
|
||||
mFileModTime = 0;
|
||||
mFolderModTime = 0;
|
||||
mFileSize = 0;
|
||||
mType = TYPE_UNKNOWN;
|
||||
|
||||
// Grab the last modification time for the directory
|
||||
|
||||
struct stat64 buf ;
|
||||
@ -45,9 +52,20 @@ FolderIterator::FolderIterator(const std::string& folderName)
|
||||
|
||||
utf16Name += L"/*.*";
|
||||
|
||||
// FindFirstFileW does the "next" operation, so after calling it, we need to read the information
|
||||
// for the current entry.
|
||||
|
||||
handle = FindFirstFileW(utf16Name.c_str(), &fileInfo);
|
||||
is_open = validity = handle != INVALID_HANDLE_VALUE;
|
||||
|
||||
bool should_skip ;
|
||||
validity = validity && updateFileInfo(should_skip);
|
||||
|
||||
if(validity && should_skip)
|
||||
next();
|
||||
#else
|
||||
// On linux, we need to call "next()" once the dir is openned. next() will call updateFileInfo() itself.
|
||||
|
||||
handle = opendir(folderName.c_str());
|
||||
is_open = validity = handle != NULL;
|
||||
next();
|
||||
@ -61,72 +79,13 @@ FolderIterator::~FolderIterator()
|
||||
|
||||
void FolderIterator::next()
|
||||
{
|
||||
bool should_skip = false ;
|
||||
|
||||
while(readdir())
|
||||
{
|
||||
#ifdef WINDOWS_SYS
|
||||
ConvertUtf16ToUtf8(fileInfo.cFileName, mFileName) ;
|
||||
#else
|
||||
mFileName = ent->d_name ;
|
||||
#endif
|
||||
if(updateFileInfo(should_skip) && !should_skip)
|
||||
return ;
|
||||
|
||||
if(mFileName == "." || mFileName == "..")
|
||||
continue ;
|
||||
|
||||
mFullPath = mFolderName + "/" + mFileName ;
|
||||
|
||||
struct stat64 buf ;
|
||||
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
std::cerr << "FolderIterator: next. Looking into file " << mFileName ;
|
||||
#endif
|
||||
|
||||
#ifdef WINDOWS_SYS
|
||||
std::wstring wfullname;
|
||||
librs::util::ConvertUtf8ToUtf16(mFullPath, wfullname);
|
||||
if ( 0 == _wstati64(wfullname.c_str(), &buf))
|
||||
#else
|
||||
if ( 0 == stat64(mFullPath.c_str(), &buf))
|
||||
#endif
|
||||
{
|
||||
mFileModTime = buf.st_mtime ;
|
||||
mStatInfoOk = true;
|
||||
|
||||
if (S_ISDIR(buf.st_mode))
|
||||
{
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
std::cerr << ": is a directory" << std::endl;
|
||||
#endif
|
||||
|
||||
mType = TYPE_DIR ;
|
||||
mFileSize = 0 ;
|
||||
mFileModTime = buf.st_mtime;
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
if (S_ISREG(buf.st_mode))
|
||||
{
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
std::cerr << ": is a file" << std::endl;
|
||||
#endif
|
||||
|
||||
mType = TYPE_FILE ;
|
||||
mFileSize = buf.st_size;
|
||||
mFileModTime = buf.st_mtime;
|
||||
|
||||
return ;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
std::cerr << ": is unknown skipping" << std::endl;
|
||||
#endif
|
||||
|
||||
mType = TYPE_UNKNOWN ;
|
||||
mFileSize = 0 ;
|
||||
mFileModTime = 0;
|
||||
}
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
std::cerr << "End of directory." << std::endl;
|
||||
#endif
|
||||
|
||||
@ -136,6 +95,77 @@ void FolderIterator::next()
|
||||
validity = false ;
|
||||
}
|
||||
|
||||
bool FolderIterator::updateFileInfo(bool& should_skip)
|
||||
{
|
||||
should_skip = false;
|
||||
#ifdef WINDOWS_SYS
|
||||
ConvertUtf16ToUtf8(fileInfo.cFileName, mFileName) ;
|
||||
#else
|
||||
mFileName = ent->d_name ;
|
||||
#endif
|
||||
|
||||
if(mFileName == "." || mFileName == "..")
|
||||
{
|
||||
should_skip = true ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
mFullPath = mFolderName + "/" + mFileName ;
|
||||
|
||||
struct stat64 buf ;
|
||||
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
std::cerr << "FolderIterator: next. Looking into file " << mFileName ;
|
||||
#endif
|
||||
|
||||
#ifdef WINDOWS_SYS
|
||||
std::wstring wfullname;
|
||||
librs::util::ConvertUtf8ToUtf16(mFullPath, wfullname);
|
||||
if ( 0 == _wstati64(wfullname.c_str(), &buf))
|
||||
#else
|
||||
if ( 0 == stat64(mFullPath.c_str(), &buf))
|
||||
#endif
|
||||
{
|
||||
mFileModTime = buf.st_mtime ;
|
||||
|
||||
if (S_ISDIR(buf.st_mode))
|
||||
{
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
std::cerr << ": is a directory" << std::endl;
|
||||
#endif
|
||||
|
||||
mType = TYPE_DIR ;
|
||||
mFileSize = 0 ;
|
||||
mFileModTime = buf.st_mtime;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (S_ISREG(buf.st_mode))
|
||||
{
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
std::cerr << ": is a file" << std::endl;
|
||||
#endif
|
||||
|
||||
mType = TYPE_FILE ;
|
||||
mFileSize = buf.st_size;
|
||||
mFileModTime = buf.st_mtime;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_FOLDER_ITERATOR
|
||||
std::cerr << ": is unknown skipping" << std::endl;
|
||||
#endif
|
||||
|
||||
mType = TYPE_UNKNOWN ;
|
||||
mFileSize = 0 ;
|
||||
mFileModTime = 0;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FolderIterator::readdir()
|
||||
{
|
||||
if(!validity)
|
||||
|
@ -59,9 +59,8 @@ private:
|
||||
DIR* handle;
|
||||
struct dirent* ent;
|
||||
#endif
|
||||
void updateStatsInfo() ;
|
||||
bool updateFileInfo(bool &should_skip) ;
|
||||
|
||||
bool mStatInfoOk ;
|
||||
time_t mFileModTime ;
|
||||
time_t mFolderModTime ;
|
||||
uint64_t mFileSize ;
|
||||
|
Loading…
x
Reference in New Issue
Block a user