Index: third_party/mojo/src/mojo/public/go/bindings/decoder.go |
diff --git a/third_party/mojo/src/mojo/public/go/bindings/decoder.go b/third_party/mojo/src/mojo/public/go/bindings/decoder.go |
index 2dccd0ad99230ee81f32ee533d341d189c95a1ba..3f3cce9bca824f4f4378e12053dbb7809c0699dc 100644 |
--- a/third_party/mojo/src/mojo/public/go/bindings/decoder.go |
+++ b/third_party/mojo/src/mojo/public/go/bindings/decoder.go |
@@ -185,6 +185,7 @@ func (d *Decoder) ReadUint8() (uint8, error) { |
if err := ensureElementBitSizeAndCapacity(d.state(), 8); err != nil { |
return 0, err |
} |
+ d.state().alignOffsetToBytes() |
value := d.buf[d.state().offset] |
d.state().skipBytes(1) |
d.state().elementsProcessed++ |
@@ -202,6 +203,7 @@ func (d *Decoder) ReadUint16() (uint16, error) { |
if err := ensureElementBitSizeAndCapacity(d.state(), 16); err != nil { |
return 0, err |
} |
+ d.state().alignOffsetToBytes() |
d.state().offset = align(d.state().offset, 2) |
value := binary.LittleEndian.Uint16(d.buf[d.state().offset:]) |
d.state().skipBytes(2) |
@@ -220,6 +222,7 @@ func (d *Decoder) ReadUint32() (uint32, error) { |
if err := ensureElementBitSizeAndCapacity(d.state(), 32); err != nil { |
return 0, err |
} |
+ d.state().alignOffsetToBytes() |
d.state().offset = align(d.state().offset, 4) |
value := binary.LittleEndian.Uint32(d.buf[d.state().offset:]) |
d.state().skipBytes(4) |
@@ -238,6 +241,7 @@ func (d *Decoder) ReadUint64() (uint64, error) { |
if err := ensureElementBitSizeAndCapacity(d.state(), 64); err != nil { |
return 0, err |
} |
+ d.state().alignOffsetToBytes() |
d.state().offset = align(d.state().offset, 8) |
value := binary.LittleEndian.Uint64(d.buf[d.state().offset:]) |
d.state().skipBytes(8) |
@@ -300,16 +304,59 @@ func (d *Decoder) ReadPointer() (uint64, error) { |
if newEnd%8 != 0 { |
return 0, fmt.Errorf("incorrect pointer data alignment: %d", newEnd) |
} |
- d.claimData(d.end - int(newEnd)) |
+ d.claimData(int(newEnd) - d.end) |
return pointer, nil |
} |
-// ReadMessagePipeHandle reads a message pipe handle. |
-func (d *Decoder) ReadMessagePipeHandle() (system.MessagePipeHandle, error) { |
+// ReadUntypedHandle reads an untyped handle. |
+func (d *Decoder) ReadUntypedHandle() (system.UntypedHandle, error) { |
handleIndex, err := d.ReadUint32() |
if err != nil { |
return nil, err |
} |
- untypedHandle, err := d.claimHandle(int(handleIndex)) |
- return untypedHandle.ToMessagePipeHandle(), err |
+ if handleIndex == ^uint32(0) { |
+ return &InvalidHandle{}, nil |
+ } |
+ return d.claimHandle(int(handleIndex)) |
+} |
+ |
+// ReadHandle reads a handle. |
+func (d *Decoder) ReadHandle() (system.Handle, error) { |
+ return d.ReadUntypedHandle() |
+} |
+ |
+// ReadMessagePipeHandle reads a message pipe handle. |
+func (d *Decoder) ReadMessagePipeHandle() (system.MessagePipeHandle, error) { |
+ if handle, err := d.ReadUntypedHandle(); err != nil { |
+ return nil, err |
+ } else { |
+ return handle.ToMessagePipeHandle(), nil |
+ } |
+} |
+ |
+// ReadConsumerHandle reads a data pipe consumer handle. |
+func (d *Decoder) ReadConsumerHandle() (system.ConsumerHandle, error) { |
+ if handle, err := d.ReadUntypedHandle(); err != nil { |
+ return nil, err |
+ } else { |
+ return handle.ToConsumerHandle(), nil |
+ } |
+} |
+ |
+// ReadProducerHandle reads a data pipe producer handle. |
+func (d *Decoder) ReadProducerHandle() (system.ProducerHandle, error) { |
+ if handle, err := d.ReadUntypedHandle(); err != nil { |
+ return nil, err |
+ } else { |
+ return handle.ToProducerHandle(), nil |
+ } |
+} |
+ |
+// ReadSharedBufferHandle reads a shared buffer handle. |
+func (d *Decoder) ReadSharedBufferHandle() (system.SharedBufferHandle, error) { |
+ if handle, err := d.ReadUntypedHandle(); err != nil { |
+ return nil, err |
+ } else { |
+ return handle.ToSharedBufferHandle(), nil |
+ } |
} |