[ 
https://issues.apache.org/jira/browse/FLEX-34371?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14054401#comment-14054401
 ] 

Guest commented on FLEX-34371:
------------------------------

Here's a sample application. It defines a method writeSprite that creates a 
sprite containing a editable text field, with a given initial text, placement 
depth, and vertical position. When the method is called twice with the same 
initial text, as it is in the sample application, it results in a SWF that 
reproduces the crash in this bug.

{code:java}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import flash.swf.Header;
import flash.swf.TagEncoder;
import flash.swf.TagHandler;
import flash.swf.TagValues;
import flash.swf.tags.DefineEditText;
import flash.swf.tags.DefineSprite;
import flash.swf.tags.PlaceObject;
import flash.swf.tags.ShowFrame;
import flash.swf.types.Matrix;
import flash.swf.types.Rect;


public class Test {

        public static void writeSprite(final TagHandler handler, final String 
init, final int depth, final int y) {
                final DefineEditText et = new DefineEditText();
                et.bounds = new Rect(4000, 1000);
                et.hasText = true;
                et.varName = "val";
                et.initialText = init;
                et.visit(handler);

                final DefineSprite ds = new DefineSprite();

                final PlaceObject po1 = new 
PlaceObject(TagValues.stagPlaceObject);
                po1.setRef(et);
                po1.depth = 1;
                po1.setMatrix(new Matrix(0, 0));
                po1.visit(ds.tagList);

                final ShowFrame sf = new ShowFrame();
                sf.visit(ds.tagList);

                ds.visit(handler);

                final PlaceObject po2 = new 
PlaceObject(TagValues.stagPlaceObject);
                po2.setRef(ds);
                po2.depth = depth;
                po2.setMatrix(new Matrix(0, y));
                po2.visit(handler);
        }

        public static void main(String[] args) throws IOException {
                final TagEncoder e = new TagEncoder();

                final Header h = new Header();
                h.version = 19;
                h.size = new Rect(4000, 4000);
                h.rate = 60;
                e.header(h);

                writeSprite(e, "one", 0, 0);
                writeSprite(e, "one", 1, 1000);

                final ShowFrame sf = new ShowFrame();
                sf.visit(e);

                e.finish();
                final OutputStream os = new FileOutputStream("test.swf");
                e.writeTo(os);
                os.close();
        }

}
{code}

Running this code generates a file test.swf. Running swfdump test.swf causes 
SwfxPrinter to crash.

> how TagEncoder handles duplicate define* tags
> ---------------------------------------------
>
>                 Key: FLEX-34371
>                 URL: https://issues.apache.org/jira/browse/FLEX-34371
>             Project: Apache Flex
>          Issue Type: Bug
>    Affects Versions: Apache Flex 4.12.0
>            Reporter: Guest
>
> Suppose there are two DefineEditText tags that are the same by .equals, and a 
> TagEncoder handles them. This writes them both to the SWF, but assigns them 
> the same character ID. Adobe's Flash player can load the SWF fine, but it 
> causes swfdump to crash with an exception like the following:
> {code}
> Exception in thread "main" java.lang.IllegalArgumentException: symbol 154 
> redefined by identical tag
>         at flash.swf.Dictionary.add(Dictionary.java:142)
>         at flash.swf.TagDecoder.decodeDefineEditText(TagDecoder.java:1160)
>         at flash.swf.TagDecoder.decodeTag(TagDecoder.java:319)
>         at flash.swf.TagDecoder.decodeTags(TagDecoder.java:194)
>         at flash.swf.TagDecoder.parse(TagDecoder.java:142)
>         at flash.swf.tools.SwfxPrinter.dumpSwf(SwfxPrinter.java:2318)
>         at flash.swf.tools.SwfxPrinter.main(SwfxPrinter.java:2225)
> {code}
> Actual result:
> defineEditText(tag) in TagEncoder calls
> {code:java}
> int id = dict.add(tag);
> {code}
> When serializing the second DefineEditText, the Dictionary finds the first 
> one and returns its ID. Then, the defineEditText(tag) method writes the 
> second copy with the first one's ID.
> Expected result:
> either
> - it writes the duplicate with a new ID or
> - it does not write anything and uses the first copy's ID for references to 
> the second.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to