do not use line info in block (obfuscated SWFs break it)

Issue #961 Final process fix
This commit is contained in:
Jindra Petřík
2015-07-10 19:52:29 +02:00
parent 68820fda7a
commit 8a154b48e0
2 changed files with 11 additions and 2 deletions

View File

@@ -537,7 +537,7 @@ public class Graph {
if (exprLine > 0) {
List<GraphTargetItem> forFirstCommands = new ArrayList<>();
for (int j = i - 1; j >= 0; j--) {
if (list.get(j).getLine() == exprLine) {
if (list.get(j).getLine() == exprLine && !(list.get(j) instanceof LoopItem /*to avoid recursion and StackOverflow*/)) {
forFirstCommands.add(0, list.get(j));
removeFromList.add(j);
} else {
@@ -571,6 +571,11 @@ public class Graph {
}
}
if (!forFirstCommands.isEmpty() || !forFinalCommands.isEmpty()) {
//Do not allow more than 2 first/final commands, since it can be obfuscated
if (forFirstCommands.size() > 2 || forFinalCommands.size() > 2) {
removeFromList.clear();
whi.commands.addAll(forFinalCommands); //put it back
}
if (whi.commands.isEmpty() && forFirstCommands.isEmpty()) {
//it would be for(;expr;commands) {} which looks better as while(expr){commands}
whi.commands.addAll(forFinalCommands); //put it back

View File

@@ -347,13 +347,17 @@ public abstract class GraphTargetItem implements Serializable, Cloneable {
}
public GraphTextWriter appendBlock(GraphTargetItem prevLineItem, GraphTextWriter writer, LocalData localData, List<GraphTargetItem> commands) throws InterruptedException {
//This may be useful in the future, but we must handle obfuscated SWFs where there is only one debugline instruction on the beggining.
final boolean useLineInfo = false;
int prevLine = prevLineItem == null ? 0 : prevLineItem.getLine();
writer.startBlock();
boolean first = true;
for (GraphTargetItem ti : commands) {
if (!ti.isEmpty()) {
//Use stored line information if available to place commands on same line
if (!first && (ti.getLine() < 1 || prevLine < 1 || (prevLine >= 1 && prevLine != ti.getLine()))) {
if (!first && (!useLineInfo || (ti.getLine() < 1 || prevLine < 1 || (prevLine >= 1 && prevLine != ti.getLine())))) {
writer.newLine();
}
prevLine = ti.getLine();