Program: 61903
Project: 61903
Buggy source:
/** 
 * Reads list of actions from the stream. Reading ends with ActionEndFlag(=0) or end of the stream.
 * @param listeners
 * @param containerSWFOffset
 * @param mis
 * @param version
 * @param ip
 * @param endIp
 * @param path
 * @return List of actions
 * @throws IOException
 */
public static List<Action> readActionList(List<DisassemblyListener> listeners,long containerSWFOffset,MemoryInputStream mis,int version,int ip,int endIp,String path) throws IOException, InterruptedException {
  boolean deobfuscate=Configuration.autoDeobfuscate.get();
  ConstantPool cpool=new ConstantPool();
  SWFInputStream sis=new SWFInputStream(mis,version);
  List<Action> actionMap=new ArrayList<>();
  List<Long> nextOffsets=new ArrayList<>();
  Action entryAction=readActionListAtPos(listeners,containerSWFOffset,cpool,sis,actionMap,nextOffsets,ip,ip,endIp,version,path,false,new ArrayList<Long>());
  Map<Action,List<Action>> containerLastActions=new HashMap<>();
  getContainerLastActions(actionMap,containerLastActions);
  List<Action> actions=new ArrayList<>();
  int index=getNextNotNullIndex(actionMap,0);
  if (index != -1 && entryAction != actionMap.get(index)) {
    ActionJump jump=new ActionJump(0);
    int size=getTotalActionLength(jump);
    jump.setJumpOffset((int)(entryAction.getAddress() - size));
    actions.add(jump);
  }
  index=getNextNotNullIndex(actionMap,index);
  while (index > -1) {
    Action action=actionMap.get(index);
    long nextOffset=nextOffsets.get(index);
    int nextIndex=getNextNotNullIndex(actionMap,index + 1);
    actions.add(action);
    if (nextIndex != -1 && nextOffset != nextIndex) {
      if (!action.isExit() && !(action instanceof ActionJump)) {
        ActionJump jump=new ActionJump(0);
        jump.setAddress(action.getAddress(),version);
        int size=getTotalActionLength(jump);
        jump.setJumpOffset((int)(nextOffset - action.getAddress() - size));
        actions.add(jump);
      }
    }
    index=nextIndex;
  }
  Map<Action,Action> jumps=new HashMap<>();
  getJumps(actions,jumps);
  long endAddress=updateAddresses(actions,ip,version);
  Action lastAction=actions.get(actions.size() - 1);
  Action aEnd=new ActionEnd();
  if (!(lastAction instanceof ActionEnd)) {
    aEnd.setAddress(endAddress,version);
    actions.add(aEnd);
  }
 else {
    endAddress-=getTotalActionLength(aEnd);
  }
  updateJumps(actions,jumps,containerLastActions,endAddress,version);
  updateActionStores(actions,jumps);
  updateContainerSizes(actions,containerLastActions);
  updateActionLengths(actions,version);
  if (deobfuscate) {
    try {
      actions=deobfuscateActionList(listeners,containerSWFOffset,actions,version,ip,path);
      updateActionLengths(actions,version);
      removeZeroJumps(actions,version);
    }
 catch (    TranslateException ex) {
      Logger.getLogger(ActionListReader.class.getName()).log(Level.SEVERE,null,ex);
    }
  }
  return actions;
}

Fixed version (ground truth):
/** 
 * Reads list of actions from the stream. Reading ends with ActionEndFlag(=0) or end of the stream.
 * @param listeners
 * @param containerSWFOffset
 * @param mis
 * @param version
 * @param ip
 * @param endIp
 * @param path
 * @return List of actions
 * @throws IOException
 */
public static List<Action> readActionList(List<DisassemblyListener> listeners,long containerSWFOffset,MemoryInputStream mis,int version,int ip,int endIp,String path) throws IOException, InterruptedException {
  boolean deobfuscate=Configuration.autoDeobfuscate.get();
  ConstantPool cpool=new ConstantPool();
  SWFInputStream sis=new SWFInputStream(mis,version);
  List<Action> actionMap=new ArrayList<>();
  List<Long> nextOffsets=new ArrayList<>();
  Action entryAction=readActionListAtPos(listeners,containerSWFOffset,cpool,sis,actionMap,nextOffsets,ip,ip,endIp,version,path,false,new ArrayList<Long>());
  Map<Action,List<Action>> containerLastActions=new HashMap<>();
  getContainerLastActions(actionMap,containerLastActions);
  List<Action> actions=new ArrayList<>();
  int index=getNextNotNullIndex(actionMap,0);
  if (index != -1 && entryAction != actionMap.get(index)) {
    ActionJump jump=new ActionJump(0);
    int size=getTotalActionLength(jump);
    jump.setJumpOffset((int)(entryAction.getAddress() - size));
    actions.add(jump);
  }
  index=getNextNotNullIndex(actionMap,index);
  while (index > -1) {
    Action action=actionMap.get(index);
    long nextOffset=nextOffsets.get(index);
    int nextIndex=getNextNotNullIndex(actionMap,index + 1);
    actions.add(action);
    if (nextIndex != -1 && nextOffset != nextIndex) {
      if (!action.isExit() && !(action instanceof ActionJump)) {
        ActionJump jump=new ActionJump(0);
        jump.setAddress(action.getAddress(),version);
        int size=getTotalActionLength(jump);
        jump.setJumpOffset((int)(nextOffset - action.getAddress() - size));
        actions.add(jump);
      }
    }
    index=nextIndex;
  }
  Map<Action,Action> jumps=new HashMap<>();
  getJumps(actions,jumps);
  long endAddress=updateAddresses(actions,ip,version);
  Action lastAction=actions.get(actions.size() - 1);
  Action aEnd=new ActionEnd();
  if (!(lastAction instanceof ActionEnd)) {
    aEnd.setAddress(endAddress,version);
    actions.add(aEnd);
  }
 else {
    endAddress-=getTotalActionLength(aEnd);
  }
  updateJumps(actions,jumps,containerLastActions,endAddress,version);
  updateActionStores(actions,jumps);
  updateContainerSizes(actions,containerLastActions);
  updateActionLengths(actions,version);
  if (deobfuscate) {
    try {
      actions=deobfuscateActionList(listeners,containerSWFOffset,actions,version,ip,path);
      updateActionLengths(actions,version);
      removeZeroJumps(actions,version);
    }
 catch (    OutOfMemoryError|StackOverflowError|TranslateException ex) {
      Logger.getLogger(ActionListReader.class.getName()).log(Level.SEVERE,null,ex);
    }
  }
  return actions;
}