diff --git a/CHANGES.md b/CHANGES.md index d3fd49345..27c25caaa 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,7 @@ Features Bug Fixes --------- * [#1618](https://github.com/java-native-access/jna/issues/1618): Fix calls to jnidispatch on Android with 16KB page size - [@Thomyrock](https://github.com/Thomyrock) +* [#1644](https://github.com/java-native-access/jna/issues/1644): Fix bug in VARDESC and TYPEDESC causing an illegal memory access - [@stmuecke](https://github.com/stmuecke) Release 5.15.0 ============== diff --git a/contrib/platform/src/com/sun/jna/platform/win32/OaIdl.java b/contrib/platform/src/com/sun/jna/platform/win32/OaIdl.java index 2cfd89616..a6b905f34 100644 --- a/contrib/platform/src/com/sun/jna/platform/win32/OaIdl.java +++ b/contrib/platform/src/com/sun/jna/platform/win32/OaIdl.java @@ -1398,14 +1398,10 @@ public static class ByReference extends _VARDESC implements public VARIANT.ByReference lpvarValue; public _VARDESC() { - setType("lpvarValue"); - this.read(); } public _VARDESC(Pointer pointer) { super(pointer); - setType("lpvarValue"); - this.read(); } /** @@ -1431,9 +1427,15 @@ public VARDESC() { public VARDESC(Pointer pointer) { super(pointer); - this._vardesc.setType("lpvarValue"); this.read(); } + + @Override + public void read() { + readField("varkind"); + this._vardesc.setType(varkind.value == VARKIND.VAR_CONST ? "lpvarValue" : "oInst"); + super.read(); + } } @FieldOrder({"tdesc", "_elemdesc"}) @@ -1654,14 +1656,10 @@ public static class _TYPEDESC extends Union { public HREFTYPE hreftype; public _TYPEDESC() { - this.setType("hreftype"); - this.read(); } public _TYPEDESC(Pointer pointer) { super(pointer); - this.setType("hreftype"); - this.read(); } public TYPEDESC.ByReference getLptdesc() { @@ -1687,18 +1685,35 @@ public HREFTYPE getHreftype() { public VARTYPE vt; public TYPEDESC() { - this.read(); } public TYPEDESC(Pointer pointer) { super(pointer); - this.read(); } public TYPEDESC(_TYPEDESC _typedesc, VARTYPE vt) { this._typedesc = _typedesc; this.vt = vt; } + + @Override + public void read() { + readField("vt"); + switch (vt.intValue()) { + case Variant.VT_PTR: + case Variant.VT_SAFEARRAY: + _typedesc.setType("lptdesc"); + break; + case Variant.VT_CARRAY: + _typedesc.setType("lpadesc"); + break; + case Variant.VT_USERDEFINED: + default: + _typedesc.setType("hreftype"); + break; + } + super.read(); + } } @FieldOrder({"dwReserved", "wIDLFlags"})