Skip to content

Commit 066ebee

Browse files
Avoid prepareToParse crash
I stumbled upon a case where perpareToParse return an error message on 'buildid', but then on a subsequent call for 'mmap events' it crashed with: > Assertion `!HasError && "Cannot get value when an error exists!"' failed. This was due to an Error while reading the error message (ErrorMB).
1 parent bfd0874 commit 066ebee

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

bolt/lib/Profile/DataAggregator.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,8 @@ void DataAggregator::processFileBuildID(StringRef FileBuildID) {
295295

296296
PerfProcessInfo BuildIDProcessInfo;
297297
launchPerfProcess("buildid list", BuildIDProcessInfo, "buildid-list");
298-
int ErrCode = prepareToParse("buildid", BuildIDProcessInfo, WarningCallback);
299-
if (ErrCode != 0) {
300-
exit(ErrCode);
301-
}
298+
if (prepareToParse("buildid", BuildIDProcessInfo, WarningCallback))
299+
return;
302300

303301
std::optional<StringRef> FileName = getFileNameForBuildID(FileBuildID);
304302
if (FileName && *FileName == sys::path::filename(BC->getFilename())) {
@@ -434,7 +432,18 @@ int DataAggregator::prepareToParse(StringRef Name, PerfProcessInfo &Process,
434432
if (PI.ReturnCode != 0) {
435433
ErrorOr<std::unique_ptr<MemoryBuffer>> ErrorMB =
436434
MemoryBuffer::getFileOrSTDIN(Process.StderrPath.data());
437-
StringRef ErrBuf = (*ErrorMB)->getBuffer();
435+
std::string ErrMsg;
436+
StringRef ErrBuf;
437+
if (std::error_code EC = ErrorMB.getError()) {
438+
ErrMsg = "PERF2BOLT: cannot open ";
439+
ErrMsg += Process.StderrPath.data();
440+
ErrMsg += ": ";
441+
ErrMsg += EC.message();
442+
ErrMsg += '\n';
443+
ErrBuf = ErrMsg;
444+
} else {
445+
ErrBuf = (*ErrorMB)->getBuffer();
446+
}
438447

439448
deleteTempFiles();
440449
Callback(PI.ReturnCode, ErrBuf);

0 commit comments

Comments
 (0)