Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add a hacky check for text file size in ReadFileToString. Fixes issue…
… 6455.
  • Loading branch information
delroth committed Sep 16, 2013
1 parent a7e1fb8 commit f0fc611
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 3 deletions.
28 changes: 27 additions & 1 deletion Source/Core/Common/Src/FileUtil.cpp
Expand Up @@ -885,8 +885,34 @@ bool ReadFileToString(bool text_file, const char *filename, std::string &str)
if (!f)
return false;

size_t read_size;
str.resize(GetSize(f));
return file.ReadArray(&str[0], str.size());
bool retval = file.ReadArray(&str[0], str.size(), &read_size);

// On Windows, reading a text file automatically translates \r\n to \n.
// This means we will read less characters than the expected size of the
// file. In that case, ignore the return value and count ourselves.
#ifdef _WIN32
if (text_file)
{
size_t count = 0;
for (size_t i = 0; i < read_size; ++i)
{
if (str[i] == '\n')
count += 2;
else
count += 1;
}

if (count != str.size())
return false;

str.resize(read_size);
return true;
}
#endif

return retval;
}

IOFile::IOFile()
Expand Down
8 changes: 6 additions & 2 deletions Source/Core/Common/Src/FileUtil.h
Expand Up @@ -161,11 +161,15 @@ class IOFile : public NonCopyable
bool Close();

template <typename T>
bool ReadArray(T* data, size_t length)
bool ReadArray(T* data, size_t length, size_t* pReadBytes = NULL)
{
if (!IsOpen() || length != std::fread(data, sizeof(T), length, m_file))
size_t read_bytes = 0;
if (!IsOpen() || length != (read_bytes = std::fread(data, sizeof(T), length, m_file)))
m_good = false;

if (pReadBytes)
*pReadBytes = read_bytes;

return m_good;
}

Expand Down

0 comments on commit f0fc611

Please sign in to comment.