Program: 21228
Project: 21228
Buggy source:
private boolean extract(){
  fireEvent(JDUnrarConstants.WRAPPER_START_EXTRACTION);
  Executer exec=new Executer(unrarCommand);
  exec.setDebug(DEBUG);
  exec.addParameter("String_Node_Str");
  exec.addParameter("String_Node_Str");
  if (overwriteFiles) {
    exec.addParameter("String_Node_Str");
  }
 else {
    exec.addParameter("String_Node_Str");
  }
  exec.addParameter("String_Node_Str");
  exec.addParameter("String_Node_Str");
  exec.addParameter("String_Node_Str");
  exec.addParameter(file.getAbsolutePath());
  if (extractTo != null) {
    extractTo.mkdirs();
    exec.setRunin(extractTo.getAbsolutePath());
  }
 else {
    exec.setRunin(file.getParentFile().getAbsolutePath());
  }
  exec.setWaitTimeout(-1);
  exec.addProcessListener(new ExtractListener(),Executer.LISTENER_ERRORSTREAM | Executer.LISTENER_ERRORSTREAM);
  exec.addProcessListener(new PasswordListener(password),Executer.LISTENER_ERRORSTREAM);
  exec.start();
  this.startTime=System.currentTimeMillis();
  Thread inter=new Thread(){
    public void run(){
      while (true) {
        if (!exactProgress) {
          if (!exactProgress) {
            long est=speed * ((System.currentTimeMillis() - startTime) / 1000);
            for (            ArchivFile f : files) {
              long part=Math.min(est,f.getSize());
              est-=part;
              if (part == 0 && f.getSize() == 0) {
                f.setPercent(100);
              }
 else {
                f.setPercent((int)((part * 100) / f.getSize()));
              }
              if (est <= 0)               break;
            }
            fireEvent(JDUnrarConstants.WRAPPER_ON_PROGRESS);
          }
 else {
            return;
          }
        }
        try {
          Thread.sleep(1000);
        }
 catch (        InterruptedException e) {
          return;
        }
      }
    }
  }
;
  statusid=-1;
  inter.start();
  exec.waitTimeout();
  inter.interrupt();
  config.setProperty("String_Node_Str",speed);
  config.save();
  if (statusid > 0)   return false;
  return true;
}

Fixed version (ground truth):
private boolean extract(){
  fireEvent(JDUnrarConstants.WRAPPER_START_EXTRACTION);
  Executer exec=new Executer(unrarCommand);
  exec.setCodepage(JDUnrar.CODEPAGE);
  exec.setDebug(DEBUG);
  exec.addParameter("String_Node_Str");
  exec.addParameter("String_Node_Str");
  if (overwriteFiles) {
    exec.addParameter("String_Node_Str");
  }
 else {
    exec.addParameter("String_Node_Str");
  }
  exec.addParameter("String_Node_Str");
  exec.addParameter("String_Node_Str");
  exec.addParameter("String_Node_Str");
  exec.addParameter(file.getAbsolutePath());
  if (extractTo != null) {
    extractTo.mkdirs();
    exec.setRunin(extractTo.getAbsolutePath());
  }
 else {
    exec.setRunin(file.getParentFile().getAbsolutePath());
  }
  exec.setWaitTimeout(-1);
  exec.addProcessListener(new ExtractListener(),Executer.LISTENER_ERRORSTREAM | Executer.LISTENER_ERRORSTREAM);
  exec.addProcessListener(new PasswordListener(password),Executer.LISTENER_ERRORSTREAM);
  exec.start();
  this.startTime=System.currentTimeMillis();
  Thread inter=new Thread(){
    public void run(){
      while (true) {
        if (!exactProgress) {
          if (!exactProgress) {
            long est=speed * ((System.currentTimeMillis() - startTime) / 1000);
            for (            ArchivFile f : files) {
              long part=Math.min(est,f.getSize());
              est-=part;
              if (part == 0 && f.getSize() == 0) {
                f.setPercent(100);
              }
 else {
                f.setPercent((int)((part * 100) / f.getSize()));
              }
              if (est <= 0)               break;
            }
            fireEvent(JDUnrarConstants.WRAPPER_ON_PROGRESS);
          }
 else {
            return;
          }
        }
        try {
          Thread.sleep(1000);
        }
 catch (        InterruptedException e) {
          return;
        }
      }
    }
  }
;
  statusid=-1;
  inter.start();
  exec.waitTimeout();
  inter.interrupt();
  config.setProperty("String_Node_Str",speed);
  config.save();
  if (statusid > 0)   return false;
  return true;
}