Skip to content

Commit 0de19d9

Browse files
committed
Better error handling and size limits for visualization file loading, re:#385 re:#376
1 parent 9408f73 commit 0de19d9

File tree

4 files changed

+51
-11
lines changed

4 files changed

+51
-11
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
Folding@home Client Changelog
22
=============================
33

4+
## v8.5.1
5+
- Better error handling and size limits for vis file loading. #385 #376
6+
47
## v8.5
58
- Small improvements to Windows shutdown handling.
69
- Added option and core parameters for HIP.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "fah-client",
3-
"version": "8.5.0",
3+
"version": "8.5.1",
44
"bin": {"fah-client": "./fah-client"},
55
"author": "Joseph Coffland <[email protected]>",
66
"homepage": "https://foldingathome.org/",

src/fah/client/Unit.cpp

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ using namespace std;
7474

7575

7676
namespace {
77+
static const uint64_t maxViewerBytes = 1e8;
78+
79+
7780
string idFromSig(const string &sig) {
7881
if (sig.empty()) return "";
7982
return Digest::urlBase64(sig, "sha256");
@@ -677,43 +680,75 @@ void Unit::readInfo() {
677680

678681

679682
void Unit::readViewerData() {
680-
if (getState() < UNIT_CORE) return;
681-
if (topology.isNull()) readViewerTop();
682-
if (readViewerFrame()) triggerNext();
683+
if (viewerFail < 0 || getState() < UNIT_CORE) return;
684+
685+
try {
686+
if (topology.isNull()) readViewerTop();
687+
return readViewerFrame();
688+
} CATCH_WARNING;
689+
690+
if (5 < ++viewerFail) {
691+
if (topology.isNull()) {
692+
LOG_WARNING("Giving up on reading visualization");
693+
viewerFail = -1;
694+
695+
} else {
696+
LOG_WARNING("Giving up on reading visualization frame " << viewerFrame++);
697+
viewerFail = 0;
698+
}
699+
}
683700
}
684701

685702

686703
void Unit::readViewerTop() {
687704
string filename = getDirectory() + "/viewerTop.json";
688705

689706
if (existsAndOlderThan(filename, 10)) {
690-
topology = JSON::Reader::parseFile(filename);
691707
frames.clear();
708+
viewerBytes = SystemUtilities::getFileSize(filename);
709+
710+
if (maxViewerBytes < viewerBytes) {
711+
LOG_WARNING("Visualization topology too large, disabling visualization");
712+
viewerFail = -1;
713+
return;
714+
}
715+
716+
topology = JSON::Reader::parseFile(filename);
717+
viewerFail = 0;
692718
}
693719
}
694720

695721

696-
bool Unit::readViewerFrame() {
722+
void Unit::readViewerFrame() {
697723
string filename =
698724
getDirectory() + String::printf("/viewerFrame%d.json", viewerFrame);
699725

700726
if (existsAndOlderThan(filename, 10)) {
727+
uint64_t bytes = SystemUtilities::getFileSize(filename);
728+
729+
if (maxViewerBytes < viewerBytes + bytes) {
730+
LOG_WARNING("Visualization size exceeded at frame " << viewerFrame
731+
<< ", no more frames will be loaded");
732+
viewerFail = -1;
733+
return;
734+
}
735+
701736
auto frame = JSON::Reader::parseFile(filename);
702737

703738
if (!frames.empty() && *frames.back() == *frame)
704739
LOG_WARNING("Visualization frame " << viewerFrame
705-
<< " unchanged, skipping");
740+
<< " unchanged, skipping");
706741

707742
else if (!frame->empty()) {
708743
frames.push_back(frame);
709744
insert("frames", (uint32_t)frames.size());
745+
viewerBytes += bytes;
710746
}
711747

712748
viewerFrame++;
713-
return true;
749+
viewerFail = 0;
750+
triggerNext(); // Try to load another frame
714751
}
715-
716-
return false;
717752
}
718753

719754

src/fah/client/Unit.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ namespace FAH {
6868
cb::SmartPointer<Core> core;
6969

7070
unsigned viewerFrame = 0;
71+
int viewerFail = 0;
72+
uint64_t viewerBytes = 0;
7173

7274
cb::SmartPointer<CoreProcess> process;
7375
cb::SmartPointer<cb::TailFileToLog> logCopier;
@@ -163,7 +165,7 @@ namespace FAH {
163165
void readInfo();
164166
void readViewerData();
165167
void readViewerTop();
166-
bool readViewerFrame();
168+
void readViewerFrame();
167169
void setResults(const std::string &status, const std::string &dataHash);
168170
void finalizeRun();
169171
void stopRun();

0 commit comments

Comments
 (0)