haco20292 / dex2jar

Automatically exported from code.google.com/p/dex2jar
0 stars 0 forks source link

Bug in exception handler, resulting JAR not verifiable #121

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?

1. Write a dex method like the following ( I got this method from the facebook 
app, original classes.dex is too big to upload)

.method private static a(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    .registers 4
    .parameter
    .parameter

    .prologue
    .line 213
    if-eqz p1, :cond_7

    :goto_2
    :try_start_2
    invoke-static {p0, p1}, Ljava/net/URLEncoder;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    move-result-object v0

    return-object v0

    :cond_7
    const-string p1, "ISO-8859-1"
    :try_end_9
    .catch Ljava/io/UnsupportedEncodingException; {:try_start_2 .. :try_end_9} :catch_a

    goto :goto_2

    .line 215
    :catch_a
    move-exception v0

    .line 216
    new-instance v1, Ljava/lang/IllegalArgumentException;

    invoke-direct {v1, v0}, Ljava/lang/IllegalArgumentException;-><init>(Ljava/lang/Throwable;)V

    throw v1
.end method

2. Translate to jar using dex2jar. 

3. Run the verifier, it crashes with the following message:

Error verify method com/facebook/apache/http/client/utils/URLEncodedUtils.a 
(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
org.objectweb.asm.tree.analysis.AnalyzerException: Error at instruction 16: 
Trying to access an inexistant local variable
    at org.objectweb.asm.tree.analysis.Analyzer.analyze(Unknown Source)
    at com.googlecode.dex2jar.tools.AsmVerify$1.handle(AsmVerify.java:141)
    at p.rn.util.FileWalker.walk(FileWalker.java:79)
    at com.googlecode.dex2jar.tools.AsmVerify.doCommandLine(AsmVerify.java:119)
    at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:118)
    at com.googlecode.dex2jar.tools.AsmVerify.main(AsmVerify.java:50)
Caused by: java.lang.IndexOutOfBoundsException: Trying to access an inexistant 
local variable
    at org.objectweb.asm.tree.analysis.Frame.getLocal(Unknown Source)
    at org.objectweb.asm.tree.analysis.Frame.execute(Unknown Source)
    ... 6 more
00000 RR :       |    ALOAD 1
00001 RR : R     |    IFNULL L0
00002 RR :       |   L1
00003 ?          |    ALOAD 0
00004 ?          |    ALOAD 1
00005 ?          |    INVOKESTATIC java/net/URLEncoder.encode 
(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
00006 ?          |    ARETURN
00007 RR :       |   L0
00008 RR :       |    LDC "ISO-8859-1"
00009 ?          |    ASTORE 1
00010 ?          |   L2
00011 ?          |    GOTO L1
00012 RR : R     |   L3
00013 RR : R     |    POP
00014 RR :       |    NEW java/lang/IllegalArgumentException
00015 RR : R     |    DUP
00016 RR : RR    |    DLOAD 3
00017 ?          |    INVOKESPECIAL java/lang/IllegalArgumentException.<init> 
(Ljava/lang/Throwable;)V
00018 ?          |    ATHROW
     TRYCATCHBLOCK L1 L2 L3 java/io/UnsupportedEncodingException

What is the expected output? What do you see instead?

What I get:

private static java.lang.String a(java.lang.String, java.lang.String);
  Code:
   Stack=3, Locals=2, Args_size=2
   0:   aload_1
   1:   ifnull  10
   4:   aload_0
   5:   aload_1
   6:   invokestatic    #18; //Method java/net/URLEncoder.encode:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
   9:   areturn
   10:  ldc #20; //String ISO-8859-1
   12:  astore_1
   13:  goto    4
   16:  pop
   17:  new #22; //class java/lang/IllegalArgumentException
   20:  dup
   21:  dload_3
   22:  invokespecial   #25; //Method java/lang/IllegalArgumentException."<init>":(Ljava/lang/Throwable;)V
   25:  athrow
  Exception table:
   from   to  target type
     4    13    16   Class java/io/UnsupportedEncodingException

I would expect something like the following (notice locals=3 and lines 16,21):

private static java.lang.String a(java.lang.String, java.lang.String);
  Code:
   Stack=3, Locals=3, Args_size=2
   0:   aload_1
   1:   ifnull  10
   4:   aload_0
   5:   aload_1
   6:   invokestatic    #18; //Method java/net/URLEncoder.encode:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
   9:   areturn
   10:  ldc #20; //String ISO-8859-1
   12:  astore_1
   13:  goto    4
   16:  astore_2
   17:  new #22; //class java/lang/IllegalArgumentException
   20:  dup
   21:  aload_2
   22:  invokespecial   #25; //Method java/lang/IllegalArgumentException."<init>":(Ljava/lang/Throwable;)V
   25:  athrow
  Exception table:
   from   to  target type
     4    13    16   Class java/io/UnsupportedEncodingException

What version of the product are you using? On what operating system?
0.0.9.8 on MAC OSX 10.6.8

Original issue reported on code.google.com by O.Tsapo...@gmail.com on 12 Jun 2012 at 10:41