| Index: tools/checkbins/checkbins.py
|
| ===================================================================
|
| --- tools/checkbins/checkbins.py (revision 110937)
|
| +++ tools/checkbins/checkbins.py (working copy)
|
| @@ -1,13 +1,13 @@
|
| -#!/usr/bin/python
|
| -# Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +#!/usr/bin/env python
|
| +# Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| # Use of this source code is governed by a BSD-style license that can be
|
| # found in the LICENSE file.
|
|
|
| """Makes sure that all EXE and DLL files in the provided directory were built
|
| correctly.
|
|
|
| -Currently this tool will check that binaries were built with /NXCOMPAT and
|
| -/DYNAMICBASE set.
|
| +In essense it runs a subset of BinScope tests ensuring that binaries have
|
| +/NXCOMPAT, /DYNAMICBASE and /SAFESEH.
|
| """
|
|
|
| import os
|
| @@ -22,6 +22,7 @@
|
| PE_FILE_EXTENSIONS = ['.exe', '.dll']
|
| DYNAMICBASE_FLAG = 0x0040
|
| NXCOMPAT_FLAG = 0x0100
|
| +NO_SEH_FLAG = 0x0400
|
|
|
| # Please do not add your file here without confirming that it indeed doesn't
|
| # require /NXCOMPAT and /DYNAMICBASE. Contact cpu@chromium.org or your local
|
| @@ -45,6 +46,8 @@
|
| if not IsPEFile(path):
|
| continue
|
| pe = pefile.PE(path, fast_load=True)
|
| + pe.parse_data_directories(directories=[
|
| + pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG']])
|
| pe_total = pe_total + 1
|
| success = True
|
|
|
| @@ -64,6 +67,22 @@
|
| success = False
|
| print "Checking %s for /NXCOMPAT... FAIL" % path
|
|
|
| + # Check for /SAFESEH. Binaries should either have no SEH table
|
| + # (in which case a bit is set in the DLL characteristics section)
|
| + # or there should be a LOAD_CONFIG section present containing
|
| + # a valid SEH table.
|
| + if (pe.OPTIONAL_HEADER.DllCharacteristics & NO_SEH_FLAG or
|
| + (hasattr(pe, "DIRECTORY_ENTRY_LOAD_CONFIG") and
|
| + pe.DIRECTORY_ENTRY_LOAD_CONFIG.struct.SEHandlerCount > 0 and
|
| + pe.DIRECTORY_ENTRY_LOAD_CONFIG.struct.SEHandlerTable != 0)):
|
| + if options.verbose:
|
| + print "Checking %s for /SAFESEH... PASS" % path
|
| + else:
|
| + # TODO(scherkus): uncomment this code after we're confident that we
|
| + # won't cause unintentional failures on the build bots.
|
| + #success = False
|
| + print "Checking %s for /SAFESEH... FAIL" % path
|
| +
|
| # Update tally.
|
| if success:
|
| pe_passed = pe_passed + 1
|
|
|