• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/common/safe_browsing/zip_analyzer.h"
6 
7 #include "base/logging.h"
8 #include "chrome/common/safe_browsing/download_protection_util.h"
9 #include "third_party/zlib/google/zip_reader.h"
10 
11 namespace safe_browsing {
12 namespace zip_analyzer {
13 
AnalyzeZipFile(base::PlatformFile zip_file,Results * results)14 void AnalyzeZipFile(base::PlatformFile zip_file, Results* results) {
15   zip::ZipReader reader;
16   if (!reader.OpenFromPlatformFile(zip_file)) {
17     VLOG(1) << "Failed to open zip file";
18     return;
19   }
20 
21   bool advanced = true;
22   for (; reader.HasMore(); advanced = reader.AdvanceToNextEntry()) {
23     if (!advanced) {
24       VLOG(1) << "Could not advance to next entry, aborting zip scan.";
25       return;
26     }
27     if (!reader.OpenCurrentEntryInZip()) {
28       VLOG(1) << "Failed to open current entry in zip file";
29       continue;
30     }
31     const base::FilePath& file = reader.current_entry_info()->file_path();
32     if (download_protection_util::IsBinaryFile(file)) {
33       // Don't consider an archived archive to be executable, but record
34       // a histogram.
35       if (download_protection_util::IsArchiveFile(file)) {
36         results->has_archive = true;
37       } else {
38         VLOG(2) << "Downloaded a zipped executable: " << file.value();
39         results->has_executable = true;
40         break;
41       }
42     } else {
43       VLOG(3) << "Ignoring non-binary file: " << file.value();
44     }
45   }
46   results->success = true;
47 }
48 
49 }  // namespace zip_analyzer
50 }  // namespace safe_browsing
51