From 163a0e00d22e8b840cfd978059b3d7d0a584a043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 23 Mar 2024 20:02:09 +0100 Subject: [PATCH] Fixed #2202 AS2 detection of uninitialized class fields colliding with setters/getters --- CHANGELOG.md | 2 ++ .../as2/UninitializedClassFieldsDetector.java | 5 +++ .../ActionScript2UninitializedFieldsTest.java | 23 ++++++++++++++ .../as2_initfields/as2_initfields.swf | Bin 903 -> 1092 bytes .../as2_initfields/com/jpexs/MyClass.as | 30 ++++++++++++++++-- 5 files changed, 57 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9bbee532..b5ec0acbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ All notable changes to this project will be documented in this file. - Raw edit of fonts - shape table was not visible - [#2211] PDF export, Font export - glyphs with no contours (advance only) - [#2212] GFX - Allow loading (DDS) images despite of set bitmapFormat +- [#2202] AS2 detection of uninitialized class fields colliding with setters/getters ### Changed - [#2185] MochiCrypt no longer offered for auto decrypt, user needs to choose variant from "Use unpacker" menu @@ -3400,6 +3401,7 @@ Major version of SWF to XML export changed to 2. [#2190]: https://www.free-decompiler.com/flash/issues/2190 [#2211]: https://www.free-decompiler.com/flash/issues/2211 [#2212]: https://www.free-decompiler.com/flash/issues/2212 +[#2202]: https://www.free-decompiler.com/flash/issues/2202 [#2206]: https://www.free-decompiler.com/flash/issues/2206 [#2100]: https://www.free-decompiler.com/flash/issues/2100 [#2123]: https://www.free-decompiler.com/flash/issues/2123 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java index 4910ffb96..6bced1861 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/as2/UninitializedClassFieldsDetector.java @@ -213,6 +213,11 @@ public class UninitializedClassFieldsDetector { GraphTargetItem value = en.getValue(); boolean isStatic = cai.traitsStatic.get(i); if (value instanceof FunctionActionItem) { + if (name.startsWith("__get__") || name.startsWith("__set__")) { + String vname = name.substring(7); + Variable v = new Variable(isStatic, vname, vname, className); + classTraits.get(className).put(vname, v); + } Method m = new Method(isStatic, name, "Unknown" /*FIXME?*/, className); classTraits.get(className).put(name, m); } else { diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2UninitializedFieldsTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2UninitializedFieldsTest.java index 294ff661d..b32da0830 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2UninitializedFieldsTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2UninitializedFieldsTest.java @@ -91,7 +91,9 @@ public class ActionScript2UninitializedFieldsTest extends ActionScript2TestBase + " var f;\n" + " var c;\n" + " var d;\n" + + " var _v3;\n" + " static var sv2;\n" + + " static var _sv3;\n" + " static var sv;\n" + " var init_v = 2;\n" + " static var sinit_v = 3;\n" @@ -121,6 +123,27 @@ public class ActionScript2UninitializedFieldsTest extends ActionScript2TestBase + " function deleteD()\n" + " {\n" + " delete this.d;\n" + + " }\n" + + " function set v3(val)\n" + + " {\n" + + " this._v3 = val;\n" + + " }\n" + + " function get v3()\n" + + " {\n" + + " return this._v3;\n" + + " }\n" + + " static function set sv3(val)\n" + + " {\n" + + " com.jpexs.MyClass._sv3 = val;\n" + + " }\n" + + " static function get sv3()\n" + + " {\n" + + " return com.jpexs.MyClass._sv3;\n" + + " }\n" + + " function setV3()\n" + + " {\n" + + " this.v = this.v3;\n" + + " com.jpexs.MyClass.sv = com.jpexs.MyClass.sv3;\n" + " }"); } } diff --git a/libsrc/ffdec_lib/testdata/as2_initfields/as2_initfields.swf b/libsrc/ffdec_lib/testdata/as2_initfields/as2_initfields.swf index 7fda9c12dd501fd9eb25a818452b8c095a977e23..540be2b0f94de327425498c683692532688353bd 100644 GIT binary patch literal 1092 zcmV-K1iSk~S5pt$2><|ioTXGvbJ|uEy$G=7q;?!T4R+(WsY7n8^aj zfX7=#mL6D%kTiM^j8|DUt86;Mrqh}JtNxMh-S_kXw!v%w^8xLBjBlf4TY0P$`ytZ>W+agg!h5hLl{$e!x5^TqL3HPhqhx0`$zJzc$axY z3+ePKE0Ut-WhpNmo=S=)tJ=XnjWtQS!Htj+wSkCX8N^7)6s_hJ^;DKMwRneo3melt z%kEu$6?ujfj>S7pex0|LIknaw22R*7%M_7=2FN9t+AD|lTBg?Xf`LKGhVMJJX)r-? zoW~cQ`SH>ip?r^7eJsv^-&zvgS)=iA!v_N~L1WTJy@%2G^vXwK8)0u4n25q(#RJo5 zXzyH14A(^O^fG-=ux(3|^uyX=r6%o5wNkAn%cV-a_Di*-*AH}6FG@=2{cUQZrhDd) z`4+2L|3U2rHBoB?cHgEWyFgVxQV&(Vc2Jj#`=P2*k@Q+ouUCq4O(|6p)ddpMT2Ww+ zkW~-7LD&V~2ryz!o$Mu6F`GhvHGAGB~u?M#>O_t0?Nw{8NN~uul&Du|4oPuumyxVfk!+-rvnJW#U4m~PF+a3%}QUwz%dYsS`5-eH~Mx@&vsSsY>ezJ<5V;16BhJ`e7 zrUDC?Z7SHVO_+o6zhPPQc=u62uAtKCAi`Gk*zaSAJ!Hl;H#Yv@U@Lhsp-nJsXjKrTuA5GLT8}*(P0ZIkw>Vr7t{7bFX0) zCMztx9JRO=<@srT1tR)Nvm6UOio~~J?ycedaSY`6@1`OfYz(J6q8h91Tnt*fAM~V? zfY#^Ad8#G3jW4TgzS6IO8`05v36muT*vxRPJ9^LB<%INXPH=O&zwaYK?q^6b!IMS% z%mDv9L!Es*_i5ddwq;UE_P literal 903 zcmV;219<#HS5pr%2mk5~HI>=O^Qp;Kr@0Hp0#j9|(`jK^ERb-h>g94-)eO}z@*I(; zmp((YyiZ@`s!F6_VQPnNz+B=hVvYJ_%uaK;M0Pd`R#_nz2c~hE3?iaR-+_L|!A6ih9Gz zAM@6+SJnpO(2LH?u~qEh5%wA7_Ue(nj%^M|I6|z7g1~caBm~u2o?a09(-ci`eju!_ zsB7TQro=02weCLf(MVmQDLcc1yV3OgGQjE?reqx2n8RNr4by6w?|jOTZ{v4Xm2VVW z*D*_foRrF?My=U6E;SmuUN&l))i}1AwPU?ulxvaq*QrZ2i`Zk~TcYOt2el3AQmqrZ zLzlPgEvnY*;z`kJylU!qtKK59$`yz11Ut=;jG|KrP)MNK~sO4tQc@5nS!>cOEvO;Z2G2zvO1WxPq(+Unp}ca1?tjbv3RrN^9%CoIoyL0@IHi(0iIE4 zUDo**Lczzq3D615_dw>5+^9;zlnG}zA#KtvDTLjZ_5EfaX zl!~O@?EfCkQ_$_tEuPc#5(KoA#xW?YuQ3BfkHt0cj2|CzH=b_1CSrI$TNKvOnRXob< dL<`GON$naVDjVBBY4Xv{{m&rC-efv(%b+5 diff --git a/libsrc/ffdec_lib/testdata/as2_initfields/com/jpexs/MyClass.as b/libsrc/ffdec_lib/testdata/as2_initfields/com/jpexs/MyClass.as index 05ba66503..71208ce91 100644 --- a/libsrc/ffdec_lib/testdata/as2_initfields/com/jpexs/MyClass.as +++ b/libsrc/ffdec_lib/testdata/as2_initfields/com/jpexs/MyClass.as @@ -1,4 +1,4 @@ -class com.jpexs.MyClass { +class com.jpexs.MyClass { var v; static var sv; var v2; @@ -9,9 +9,12 @@ class com.jpexs.MyClass { var c; var d; - + + var _v3; + static var _sv3; + var init_v = 2; - static var sinit_v = 3; + static var sinit_v = 3; function testVar() { this.v = 1; @@ -36,4 +39,25 @@ class com.jpexs.MyClass { function deleteD() { delete d; } + + function set v3(val) { + this._v3 = val; + } + + function get v3() { + return this._v3; + } + + static function set sv3(val) { + MyClass._sv3 = val; + } + + static function get sv3() { + return MyClass._sv3; + } + + function setV3() { + this.v = this.v3; + MyClass.sv = MyClass.sv3; + } }