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

Unified Diff: rlz/win/lib/process_info.cc

Issue 691913003: fix RLZ crasher in process_info.cc (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: string16 Created 6 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: rlz/win/lib/process_info.cc
diff --git a/rlz/win/lib/process_info.cc b/rlz/win/lib/process_info.cc
index 7068cfb40fe80a42762e42eeaa616405a5b87fac..4b83f384b3198fed3b1c06e36bbe12d824161d85 100644
--- a/rlz/win/lib/process_info.cc
+++ b/rlz/win/lib/process_info.cc
@@ -7,83 +7,17 @@
#include "rlz/win/lib/process_info.h"
#include <windows.h>
-#include <Sddl.h> // For ConvertSidToStringSid.
-#include <LMCons.h> // For UNLEN
-#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/process/process_handle.h"
+#include "base/strings/string16.h"
#include "base/win/scoped_handle.h"
+#include "base/win/win_util.h"
#include "base/win/windows_version.h"
#include "rlz/lib/assert.h"
namespace {
-HRESULT GetCurrentUser(std::wstring* name,
- std::wstring* domain,
- std::wstring* sid) {
- DWORD err;
-
- // Get the current username & domain the hard way. (GetUserNameEx would be
- // nice, but unfortunately requires connectivity to a domain controller.
- // Useless.)
-
- // (Following call doesn't work if running as a Service - because a Service
- // runs under special accounts like LOCAL_SYSTEM, not as the logged in user.
- // In which case, search for and use the process handle of a running
- // Explorer.exe.)
- HANDLE token;
-
- CHECK(::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &token));
-
- base::win::ScopedHandle scoped_process_token(token);
-
- // (Following call will fail with ERROR_INSUFFICIENT_BUFFER and give us the
- // required size.)
- scoped_ptr<char[]> token_user_bytes;
- DWORD token_user_size;
- DWORD token_user_size2;
- BOOL result = ::GetTokenInformation(token, TokenUser, NULL, 0,
- &token_user_size);
- err = ::GetLastError();
- CHECK(!result && err == ERROR_INSUFFICIENT_BUFFER);
-
- token_user_bytes.reset(new char[token_user_size]);
- CHECK(token_user_bytes.get());
-
- CHECK(::GetTokenInformation(token, TokenUser, token_user_bytes.get(),
- token_user_size, &token_user_size2));
-
- WCHAR user_name[UNLEN + 1]; // max username length
- WCHAR domain_name[UNLEN + 1];
- DWORD user_name_size = UNLEN + 1;
- DWORD domain_name_size = UNLEN + 1;
- SID_NAME_USE sid_type;
- TOKEN_USER* token_user =
- reinterpret_cast<TOKEN_USER*>(token_user_bytes.get());
- CHECK(token_user);
-
- PSID user_sid = token_user->User.Sid;
- CHECK(::LookupAccountSidW(NULL, user_sid, user_name, &user_name_size,
- domain_name, &domain_name_size, &sid_type));
-
- if (name != NULL) {
- *name = user_name;
- }
- if (domain != NULL) {
- *domain = domain_name;
- }
- if (sid != NULL) {
- LPWSTR string_sid;
- ConvertSidToStringSidW(user_sid, &string_sid);
- *sid = string_sid; // copy out to cstring
- // free memory, as documented for ConvertSidToStringSid
- LocalFree(string_sid);
- }
-
- return S_OK;
-}
-
HRESULT GetElevationType(PTOKEN_ELEVATION_TYPE elevation) {
if (!elevation)
return E_POINTER;
@@ -149,13 +83,12 @@ bool GetUserGroup(long* group) {
namespace rlz_lib {
bool ProcessInfo::IsRunningAsSystem() {
- static std::wstring name;
- static std::wstring domain;
- static std::wstring sid;
- if (name.empty())
- CHECK(SUCCEEDED(GetCurrentUser(&name, &domain, &sid)));
-
- return (name == L"SYSTEM");
+ static base::string16 user_sid;
+ if (user_sid.empty()) {
+ if (!base::win::GetUserSidString(&user_sid))
+ return false;
+ }
+ return (user_sid == L"S-1-5-18");
}
bool ProcessInfo::HasAdminRights() {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698