[fidl][go] Validate usages of envelope inlining

This CL adds validation that envelope inlining is used correctly to the
decoder. That is, it checks that inlining is only used when the inline
size <= 4 (and version is v2).

Bug: 81180
Bug: 80348
Change-Id: Ic7d9a04e1bc137e0ab307dd7dcd36a86a1f6ad1b
Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/go/+/558221
Reviewed-by: Mitchell Kember <mkember@google.com>
Commit-Queue: Benjamin Prosnitz <bprosnitz@google.com>
diff --git a/api/fuchsia.txt b/api/fuchsia.txt
index 8a70097..85c8941 100644
--- a/api/fuchsia.txt
+++ b/api/fuchsia.txt
@@ -1025,6 +1025,8 @@
 pkg syscall/zx/fidl, const ErrInvalidEmptyStruct ErrorCode
 pkg syscall/zx/fidl, const ErrInvalidEnumValue = 20
 pkg syscall/zx/fidl, const ErrInvalidEnumValue ErrorCode
+pkg syscall/zx/fidl, const ErrInvalidInlineBitValueInEnvelope = 38
+pkg syscall/zx/fidl, const ErrInvalidInlineBitValueInEnvelope ErrorCode
 pkg syscall/zx/fidl, const ErrInvalidInlineType = 2
 pkg syscall/zx/fidl, const ErrInvalidInlineType ErrorCode
 pkg syscall/zx/fidl, const ErrInvalidNumBytesInEnvelope = 23
diff --git a/src/syscall/zx/fidl/encoding_new.go b/src/syscall/zx/fidl/encoding_new.go
index 3834b89..9b93c9c 100644
--- a/src/syscall/zx/fidl/encoding_new.go
+++ b/src/syscall/zx/fidl/encoding_new.go
@@ -1460,6 +1460,11 @@
 		return false, err
 	}
 
+	shouldBeInlined := ctx.UseV2WireFormat && m.getUnmarshalSize(ctx) <= 4
+	if header.isInline != shouldBeInlined {
+		return false, newExpectError(ErrInvalidInlineBitValueInEnvelope, header.isInline, shouldBeInlined)
+	}
+
 	if !header.isPresent(ctx) {
 		if mode == knownMustBePresent {
 			return false, newValueError(ErrUnexpectedNullRef, v)
diff --git a/src/syscall/zx/fidl/errors.go b/src/syscall/zx/fidl/errors.go
index 9050d8d..f833fad 100644
--- a/src/syscall/zx/fidl/errors.go
+++ b/src/syscall/zx/fidl/errors.go
@@ -68,47 +68,49 @@
 	ErrUnspecifiedHandleType
 	ErrValueTypeHandles
 	ErrExceededMaxOutOfLineDepth
+	ErrInvalidInlineBitValueInEnvelope
 )
 
 var errorCodeNames = []string{
-	Invalid:                        "Invalid",
-	ErrUnknownOrdinal:              "ErrUnknownOrdinal",
-	ErrInvalidInlineType:           "ErrInvalidInlineType",
-	ErrInvalidPointerType:          "ErrInvalidPointerType",
-	ErrVectorTooLong:               "ErrVectorTooLong",
-	ErrStringTooLong:               "ErrStringTooLong",
-	ErrUnexpectedOrdinal:           "ErrUnexpectedOrdinal",
-	ErrUnexpectedNullHandle:        "ErrUnexpectedNullHandle",
-	ErrUnexpectedNullRef:           "ErrUnexpectedNullRef",
-	ErrInvalidBoolValue:            "ErrInvalidBoolValue",
-	ErrNotEnoughHandles:            "ErrNotEnoughHandles",
-	ErrTooManyHandles:              "ErrTooManyHandles",
-	ErrNonZeroPadding:              "ErrNonZeroPadding",
-	ErrBadHandleEncoding:           "ErrBadHandleEncoding",
-	ErrBadRefEncoding:              "ErrBadRefEncoding",
-	ErrBadInlineIndicatorEncoding:  "ErrBadInlineIndicatorEncoding",
-	ErrStructIsNotPayload:          "ErrStructIsNotPayload",
-	ErrInvalidUnionTag:             "ErrInvalidUnionTag",
-	ErrInvalidXUnionTag:            "ErrInvalidXUnionTag",
-	ErrInvalidBitsValue:            "ErrInvalidBitsValue",
-	ErrInvalidEnumValue:            "ErrInvalidEnumValue",
-	ErrPayloadTooSmall:             "ErrPayloadTooSmall",
-	ErrInvalidEmptyStruct:          "ErrInvalidEmptyStruct",
-	ErrInvalidNumBytesInEnvelope:   "ErrInvalidNumBytesInEnvelope",
-	ErrInvalidNumHandlesInEnvelope: "ErrInvalidNumHandlesInEnvelope",
-	ErrStringNotUTF8:               "ErrStringNotUTF8",
-	ErrUnknownMagic:                "ErrUnknownMagic",
-	ErrMissingRequiredHandleRights: "ErrMissingRequiredHandleRights",
-	ErrUnableToReduceHandleRights:  "ErrUnableToReduceHandleRights",
-	ErrUnspecifiedHandleRights:     "ErrUnspecifiedHandleRights",
-	ErrMissingMarshalerContext:     "ErrMissingMarshalerContext",
-	ErrResponseWithoutRequest:      "ErrResponseWithoutRequest",
-	ErrDuplicateTxidReceived:       "ErrDuplicateTxidReceived",
-	ErrDuplicateTxidWaiting:        "ErrDuplicateTxidWaiting",
-	ErrIncorrectHandleType:         "ErrIncorrectHandleType",
-	ErrUnspecifiedHandleType:       "ErrUnspecifiedHandleType",
-	ErrValueTypeHandles:            "ErrValueTypeHandles",
-	ErrExceededMaxOutOfLineDepth:   "ErrExceededMaxOutOfLineDepth",
+	Invalid:                            "Invalid",
+	ErrUnknownOrdinal:                  "ErrUnknownOrdinal",
+	ErrInvalidInlineType:               "ErrInvalidInlineType",
+	ErrInvalidPointerType:              "ErrInvalidPointerType",
+	ErrVectorTooLong:                   "ErrVectorTooLong",
+	ErrStringTooLong:                   "ErrStringTooLong",
+	ErrUnexpectedOrdinal:               "ErrUnexpectedOrdinal",
+	ErrUnexpectedNullHandle:            "ErrUnexpectedNullHandle",
+	ErrUnexpectedNullRef:               "ErrUnexpectedNullRef",
+	ErrInvalidBoolValue:                "ErrInvalidBoolValue",
+	ErrNotEnoughHandles:                "ErrNotEnoughHandles",
+	ErrTooManyHandles:                  "ErrTooManyHandles",
+	ErrNonZeroPadding:                  "ErrNonZeroPadding",
+	ErrBadHandleEncoding:               "ErrBadHandleEncoding",
+	ErrBadRefEncoding:                  "ErrBadRefEncoding",
+	ErrBadInlineIndicatorEncoding:      "ErrBadInlineIndicatorEncoding",
+	ErrStructIsNotPayload:              "ErrStructIsNotPayload",
+	ErrInvalidUnionTag:                 "ErrInvalidUnionTag",
+	ErrInvalidXUnionTag:                "ErrInvalidXUnionTag",
+	ErrInvalidBitsValue:                "ErrInvalidBitsValue",
+	ErrInvalidEnumValue:                "ErrInvalidEnumValue",
+	ErrPayloadTooSmall:                 "ErrPayloadTooSmall",
+	ErrInvalidEmptyStruct:              "ErrInvalidEmptyStruct",
+	ErrInvalidNumBytesInEnvelope:       "ErrInvalidNumBytesInEnvelope",
+	ErrInvalidNumHandlesInEnvelope:     "ErrInvalidNumHandlesInEnvelope",
+	ErrStringNotUTF8:                   "ErrStringNotUTF8",
+	ErrUnknownMagic:                    "ErrUnknownMagic",
+	ErrMissingRequiredHandleRights:     "ErrMissingRequiredHandleRights",
+	ErrUnableToReduceHandleRights:      "ErrUnableToReduceHandleRights",
+	ErrUnspecifiedHandleRights:         "ErrUnspecifiedHandleRights",
+	ErrMissingMarshalerContext:         "ErrMissingMarshalerContext",
+	ErrResponseWithoutRequest:          "ErrResponseWithoutRequest",
+	ErrDuplicateTxidReceived:           "ErrDuplicateTxidReceived",
+	ErrDuplicateTxidWaiting:            "ErrDuplicateTxidWaiting",
+	ErrIncorrectHandleType:             "ErrIncorrectHandleType",
+	ErrUnspecifiedHandleType:           "ErrUnspecifiedHandleType",
+	ErrValueTypeHandles:                "ErrValueTypeHandles",
+	ErrExceededMaxOutOfLineDepth:       "ErrExceededMaxOutOfLineDepth",
+	ErrInvalidInlineBitValueInEnvelope: "ErrInvalidInlineBitValueInEnvelope",
 }
 
 func (c ErrorCode) String() string {
@@ -195,6 +197,8 @@
 		return "cannot encode or decode value type with handles in unknown data"
 	case ErrExceededMaxOutOfLineDepth:
 		return "exceeded maxOutOfLineDepth"
+	case ErrInvalidInlineBitValueInEnvelope:
+		return "invalid inline bit value in envelope"
 	default:
 		return e.String()
 	}