From 43669ecc6e3f5d95ef1653fb7ba0c0445040fd3c Mon Sep 17 00:00:00 2001 From: Albert Gorski Date: Sun, 9 Oct 2016 21:24:05 -0400 Subject: [PATCH] Ensure all smali files are closed after the writing is complete This makes sure that all smali files are closed after writing to them by surrounding the writer code with a try/finally block that closes the output stream once the writing has completed or when an exception occurs. --- smali/src/main/java/org/jf/smali/Smali.java | 93 +++++++++++---------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/smali/src/main/java/org/jf/smali/Smali.java b/smali/src/main/java/org/jf/smali/Smali.java index f701c5c5..7f3762af 100644 --- a/smali/src/main/java/org/jf/smali/Smali.java +++ b/smali/src/main/java/org/jf/smali/Smali.java @@ -147,59 +147,62 @@ public class Smali { private static boolean assembleSmaliFile(File smaliFile, DexBuilder dexBuilder, SmaliOptions options) throws Exception { - CommonTokenStream tokens; + FileInputStream fis = null; + try { + fis = new FileInputStream(smaliFile); + InputStreamReader reader = new InputStreamReader(fis, "UTF-8"); - LexerErrorInterface lexer; + LexerErrorInterface lexer = new smaliFlexLexer(reader); + ((smaliFlexLexer)lexer).setSourceFile(smaliFile); + CommonTokenStream tokens = new CommonTokenStream((TokenSource)lexer); - FileInputStream fis = new FileInputStream(smaliFile); - InputStreamReader reader = new InputStreamReader(fis, "UTF-8"); + if (options.printTokens) { + tokens.getTokens(); - lexer = new smaliFlexLexer(reader); - ((smaliFlexLexer)lexer).setSourceFile(smaliFile); - tokens = new CommonTokenStream((TokenSource)lexer); + for (int i=0; i 0 || lexer.getNumberOfSyntaxErrors() > 0) { + return false; + } + + CommonTree t = result.getTree(); + + CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t); + treeStream.setTokenStream(tokens); + + if (options.printTokens) { + System.out.println(t.toStringTree()); + } + + smaliTreeWalker dexGen = new smaliTreeWalker(treeStream); + dexGen.setApiLevel(options.apiLevel); + + dexGen.setVerboseErrors(options.verboseErrors); + dexGen.setDexBuilder(dexBuilder); + dexGen.smali_file(); + + return dexGen.getNumberOfSyntaxErrors() == 0; + } finally { + if (fis != null) { + fis.close(); + } } - - smaliParser parser = new smaliParser(tokens); - parser.setVerboseErrors(options.verboseErrors); - parser.setAllowOdex(options.allowOdexOpcodes); - parser.setApiLevel(options.apiLevel); - - smaliParser.smali_file_return result = parser.smali_file(); - - if (parser.getNumberOfSyntaxErrors() > 0 || lexer.getNumberOfSyntaxErrors() > 0) { - return false; - } - - CommonTree t = result.getTree(); - - CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t); - treeStream.setTokenStream(tokens); - - if (options.printTokens) { - System.out.println(t.toStringTree()); - } - - smaliTreeWalker dexGen = new smaliTreeWalker(treeStream); - dexGen.setApiLevel(options.apiLevel); - - dexGen.setVerboseErrors(options.verboseErrors); - dexGen.setDexBuilder(dexBuilder); - dexGen.smali_file(); - - return dexGen.getNumberOfSyntaxErrors() == 0; } }