util: fix ReadBinaryFile() returning partial contents

If an error occurs and `fread()` returns `0` (nothing was read) then the
code before this patch would have returned "success" with a partially
read contents of the file.
pull/826/head
Vasil Dimov 4 years ago
parent 4cba2fdafa
commit 8b6e4b3b23
No known key found for this signature in database
GPG Key ID: 54DF06F64B55CBBF

@ -17,8 +17,8 @@ std::pair<bool,std::string> ReadBinaryFile(const fs::path &filename, size_t maxs
return std::make_pair(false,""); return std::make_pair(false,"");
std::string retval; std::string retval;
char buffer[128]; char buffer[128];
size_t n; do {
while ((n=fread(buffer, 1, sizeof(buffer), f)) > 0) { const size_t n = fread(buffer, 1, sizeof(buffer), f);
// Check for reading errors so we don't return any data if we couldn't // Check for reading errors so we don't return any data if we couldn't
// read the entire file (or up to maxsize) // read the entire file (or up to maxsize)
if (ferror(f)) { if (ferror(f)) {
@ -26,9 +26,7 @@ std::pair<bool,std::string> ReadBinaryFile(const fs::path &filename, size_t maxs
return std::make_pair(false,""); return std::make_pair(false,"");
} }
retval.append(buffer, buffer+n); retval.append(buffer, buffer+n);
if (retval.size() > maxsize) } while (!feof(f) && retval.size() <= maxsize);
break;
}
fclose(f); fclose(f);
return std::make_pair(true,retval); return std::make_pair(true,retval);
} }

Loading…
Cancel
Save