[vm/vmservice] Validate getIsolate response before attempting to retrieve pauseEvent from it.

Bug: b/150193047
Change-Id: I6e8f8e27ef2a9894138b1d877597ad3a5f3f9e61
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137281
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Alexander Aprelev <aam@google.com>
This commit is contained in:
Alexander Aprelev 2020-02-25 23:19:44 +00:00 committed by commit-bot@chromium.org
parent 3bd8e36bea
commit 305399c15c
2 changed files with 44 additions and 12 deletions

View file

@ -34,7 +34,13 @@ class RunningIsolate implements MessageRouter {
// If we've received approval to resume from all clients who care, clear
// approval state and resume.
final pauseType = await _isolatePauseType(service, portId.toString());
var pauseType;
try {
pauseType = await _isolatePauseType(service, portId.toString());
} catch (_errorResponse) {
// ignore errors when attempting to retrieve isolate pause type
return;
}
if (pauseType != kInvalidPauseEvent &&
_shouldResume(service, null, pauseType)) {
_resumeApprovalsByName.clear();
@ -76,9 +82,15 @@ class RunningIsolate implements MessageRouter {
..params.addAll({
'isolateId': isolateId,
});
final result =
(await routeRequest(service, getIsolateMessage)).decodeJson();
final pauseEvent = result['result']['pauseEvent'];
final Response result = await routeRequest(service, getIsolateMessage);
final resultJson = result.decodeJson();
if (resultJson['result'] == null ||
resultJson['result']['pauseEvent'] == null) {
// Failed to send getIsolate message(due to isolate being de-registered
// for example).
throw result;
}
final pauseEvent = resultJson['result']['pauseEvent'];
const pauseEvents = <String, int>{
'PauseStart': kPauseOnStartMask,
'PausePostRequest': kPauseOnReloadMask,
@ -92,8 +104,12 @@ class RunningIsolate implements MessageRouter {
VMService service, Message message) async {
// If we've received approval to resume from all clients who care, clear
// approval state and resume.
final pauseType =
await _isolatePauseType(service, message.params['isolateId']);
var pauseType;
try {
pauseType = await _isolatePauseType(service, message.params['isolateId']);
} catch (errorResponse) {
return errorResponse;
}
if (pauseType == kInvalidPauseEvent ||
_shouldResume(service, message.client, pauseType)) {
_resumeApprovalsByName.clear();

View file

@ -32,7 +32,13 @@ class RunningIsolate implements MessageRouter {
// If we've received approval to resume from all clients who care, clear
// approval state and resume.
final pauseType = await _isolatePauseType(service, portId.toString());
var pauseType;
try {
pauseType = await _isolatePauseType(service, portId.toString());
} catch (_errorResponse) {
// ignore errors when attempting to retrieve isolate pause type
return;
}
if (pauseType != kInvalidPauseEvent &&
_shouldResume(service, null, pauseType)) {
_resumeApprovalsByName.clear();
@ -74,9 +80,15 @@ class RunningIsolate implements MessageRouter {
..params.addAll({
'isolateId': isolateId,
});
final result =
(await routeRequest(service, getIsolateMessage)).decodeJson();
final pauseEvent = result['result']['pauseEvent'];
final Response result = await routeRequest(service, getIsolateMessage);
final resultJson = result.decodeJson();
if (resultJson['result'] == null ||
resultJson['result']['pauseEvent'] == null) {
// Failed to send getIsolate message(due to isolate being de-registered
// for example).
throw result;
}
final pauseEvent = resultJson['result']['pauseEvent'];
const pauseEvents = <String, int>{
'PauseStart': kPauseOnStartMask,
'PausePostRequest': kPauseOnReloadMask,
@ -90,8 +102,12 @@ class RunningIsolate implements MessageRouter {
VMService service, Message message) async {
// If we've received approval to resume from all clients who care, clear
// approval state and resume.
final pauseType =
await _isolatePauseType(service, message.params['isolateId']);
var pauseType;
try {
pauseType = await _isolatePauseType(service, message.params['isolateId']);
} catch (errorResponse) {
return errorResponse;
}
if (pauseType == kInvalidPauseEvent ||
_shouldResume(service, message.client, pauseType)) {
_resumeApprovalsByName.clear();