Program: 98323
Project: 98323
Buggy source:
/** 
 * Extract an entry from the archive. This method assumes that the tarIn stream has been properly set with a call to getNextEntry().
 * @param destDir The destination directory into which to extract.
 * @param entry The TarEntry returned by tarIn.getNextEntry().
 */
private void extractEntry(File destDir,TarEntry entry) throws IOException {
  if (this.verbose) {
    if (this.progressDisplay != null)     this.progressDisplay.showTarProgressMessage(entry.getName());
  }
  String name=entry.getName();
  name=name.replace('/',File.separatorChar);
  File destFile=new File(destDir,name);
  if (entry.isSymbolicLink()) {
    try {
      Runtime rt=Runtime.getRuntime();
      Process process=rt.exec("String_Node_Str");
      DataOutputStream os=new DataOutputStream(process.getOutputStream());
      String command="String_Node_Str" + entry.header.linkName.toString() + "String_Node_Str"+ destDir+ name;
      os.writeBytes(command + "String_Node_Str");
      os.flush();
      os.writeBytes("String_Node_Str");
      os.flush();
      process.waitFor();
    }
 catch (    IOException e) {
      throw new RuntimeException(e);
    }
catch (    InterruptedException e) {
      throw new RuntimeException(e);
    }
  }
 else   if (entry.isDirectory()) {
    if (!destFile.exists()) {
      if (!destFile.mkdirs()) {
        throw new IOException("String_Node_Str" + destFile.getPath() + "String_Node_Str");
      }
    }
  }
 else {
    File subDir=new File(destFile.getParent());
    if (!subDir.exists()) {
      if (!subDir.mkdirs()) {
        throw new IOException("String_Node_Str" + subDir.getPath() + "String_Node_Str");
      }
    }
    if (this.keepOldFiles && destFile.exists()) {
      if (this.verbose) {
        if (this.progressDisplay != null)         this.progressDisplay.showTarProgressMessage("String_Node_Str" + entry.getName());
      }
    }
 else {
      boolean asciiTrans=false;
      FileOutputStream out=new FileOutputStream(destFile);
      if (this.asciiTranslate) {
        MimeType mime=null;
        String contentType=null;
        try {
          contentType=FileTypeMap.getDefaultFileTypeMap().getContentType(destFile);
          mime=new MimeType(contentType);
          if (mime.getPrimaryType().equalsIgnoreCase("String_Node_Str")) {
            asciiTrans=true;
          }
 else           if (this.transTyper != null) {
            if (this.transTyper.isAsciiFile(entry.getName())) {
              asciiTrans=true;
            }
          }
        }
 catch (        MimeTypeParseException ex) {
        }
        if (this.debug) {
          System.err.println("String_Node_Str" + asciiTrans + "String_Node_Str"+ contentType+ "String_Node_Str"+ mime.getPrimaryType()+ "String_Node_Str");
        }
      }
      PrintWriter outw=null;
      if (asciiTrans) {
        outw=new PrintWriter(out);
      }
      byte[] rdbuf=new byte[32 * 1024];
      for (; ; ) {
        int numRead=this.tarIn.read(rdbuf);
        if (numRead == -1)         break;
        if (asciiTrans) {
          for (int off=0, b=0; b < numRead; ++b) {
            if (rdbuf[b] == 10) {
              String s=new String(rdbuf,off,(b - off));
              outw.println(s);
              off=b + 1;
            }
          }
        }
 else {
          out.write(rdbuf,0,numRead);
        }
      }
      if (asciiTrans)       outw.close();
 else       out.close();
    }
  }
}

Fixed version (ground truth):
/** 
 * Extract an entry from the archive. This method assumes that the tarIn stream has been properly set with a call to getNextEntry().
 * @param destDir The destination directory into which to extract.
 * @param entry The TarEntry returned by tarIn.getNextEntry().
 */
private void extractEntry(File destDir,TarEntry entry) throws IOException {
  if (this.verbose) {
    if (this.progressDisplay != null)     this.progressDisplay.showTarProgressMessage(entry.getName());
  }
  String name=entry.getName();
  name=name.replace('/',File.separatorChar);
  File destFile=new File(destDir,name);
  if (entry.isSymbolicLink()) {
    try {
      Runtime rt=Runtime.getRuntime();
      Process process=rt.exec("String_Node_Str");
      DataOutputStream os=new DataOutputStream(process.getOutputStream());
      String command="String_Node_Str" + entry.header.linkName.toString() + "String_Node_Str"+ destDir+ name;
      os.writeBytes(command + "String_Node_Str");
      os.flush();
      os.writeBytes("String_Node_Str");
      os.flush();
      process.waitFor();
    }
 catch (    IOException e) {
      throw new RuntimeException(e);
    }
catch (    InterruptedException e) {
      throw new RuntimeException(e);
    }
  }
 else   if (entry.isDirectory()) {
    if (!destFile.exists()) {
      if (!destFile.mkdirs()) {
        throw new IOException("String_Node_Str" + destFile.getPath() + "String_Node_Str");
      }
    }
  }
 else {
    File subDir=new File(destFile.getParent());
    if (!subDir.exists()) {
      if (!subDir.mkdirs()) {
        throw new IOException("String_Node_Str" + subDir.getPath() + "String_Node_Str");
      }
    }
    if (this.keepOldFiles && destFile.exists()) {
      if (this.verbose) {
        if (this.progressDisplay != null)         this.progressDisplay.showTarProgressMessage("String_Node_Str" + entry.getName());
      }
    }
 else {
      try {
        boolean asciiTrans=false;
        FileOutputStream out=new FileOutputStream(destFile);
        if (this.asciiTranslate) {
          MimeType mime=null;
          String contentType=null;
          try {
            contentType=FileTypeMap.getDefaultFileTypeMap().getContentType(destFile);
            mime=new MimeType(contentType);
            if (mime.getPrimaryType().equalsIgnoreCase("String_Node_Str")) {
              asciiTrans=true;
            }
 else             if (this.transTyper != null) {
              if (this.transTyper.isAsciiFile(entry.getName())) {
                asciiTrans=true;
              }
            }
          }
 catch (          MimeTypeParseException ex) {
          }
          if (this.debug) {
            System.err.println("String_Node_Str" + asciiTrans + "String_Node_Str"+ contentType+ "String_Node_Str"+ mime.getPrimaryType()+ "String_Node_Str");
          }
        }
        PrintWriter outw=null;
        if (asciiTrans) {
          outw=new PrintWriter(out);
        }
        byte[] rdbuf=new byte[32 * 1024];
        for (; ; ) {
          int numRead=this.tarIn.read(rdbuf);
          if (numRead == -1)           break;
          if (asciiTrans) {
            for (int off=0, b=0; b < numRead; ++b) {
              if (rdbuf[b] == 10) {
                String s=new String(rdbuf,off,(b - off));
                outw.println(s);
                off=b + 1;
              }
            }
          }
 else {
            out.write(rdbuf,0,numRead);
          }
        }
        if (asciiTrans)         outw.close();
 else         out.close();
      }
 catch (      IOException e) {
        e.printStackTrace();
      }
    }
  }
}