Program: 21207
Project: 21207
Buggy source:
/** 
 * Sucht in dem übergebenen vector nach weiteren decryptbaren Links und decrypted diese
 * @param decryptedLinks
 * @return
 */
private boolean deepDecrypt(ArrayList<DownloadLink> decryptedLinks){
  if (decryptedLinks.isEmpty())   return false;
  final Vector<DownloadLink> newdecryptedLinks=new Vector<DownloadLink>();
class DThread extends Thread implements JDRunnable {
    private DownloadLink link=null;
    public DThread(    DownloadLink link){
      this.link=link;
    }
    public void run(){
      String url=link.getDownloadURL();
      if (url != null) {
        url=HTMLParser.getHttpLinkList(url);
        try {
          url=URLDecoder.decode(url,"String_Node_Str");
        }
 catch (        Exception e) {
          logger.warning("String_Node_Str");
        }
      }
      boolean coulddecrypt=false;
      for (      DecryptPluginWrapper pDecrypt : DecryptPluginWrapper.getDecryptWrapper()) {
        if (pDecrypt.usePlugin() && pDecrypt.canHandle(url)) {
          try {
            PluginForDecrypt plg=(PluginForDecrypt)pDecrypt.getNewPluginInstance();
            CryptedLink[] decryptableLinks=plg.getDecryptableLinks(url);
            url=plg.cutMatches(url);
            for (            CryptedLink cLink : decryptableLinks) {
              cLink.setDecrypterPassword(link.getDecrypterPassword());
            }
            ArrayList<DownloadLink> dLinks=plg.decryptLinks(decryptableLinks);
            for (            DownloadLink dLink : dLinks) {
              dLink.addSourcePluginPasswords(link.getSourcePluginPasswords());
            }
            coulddecrypt=true;
            if (dLinks != null && dLinks.size() > 0) {
              newdecryptedLinks.addAll(dLinks);
            }
            break;
          }
 catch (          Exception e) {
            e.printStackTrace();
          }
        }
      }
      if (coulddecrypt == false) {
        newdecryptedLinks.add(link);
      }
    }
    public void go() throws Exception {
      run();
    }
  }
  Jobber decryptJobbers=new Jobber(4);
  for (int b=decryptedLinks.size() - 1; b >= 0; b--) {
    DThread dthread=new DThread(decryptedLinks.get(b));
    decryptJobbers.add(dthread);
  }
  int todo=decryptJobbers.getJobsAdded();
  decryptJobbers.start();
  while (decryptJobbers.getJobsFinished() != todo) {
    try {
      Thread.sleep(200);
    }
 catch (    InterruptedException e) {
    }
  }
  boolean hasdeep=decryptedLinks.size() != newdecryptedLinks.size();
  decryptedLinks.clear();
  decryptedLinks.addAll(newdecryptedLinks);
  return hasdeep;
}

Fixed version (ground truth):
/** 
 * Sucht in dem übergebenen vector nach weiteren decryptbaren Links und decrypted diese
 * @param decryptedLinks
 * @return
 */
private boolean deepDecrypt(ArrayList<DownloadLink> decryptedLinks){
  if (decryptedLinks.isEmpty())   return false;
  final Vector<DownloadLink> newdecryptedLinks=new Vector<DownloadLink>();
  final Vector<DownloadLink> notdecryptedLinks=new Vector<DownloadLink>();
class DThread extends Thread implements JDRunnable {
    private DownloadLink link=null;
    public DThread(    DownloadLink link){
      this.link=link;
    }
    public void run(){
      String url=link.getDownloadURL();
      if (url != null) {
        url=HTMLParser.getHttpLinkList(url);
        try {
          url=URLDecoder.decode(url,"String_Node_Str");
        }
 catch (        Exception e) {
          logger.warning("String_Node_Str");
        }
      }
      boolean coulddecrypt=false;
      for (      DecryptPluginWrapper pDecrypt : DecryptPluginWrapper.getDecryptWrapper()) {
        if (pDecrypt.usePlugin() && pDecrypt.canHandle(url)) {
          try {
            PluginForDecrypt plg=(PluginForDecrypt)pDecrypt.getNewPluginInstance();
            CryptedLink[] decryptableLinks=plg.getDecryptableLinks(url);
            url=plg.cutMatches(url);
            for (            CryptedLink cLink : decryptableLinks) {
              cLink.setDecrypterPassword(link.getDecrypterPassword());
            }
            ArrayList<DownloadLink> dLinks=plg.decryptLinks(decryptableLinks);
            for (            DownloadLink dLink : dLinks) {
              dLink.addSourcePluginPasswords(link.getSourcePluginPasswords());
            }
            coulddecrypt=true;
            if (dLinks != null && dLinks.size() > 0) {
              newdecryptedLinks.addAll(dLinks);
            }
            break;
          }
 catch (          Exception e) {
            e.printStackTrace();
          }
        }
      }
      if (coulddecrypt == false) {
        notdecryptedLinks.add(link);
      }
    }
    public void go() throws Exception {
      run();
    }
  }
  Jobber decryptJobbers=new Jobber(4);
  for (int b=decryptedLinks.size() - 1; b >= 0; b--) {
    DThread dthread=new DThread(decryptedLinks.get(b));
    decryptJobbers.add(dthread);
  }
  int todo=decryptJobbers.getJobsAdded();
  decryptJobbers.start();
  while (decryptJobbers.getJobsFinished() != todo) {
    try {
      Thread.sleep(200);
    }
 catch (    InterruptedException e) {
    }
  }
  decryptedLinks.clear();
  decryptedLinks.addAll(newdecryptedLinks);
  decryptedLinks.addAll(notdecryptedLinks);
  return newdecryptedLinks.size() > 0;
}