| Index: third_party/mojo/src/mojo/public/go/bindings/message.go
|
| diff --git a/third_party/mojo/src/mojo/public/go/bindings/message.go b/third_party/mojo/src/mojo/public/go/bindings/message.go
|
| index 8455cd4b1e1323c4a11fc7a9120de09dfde2337d..f2dce2a59e370416f13970717eaddbd4028c21e7 100644
|
| --- a/third_party/mojo/src/mojo/public/go/bindings/message.go
|
| +++ b/third_party/mojo/src/mojo/public/go/bindings/message.go
|
| @@ -31,6 +31,31 @@ func init() {
|
| mapHeader = DataHeader{24, 2}
|
| }
|
|
|
| +const (
|
| + DifferentSizedArraysInMap = "VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP"
|
| + IllegalHandle = "VALIDATION_ERROR_ILLEGAL_HANDLE"
|
| + IllegalMemoryRange = "VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE"
|
| + IllegalPointer = "VALIDATION_ERROR_ILLEGAL_POINTER"
|
| + MessageHeaderInvalidFlags = "VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS"
|
| + MessageHeaderMissingRequestId = "VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID"
|
| + MessageHeaderUnknownMethod = "VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD"
|
| + MisalignedObject = "VALIDATION_ERROR_MISALIGNED_OBJECT"
|
| + UnexpectedArrayHeader = "VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER"
|
| + UnexpectedInvalidHandle = "VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE"
|
| + UnexpectedNullPointer = "VALIDATION_ERROR_UNEXPECTED_NULL_POINTER"
|
| + UnexpectedStructHeader = "VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER"
|
| +)
|
| +
|
| +// ValidationError is an error that can happen during message validation.
|
| +type ValidationError struct {
|
| + ErrorCode string
|
| + Message string
|
| +}
|
| +
|
| +func (e *ValidationError) Error() string {
|
| + return e.Message
|
| +}
|
| +
|
| // Payload is an interface implemented by a mojo struct that can encode/decode
|
| // itself into mojo archive format.
|
| type Payload interface {
|
| @@ -74,8 +99,20 @@ func (h *MessageHeader) Decode(decoder *Decoder) error {
|
| }
|
| numFields := header.ElementsOrVersion
|
| if numFields < 2 || numFields > 3 {
|
| - return fmt.Errorf("Invalid message header: it should have 2 or 3 fileds, but has %d", numFields)
|
| + return &ValidationError{UnexpectedStructHeader,
|
| + fmt.Sprintf("invalid message header: it should have 2 or 3 fileds, but has %d", numFields),
|
| + }
|
| + }
|
| + expectedSize := uint32(dataHeaderSize + 2*4)
|
| + if numFields == 3 {
|
| + expectedSize += 8
|
| }
|
| + if expectedSize != header.Size {
|
| + return &ValidationError{UnexpectedStructHeader,
|
| + fmt.Sprintf("unexpected struct header size: expected %d, but got %d", expectedSize, header.Size),
|
| + }
|
| + }
|
| +
|
| if h.Type, err = decoder.ReadUint32(); err != nil {
|
| return err
|
| }
|
| @@ -84,14 +121,16 @@ func (h *MessageHeader) Decode(decoder *Decoder) error {
|
| }
|
| if numFields == 3 {
|
| if h.Flags != MessageExpectsResponseFlag && h.Flags != MessageIsResponseFlag {
|
| - return fmt.Errorf("Message header flags(%v) should be MessageExpectsResponseFlag or MessageIsResponseFlag", h.Flags)
|
| + return &ValidationError{MessageHeaderInvalidFlags,
|
| + fmt.Sprintf("message header flags(%v) should be MessageExpectsResponseFlag or MessageIsResponseFlag", h.Flags),
|
| + }
|
| }
|
| if h.RequestId, err = decoder.ReadUint64(); err != nil {
|
| return err
|
| }
|
| } else {
|
| if h.Flags != MessageNoFlag {
|
| - return fmt.Errorf("Message header flags(%v) should be MessageNoFlag", h.Flags)
|
| + return &ValidationError{MessageHeaderMissingRequestId, "missing request ID in message header"}
|
| }
|
| }
|
| return decoder.Finish()
|
|
|