Program: 3671
Project: 3671
Buggy source:
/** 
 * Scan a zipfile for matching file path patterns. (Does not recurse into zipfiles within zipfiles.)
 */
private void scanZipfile(final String zipfilePath,final ZipFile zipFile,final long zipFileLastModified,final boolean scanTimestampsOnly) throws IOException {
  boolean timestampWarning=false;
  for (final Enumeration<? extends ZipEntry> entries=zipFile.entries(); entries.hasMoreElements(); ) {
    final ZipEntry entry=entries.nextElement();
    if (!entry.isDirectory()) {
      final String path=entry.getName();
      boolean scanFile=false;
      for (      final String whitelistedPath : whitelistedPathsToScan) {
        if (path.startsWith(whitelistedPath) || whitelistedPath.equals("String_Node_Str")) {
          scanFile=true;
          break;
        }
      }
      for (      final String blacklistedPath : blacklistedPathsToScan) {
        if (path.startsWith(blacklistedPath)) {
          scanFile=false;
          break;
        }
      }
      if (scanFile) {
        final long entryTime=USE_ZIPFILE_ENTRY_MODIFICATION_TIMES ? entry.getTime() : zipFileLastModified;
        lastModified=Math.max(lastModified,entryTime);
        if (entryTime > System.currentTimeMillis() && !timestampWarning) {
          final String msg=zipfilePath + "String_Node_Str";
          System.err.println(msg);
          timestampWarning=true;
        }
        if (!scanTimestampsOnly) {
          if (path.endsWith("String_Node_Str")) {
            try (final InputStream inputStream=zipFile.getInputStream(entry)){
              readClassInfoFromClassfileHeader(inputStream);
            }
             if (classNameToClassfileHash != null) {
              try (final InputStream inputStream=zipFile.getInputStream(entry)){
                hashInputStream(path.substring(0,path.length() - 6).replace('/','.'),inputStream);
              }
             }
          }
 else {
            for (            final FilePathMatcher fileMatcher : filePathMatchers) {
              if (fileMatcher.pattern.matcher(path).matches()) {
                try (final InputStream inputStream=zipFile.getInputStream(entry)){
                  fileMatcher.fileMatchProcessor.processMatch(path,path,inputStream);
                }
               }
            }
          }
        }
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Scan a zipfile for matching file path patterns. (Does not recurse into zipfiles within zipfiles.)
 */
private void scanZipfile(final String zipfilePath,final ZipFile zipFile,final long zipFileLastModified,final boolean scanTimestampsOnly) throws IOException {
  boolean timestampWarning=false;
  for (final Enumeration<? extends ZipEntry> entries=zipFile.entries(); entries.hasMoreElements(); ) {
    final ZipEntry entry=entries.nextElement();
    if (!entry.isDirectory()) {
      final String path=entry.getName();
      boolean scanFile=false;
      for (      final String whitelistedPath : whitelistedPathsToScan) {
        if (path.startsWith(whitelistedPath) || whitelistedPath.equals("String_Node_Str")) {
          scanFile=true;
          break;
        }
      }
      for (      final String blacklistedPath : blacklistedPathsToScan) {
        if (path.startsWith(blacklistedPath)) {
          scanFile=false;
          break;
        }
      }
      if (scanFile) {
        final long entryTime=USE_ZIPFILE_ENTRY_MODIFICATION_TIMES ? entry.getTime() : zipFileLastModified;
        lastModified=Math.max(lastModified,entryTime);
        if (entryTime > System.currentTimeMillis() && !timestampWarning) {
          final String msg=zipfilePath + "String_Node_Str";
          System.err.println(msg);
          timestampWarning=true;
        }
        if (!scanTimestampsOnly) {
          if (path.endsWith("String_Node_Str")) {
            try (final InputStream inputStream=zipFile.getInputStream(entry)){
              readClassInfoFromClassfileHeader(inputStream);
            }
             if (classNameToClassfileHash != null) {
              try (final InputStream inputStream=zipFile.getInputStream(entry)){
                hashInputStream(path.substring(0,path.length() - 6).replace('/','.'),inputStream);
              }
             }
          }
          for (          final FilePathMatcher fileMatcher : filePathMatchers) {
            if (fileMatcher.pattern.matcher(path).matches()) {
              try (final InputStream inputStream=zipFile.getInputStream(entry)){
                fileMatcher.fileMatchProcessor.processMatch(path,path,inputStream);
              }
             }
          }
        }
      }
    }
  }
}