Chromium Code Reviews| Index: sandbox/win/src/sandbox_policy_base.cc |
| diff --git a/sandbox/win/src/sandbox_policy_base.cc b/sandbox/win/src/sandbox_policy_base.cc |
| index 6df2cb3d3819d33c2e742efdc441192de16ca996..57232b1de779fd3ef0ba1361747508b8522d1852 100644 |
| --- a/sandbox/win/src/sandbox_policy_base.cc |
| +++ b/sandbox/win/src/sandbox_policy_base.cc |
| @@ -547,7 +547,8 @@ ResultCode PolicyBase::MakeJobObject(HANDLE* job) { |
| return SBOX_ALL_OK; |
| } |
| -ResultCode PolicyBase::MakeTokens(HANDLE* initial, HANDLE* lockdown) { |
| +ResultCode PolicyBase::MakeTokens(base::win::ScopedHandle* initial, |
| + base::win::ScopedHandle* lockdown) { |
| if (appcontainer_list_.get() && appcontainer_list_->HasAppContainer() && |
| lowbox_sid_) { |
| return SBOX_ERROR_BAD_PARAMS; |
| @@ -555,11 +556,14 @@ ResultCode PolicyBase::MakeTokens(HANDLE* initial, HANDLE* lockdown) { |
| // Create the 'naked' token. This will be the permanent token associated |
| // with the process and therefore with any thread that is not impersonating. |
| - DWORD result = CreateRestrictedToken(lockdown, lockdown_level_, |
| + HANDLE temp_handle; |
| + DWORD result = CreateRestrictedToken(&temp_handle, lockdown_level_, |
| integrity_level_, PRIMARY); |
| if (ERROR_SUCCESS != result) |
| return SBOX_ERROR_GENERIC; |
| + lockdown->Set(temp_handle); |
| + |
| // If we're launching on the alternate desktop we need to make sure the |
| // integrity label on the object is no higher than the sandboxed process's |
| // integrity level. So, we lower the label on the desktop process if it's |
| @@ -590,9 +594,11 @@ ResultCode PolicyBase::MakeTokens(HANDLE* initial, HANDLE* lockdown) { |
| if (lockdown_level_ < USER_LIMITED || lockdown_level_ != initial_level_) |
| return SBOX_ERROR_CANNOT_INIT_APPCONTAINER; |
| - *initial = INVALID_HANDLE_VALUE; |
| + *initial = base::win::ScopedHandle(); |
| return SBOX_ALL_OK; |
| - } else if (lowbox_sid_) { |
| + } |
| + |
| + if (lowbox_sid_) { |
|
Will Harris
2015/07/10 18:11:31
maybe DCHECK that we are not also using AppContain
rvargas (doing something else)
2015/07/10 18:31:56
Do you mean line the if at line 522? :)
Will Harris
2015/07/10 18:45:07
ah yes. :)
|
| NtCreateLowBoxToken CreateLowBoxToken = NULL; |
| ResolveNTFunctionPtr("NtCreateLowBoxToken", &CreateLowBoxToken); |
| OBJECT_ATTRIBUTES obj_attr; |
| @@ -608,7 +614,7 @@ ResultCode PolicyBase::MakeTokens(HANDLE* initial, HANDLE* lockdown) { |
| HANDLE saved_handles[1] = {lowbox_directory_.Get()}; |
| DWORD saved_handles_count = lowbox_directory_.IsValid() ? 1 : 0; |
| - NTSTATUS status = CreateLowBoxToken(&token_lowbox, *lockdown, |
| + NTSTATUS status = CreateLowBoxToken(&token_lowbox, lockdown->Get(), |
| TOKEN_ALL_ACCESS, &obj_attr, |
| lowbox_sid_, 0, NULL, |
| saved_handles_count, saved_handles); |
| @@ -616,19 +622,18 @@ ResultCode PolicyBase::MakeTokens(HANDLE* initial, HANDLE* lockdown) { |
| return SBOX_ERROR_GENERIC; |
| DCHECK(token_lowbox); |
| - ::CloseHandle(*lockdown); |
| - *lockdown = token_lowbox; |
| + lockdown->Set(token_lowbox); |
|
Will Harris
2015/07/10 18:11:31
scoped handles really does make this a lot more el
|
| } |
| // Create the 'better' token. We use this token as the one that the main |
| // thread uses when booting up the process. It should contain most of |
| // what we need (before reaching main( )) |
| - result = CreateRestrictedToken(initial, initial_level_, |
| + result = CreateRestrictedToken(&temp_handle, initial_level_, |
| integrity_level_, IMPERSONATION); |
| - if (ERROR_SUCCESS != result) { |
| - ::CloseHandle(*lockdown); |
| + if (ERROR_SUCCESS != result) |
| return SBOX_ERROR_GENERIC; |
| - } |
| + |
| + initial->Set(temp_handle); |
| return SBOX_ALL_OK; |
| } |