Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(227)

Side by Side Diff: sandbox/win/src/win_utils.cc

Issue 2528243002: Fix silent truncations when extracting values from CheckedNumeric (Closed)
Patch Set: compile cleanup and fix Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "sandbox/win/src/win_utils.h" 5 #include "sandbox/win/src/win_utils.h"
6 6
7 #include <psapi.h> 7 #include <psapi.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 EqualPath(process_path, image_path)) { 482 EqualPath(process_path, image_path)) {
483 return mem_info.BaseAddress; 483 return mem_info.BaseAddress;
484 } 484 }
485 // VirtualQueryEx should fail before overflow, but just in case we'll check 485 // VirtualQueryEx should fail before overflow, but just in case we'll check
486 // to prevent an infinite loop. 486 // to prevent an infinite loop.
487 base::CheckedNumeric<uintptr_t> next_base = 487 base::CheckedNumeric<uintptr_t> next_base =
488 reinterpret_cast<uintptr_t>(mem_info.BaseAddress); 488 reinterpret_cast<uintptr_t>(mem_info.BaseAddress);
489 next_base += mem_info.RegionSize; 489 next_base += mem_info.RegionSize;
490 if (!next_base.IsValid()) 490 if (!next_base.IsValid())
491 return nullptr; 491 return nullptr;
492 current = reinterpret_cast<void*>(next_base.ValueOrDie()); 492 current =
493 reinterpret_cast<void*>(static_cast<uintptr_t>(next_base.ValueOrDie()));
493 } 494 }
494 495
495 return nullptr; 496 return nullptr;
496 } 497 }
497 498
498 }; // namespace sandbox 499 }; // namespace sandbox
499 500
500 void ResolveNTFunctionPtr(const char* name, void* ptr) { 501 void ResolveNTFunctionPtr(const char* name, void* ptr) {
501 static volatile HMODULE ntdll = NULL; 502 static volatile HMODULE ntdll = NULL;
502 503
503 if (!ntdll) { 504 if (!ntdll) {
504 HMODULE ntdll_local = ::GetModuleHandle(sandbox::kNtdllName); 505 HMODULE ntdll_local = ::GetModuleHandle(sandbox::kNtdllName);
505 // Use PEImage to sanity-check that we have a valid ntdll handle. 506 // Use PEImage to sanity-check that we have a valid ntdll handle.
506 base::win::PEImage ntdll_peimage(ntdll_local); 507 base::win::PEImage ntdll_peimage(ntdll_local);
507 CHECK_NT(ntdll_peimage.VerifyMagic()); 508 CHECK_NT(ntdll_peimage.VerifyMagic());
508 // Race-safe way to set static ntdll. 509 // Race-safe way to set static ntdll.
509 ::InterlockedCompareExchangePointer( 510 ::InterlockedCompareExchangePointer(
510 reinterpret_cast<PVOID volatile*>(&ntdll), ntdll_local, NULL); 511 reinterpret_cast<PVOID volatile*>(&ntdll), ntdll_local, NULL);
511 } 512 }
512 513
513 CHECK_NT(ntdll); 514 CHECK_NT(ntdll);
514 FARPROC* function_ptr = reinterpret_cast<FARPROC*>(ptr); 515 FARPROC* function_ptr = reinterpret_cast<FARPROC*>(ptr);
515 *function_ptr = ::GetProcAddress(ntdll, name); 516 *function_ptr = ::GetProcAddress(ntdll, name);
516 CHECK_NT(*function_ptr); 517 CHECK_NT(*function_ptr);
517 } 518 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698