Skip to content

Commit a88f9ff

Browse files
committed
Fix data segment parsing from runtime bytecode.
Data segment value may be undefined. Fix memory index decoding.
1 parent 8e1b511 commit a88f9ff

File tree

2 files changed

+5
-3
lines changed

2 files changed

+5
-3
lines changed

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/WasmInstantiator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,8 @@ static List<LinkAction> recreateLinkActions(WasmModule module) {
267267
}
268268
final byte[] dataOffsetBytecode;
269269
final long dataOffsetAddress;
270-
if ((encoding & BytecodeBitEncoding.DATA_SEG_BYTECODE_OR_OFFSET_MASK) == BytecodeBitEncoding.DATA_SEG_BYTECODE) {
270+
if ((encoding & BytecodeBitEncoding.DATA_SEG_BYTECODE_OR_OFFSET_MASK) == BytecodeBitEncoding.DATA_SEG_BYTECODE &&
271+
((encoding & BytecodeBitEncoding.DATA_SEG_VALUE_MASK) != BytecodeBitEncoding.DATA_SEG_VALUE_UNDEFINED)) {
271272
int dataOffsetBytecodeLength = (int) value;
272273
dataOffsetBytecode = Arrays.copyOfRange(bytecode, effectiveOffset, effectiveOffset + dataOffsetBytecodeLength);
273274
effectiveOffset += dataOffsetBytecodeLength;
@@ -285,7 +286,7 @@ static List<LinkAction> recreateLinkActions(WasmModule module) {
285286
effectiveOffset++;
286287
switch (memoryIndexEncoding & BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_MASK) {
287288
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_U6:
288-
memoryIndex = encoding & BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_VALUE;
289+
memoryIndex = memoryIndexEncoding & BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_VALUE;
289290
break;
290291
case BytecodeBitEncoding.DATA_SEG_MEMORY_INDEX_U8:
291292
memoryIndex = BinaryStreamParser.rawPeekU8(bytecode, effectiveOffset);

wasm/src/org.graalvm.wasm/src/org/graalvm/wasm/parser/bytecode/BytecodeParser.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ public static void resetMemoryState(WasmStore store, WasmModule module, WasmInst
144144
}
145145
final byte[] offsetBytecode;
146146
long offsetAddress;
147-
if ((flags & BytecodeBitEncoding.DATA_SEG_BYTECODE_OR_OFFSET_MASK) == BytecodeBitEncoding.DATA_SEG_BYTECODE) {
147+
if ((flags & BytecodeBitEncoding.DATA_SEG_BYTECODE_OR_OFFSET_MASK) == BytecodeBitEncoding.DATA_SEG_BYTECODE &&
148+
((flags & BytecodeBitEncoding.DATA_SEG_VALUE_MASK) != BytecodeBitEncoding.DATA_SEG_VALUE_UNDEFINED)) {
148149
int offsetBytecodeLength = (int) value;
149150
offsetBytecode = Arrays.copyOfRange(bytecode, effectiveOffset, effectiveOffset + offsetBytecodeLength);
150151
effectiveOffset += offsetBytecodeLength;

0 commit comments

Comments
 (0)