| Index: sandbox/win/src/broker_services.cc
 | 
| ===================================================================
 | 
| --- sandbox/win/src/broker_services.cc	(revision 155197)
 | 
| +++ sandbox/win/src/broker_services.cc	(working copy)
 | 
| @@ -12,6 +12,7 @@
 | 
|  #include "base/win/startup_information.h"
 | 
|  #include "base/win/windows_version.h"
 | 
|  #include "sandbox/win/src/app_container.h"
 | 
| +#include "sandbox/win/src/process_mitigations.h"
 | 
|  #include "sandbox/win/src/sandbox_policy_base.h"
 | 
|  #include "sandbox/win/src/sandbox.h"
 | 
|  #include "sandbox/win/src/target_process.h"
 | 
| @@ -320,14 +321,51 @@
 | 
|          const_cast<wchar_t*>(desktop.c_str());
 | 
|    }
 | 
|  
 | 
| +  int attribute_count = 0;
 | 
|    const AppContainerAttributes* app_container = policy_base->GetAppContainer();
 | 
| +  if (app_container)
 | 
| +    ++attribute_count;
 | 
| +
 | 
| +  DWORD64 mitigations = GetProcessMitigationPolicyFlags(
 | 
| +                            policy->GetProcessMitigations());
 | 
| +  if (mitigations)
 | 
| +    ++attribute_count;
 | 
| +
 | 
| +  if (!startup_info.InitializeProcThreadAttributeList(attribute_count))
 | 
| +    return SBOX_ERROR_GENERIC;
 | 
| +
 | 
|    if (app_container) {
 | 
| -    startup_info.InitializeProcThreadAttributeList(1);
 | 
|      result = app_container->ShareForStartup(&startup_info);
 | 
|      if (SBOX_ALL_OK != result)
 | 
|        return result;
 | 
|    }
 | 
|  
 | 
| +  if (mitigations) {
 | 
| +#ifndef _WIN64
 | 
| +    // A 64-bit flags attribute is illegal on 32-bit Win 7 and below.
 | 
| +    if (base::win::GetVersion() < base::win::VERSION_WIN8) {
 | 
| +      DWORD mitigations32 = static_cast<DWORD>(mitigations);
 | 
| +      if (!startup_info.UpdateProcThreadAttribute(
 | 
| +               PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY, &mitigations32,
 | 
| +               sizeof(mitigations32))) {
 | 
| +        return SBOX_ERROR_GENERIC;
 | 
| +      }
 | 
| +    } else {
 | 
| +      if (!startup_info.UpdateProcThreadAttribute(
 | 
| +               PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY, &mitigations,
 | 
| +               sizeof(mitigations))) {
 | 
| +        return SBOX_ERROR_GENERIC;
 | 
| +      }
 | 
| +    }
 | 
| +#else
 | 
| +    if (!startup_info.UpdateProcThreadAttribute(
 | 
| +              PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY, &mitigations,
 | 
| +              sizeof(mitigations))) {
 | 
| +      return SBOX_ERROR_GENERIC;
 | 
| +    }
 | 
| +#endif
 | 
| +  }
 | 
| +
 | 
|    // Construct the thread pool here in case it is expensive.
 | 
|    // The thread pool is shared by all the targets
 | 
|    if (NULL == thread_pool_)
 | 
| 
 |