From cda21d987f5443e9765e4b2aa723722a9d2da236 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Mon, 2 Sep 2019 22:30:08 -0400 Subject: [PATCH] Parser: Do not reuse byte array when trimming bfr [#562] --- 100_core/src/gplx/Bry_.java | 9 +++++---- 100_core/src/gplx/Bry_bfr.java | 2 +- 100_core/src/gplx/Bry_bfr_tst.java | 14 ++++++++++++++ .../xowa/addons/htmls/tocs/Xoh_toc_wkr__txt.java | 2 +- .../gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java | 2 +- .../client/includes/Wbase_repo_linker.java | 2 +- 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/100_core/src/gplx/Bry_.java b/100_core/src/gplx/Bry_.java index 4303ab10d..d10cda57c 100644 --- a/100_core/src/gplx/Bry_.java +++ b/100_core/src/gplx/Bry_.java @@ -438,9 +438,9 @@ public class Bry_ { return rv; } public static final byte[] Trim_ary_ws = mask_(256, Byte_ascii.Tab, Byte_ascii.Nl, Byte_ascii.Cr, Byte_ascii.Space); - public static byte[] Trim(byte[] src) {return Trim(src, 0, src.length, true, true, Trim_ary_ws);} - public static byte[] Trim(byte[] src, int bgn, int end) {return Trim(src, bgn, end, true, true, Trim_ary_ws);} - public static byte[] Trim(byte[] src, int bgn, int end, boolean trim_bgn, boolean trim_end, byte[] trim_ary) { + public static byte[] Trim(byte[] src) {return Trim(src, 0, src.length, true, true, Trim_ary_ws, true);} + public static byte[] Trim(byte[] src, int bgn, int end) {return Trim(src, bgn, end, true, true, Trim_ary_ws, true);} + public static byte[] Trim(byte[] src, int bgn, int end, boolean trim_bgn, boolean trim_end, byte[] trim_ary, boolean reuse_bry_if_noop) { int txt_bgn = bgn, txt_end = end; boolean all_ws = true; if (trim_bgn) { @@ -466,7 +466,8 @@ public class Bry_ { if (all_ws) return Bry_.Empty; } - if ( bgn == 0 && end == src.length // Trim is called on entire bry, not subset + if ( reuse_bry_if_noop + && bgn == 0 && end == src.length // Trim is called on entire bry, not subset && bgn == txt_bgn && end == txt_end // Trim hasn't trimmed anything ) { return src; diff --git a/100_core/src/gplx/Bry_bfr.java b/100_core/src/gplx/Bry_bfr.java index 4fe3f994c..caed53157 100644 --- a/100_core/src/gplx/Bry_bfr.java +++ b/100_core/src/gplx/Bry_bfr.java @@ -588,7 +588,7 @@ public class Bry_bfr { public byte[] To_bry() {return bfr_len == 0 ? Bry_.Empty : Bry_.Mid(bfr, 0, bfr_len);} public byte[] To_bry_and_clear_and_trim() {return To_bry_and_clear_and_trim(true, true, Bry_.Trim_ary_ws);} public byte[] To_bry_and_clear_and_trim(boolean trim_bgn, boolean trim_end, byte[] trim_bry) { - byte[] rv = Bry_.Trim(bfr, 0, bfr_len, trim_bgn, trim_end, trim_bry); + byte[] rv = Bry_.Trim(bfr, 0, bfr_len, trim_bgn, trim_end, trim_bry, false); // NOTE: must not reuse bry; ISSUE#:562; DATE:2019-09-02 this.Clear(); return rv; } diff --git a/100_core/src/gplx/Bry_bfr_tst.java b/100_core/src/gplx/Bry_bfr_tst.java index dcaee5c64..4c80110da 100644 --- a/100_core/src/gplx/Bry_bfr_tst.java +++ b/100_core/src/gplx/Bry_bfr_tst.java @@ -219,6 +219,20 @@ public class Bry_bfr_tst { fxt.Test__to_bry_ary_and_clear("a\nb\nc" , "a", "b", "c"); // lines=n fxt.Test__to_bry_ary_and_clear("a\n" , "a"); // nl at end } + @Test public void To_bry_ary_and_clear_and_trim__memory_reference_bug() {// PURPOSE:test that bry isn't reused; ISSUE#:562; DATE:2019-09-02 + String str_a = "aaaaaaaaaaaaaaaa" // NOTE: length is 16 b/c bry_bfr init's to 16 len + , str_b = "bbbbbbbbbbbbbbbb"; + Bry_bfr bfr = Bry_bfr_.New(); + bfr.Add_str_a7(str_a); + byte[] bry_a = bfr.To_bry_and_clear_and_trim(); + Gftest.Eq__str(str_a, String_.new_u8(bry_a)); + + bfr.Add_str_a7(str_b); + byte[] bry_b = bfr.To_bry_and_clear_and_trim(); + Gftest.Eq__str(str_b, String_.new_u8(bry_b)); + + Gftest.Eq__str(str_a, String_.new_u8(bry_a)); // fais if bry_b + } } class ByteAryBfr_fxt { private final Bry_bfr bfr = Bry_bfr_.Reset(16); diff --git a/400_xowa/src/gplx/xowa/addons/htmls/tocs/Xoh_toc_wkr__txt.java b/400_xowa/src/gplx/xowa/addons/htmls/tocs/Xoh_toc_wkr__txt.java index 8e86f6041..08115a7b1 100644 --- a/400_xowa/src/gplx/xowa/addons/htmls/tocs/Xoh_toc_wkr__txt.java +++ b/400_xowa/src/gplx/xowa/addons/htmls/tocs/Xoh_toc_wkr__txt.java @@ -90,7 +90,7 @@ class Xoh_toc_wkr__txt { // add any text before tag if (pos < txt_end) { - byte[] anch_bry = amp_mgr.Decode_as_bry(Bry_.Trim(src, pos, txt_end, Bool_.Y, Bool_.Y, Trim__anch)); // trim \n else ".0a"; PAGE:en.w:List_of_U-boats_never_deployed DATE:2016-08-13 + byte[] anch_bry = amp_mgr.Decode_as_bry(Bry_.Trim(src, pos, txt_end, Bool_.Y, Bool_.Y, Trim__anch, Bool_.Y)); // trim \n else ".0a"; PAGE:en.w:List_of_U-boats_never_deployed DATE:2016-08-13 anch_encoder.Encode(anch_bfr, anch_bry); text_bfr.Add_mid(src, pos, txt_end); } diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java index 84956ca28..77531af22 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java @@ -154,7 +154,7 @@ public class Xog_tab_itm_edit_mgr { byte[] rv = tab.Html_itm().Get_elem_value_for_edit_box_as_bry(); if (orig != null) // orig == null for Preview rv = tab.Wiki().Parser_mgr().Hdr__section_editable__mgr().Merge_section(tab.Page().Url(), rv, orig); - rv = Bry_.Trim(rv, 0, rv.length, false, true, Bry_.Trim_ary_ws); // MW: trim all trailing ws; REF:EditPage.php!safeUnicodeInput; DATE:2014-04-25 + rv = Bry_.Trim(rv, 0, rv.length, false, true, Bry_.Trim_ary_ws, true); // MW: trim all trailing ws; REF:EditPage.php!safeUnicodeInput; DATE:2014-04-25 return rv; } } diff --git a/400_xowa/src/gplx/xowa/xtns/wbases/mediawiki/client/includes/Wbase_repo_linker.java b/400_xowa/src/gplx/xowa/xtns/wbases/mediawiki/client/includes/Wbase_repo_linker.java index fa249e7cb..51fb243c2 100644 --- a/400_xowa/src/gplx/xowa/xtns/wbases/mediawiki/client/includes/Wbase_repo_linker.java +++ b/400_xowa/src/gplx/xowa/xtns/wbases/mediawiki/client/includes/Wbase_repo_linker.java @@ -21,7 +21,7 @@ public class Wbase_repo_linker { private byte[] articlePath; // private byte[] scriptPath; public Wbase_repo_linker(byte[] baseUrl, byte[] articlePath, byte[] scriptPath) { - this.baseUrl = Bry_.Trim(baseUrl, 0, baseUrl.length, false, true, Bry_.mask_(256, Byte_ascii.Slash_bry)); // getBaseUrl + this.baseUrl = Bry_.Trim(baseUrl, 0, baseUrl.length, false, true, Bry_.mask_(256, Byte_ascii.Slash_bry), true); // getBaseUrl this.articlePath = articlePath; // this.scriptPath = scriptPath; }