Index: third_party/mojo/src/mojo/public/dart/src/message.dart |
diff --git a/third_party/mojo/src/mojo/public/dart/src/message.dart b/third_party/mojo/src/mojo/public/dart/src/message.dart |
index 2cdda8adb1f8ee29011baf173192d66bc309f593..918d2190ed046c1cf72e4cfcfb605a4ab7196269 100644 |
--- a/third_party/mojo/src/mojo/public/dart/src/message.dart |
+++ b/third_party/mojo/src/mojo/public/dart/src/message.dart |
@@ -35,12 +35,18 @@ class MessageHeader { |
MessageHeader.fromMessage(Message message) { |
var decoder = new Decoder(message); |
_header = decoder.decodeDataHeader(); |
+ if (_header.size < kSimpleMessageSize) { |
+ throw new MojoCodecError( |
+ 'Incorrect message size. Got: ${_header.size} ' |
+ 'wanted $kSimpleMessageSize'); |
+ } |
type = decoder.decodeUint32(kMessageTypeOffset); |
flags = decoder.decodeUint32(kMessageFlagsOffset); |
if (mustHaveRequestId(flags)) { |
if (_header.size < kMessageWithRequestIdSize) { |
- throw 'Incorrect message size. Got: ${_header.size} ' + |
- 'wanted $kMessageWithRequestIdSize'; |
+ throw new MojoCodecError( |
+ 'Incorrect message size. Got: ${_header.size} ' |
+ 'wanted $kMessageWithRequestIdSize'); |
} |
requestId = decoder.decodeUint64(kMessageRequestIdOffset); |
} else { |
@@ -63,6 +69,35 @@ class MessageHeader { |
ServiceMessage get serviceMessage => new ServiceMessage(this); |
String toString() => "MessageHeader($_header, $type, $flags, $requestId)"; |
+ |
+ bool validateHeaderFlags(expectedFlags) => |
+ (flags & (kMessageExpectsResponse | kMessageIsResponse)) == expectedFlags; |
+ |
+ bool validateHeader(int expectedType, int expectedFlags) => |
+ (type == expectedType) && validateHeaderFlags(expectedFlags); |
+ |
+ static void _validateDataHeader(DataHeader dataHeader) { |
+ if (dataHeader.numFields < kSimpleMessageNumFields) { |
+ throw 'Incorrect number of fields, expecting at least ' |
+ '$kSimpleMessageNumFields, but got: ${dataHeader.numFields}.'; |
+ } |
+ if (dataHeader.size < kSimpleMessageSize) { |
+ throw 'Incorrect message size, expecting at least $kSimpleMessageSize, ' |
+ 'but got: ${dataHeader.size}'; |
+ } |
+ if ((dataHeader.numFields == kSimpleMessageSize) && |
+ (dataHeader.size != kSimpleMessageSize)) { |
+ throw 'Incorrect message size for a message with $kSimpleMessageNumFields' |
+ ' fields, expecting $kSimpleMessageSize, ' |
+ 'but got ${dataHeader.size}'; |
+ } |
+ if ((dataHeader.numFields == kMessageWithRequestIdNumFields) && |
+ (dataHeader.size != kMessageWithRequestIdSize)) { |
+ throw 'Incorrect message size for a message with ' |
+ '$kMessageWithRequestIdNumFields fields, expecting ' |
+ '$kMessageWithRequestIdSize, but got ${dataHeader.size}'; |
+ } |
+ } |
} |