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

Unified Diff: chrome/installer/mini_installer/mini_installer.cc

Issue 2559053002: Instrument setup.exe in the SyzyAsan builds.
Patch Set: Fix the component build Created 3 years, 8 months 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
Index: chrome/installer/mini_installer/mini_installer.cc
diff --git a/chrome/installer/mini_installer/mini_installer.cc b/chrome/installer/mini_installer/mini_installer.cc
index 871ab23db434879325dabc0a177843a4986dde1c..4da7b8540445a002a4abbddfefba709df3c8be3d 100644
--- a/chrome/installer/mini_installer/mini_installer.cc
+++ b/chrome/installer/mini_installer/mini_installer.cc
@@ -59,6 +59,9 @@ struct Context {
PathString* chrome_resource_path;
// Second output from call back method. Full path of Setup archive/exe.
PathString* setup_resource_path;
+#if defined(SYZYASAN)
+ PathString* syzyasan_resource_path;
+#endif
};
// TODO(grt): Frame this in terms of whether or not the brand supports
@@ -291,6 +294,11 @@ BOOL CALLBACK OnResourceFound(HMODULE module, const wchar_t* type,
} else if (StrStartsWith(name, kSetupPrefix)) {
if (!ctx->setup_resource_path->assign(full_path.get()))
return FALSE;
+#if defined(SYZYASAN)
+ } else if (StrStartsWith(name, kSyzyAsanRuntimePrefix)) {
+ if (!ctx->syzyasan_resource_path->assign(full_path.get()))
+ return FALSE;
+#endif
} else {
// Resources should either start with 'chrome' or 'setup'. We don't handle
// anything else.
@@ -300,7 +308,7 @@ BOOL CALLBACK OnResourceFound(HMODULE module, const wchar_t* type,
return TRUE;
}
-#if defined(COMPONENT_BUILD)
+#if defined(COMPONENT_BUILD) || defined(SYZYASAN)
// An EnumResNameProc callback that writes the resource |name| to disk in the
// directory |base_path_ptr| (which must end with a path separator).
BOOL CALLBACK WriteResourceToDirectory(HMODULE module,
@@ -331,32 +339,23 @@ BOOL CALLBACK WriteResourceToDirectory(HMODULE module,
// uncompressed 'BN' resources are also extracted. This is generally the set of
// DLLs/resources needed by setup.exe to run.
ProcessExitResult UnpackBinaryResources(const Configuration& configuration,
- HMODULE module, const wchar_t* base_path,
- PathString* archive_path,
- PathString* setup_path) {
+ HMODULE module,
+ Context* context) {
grt (UTC plus 2) 2017/04/20 09:30:50 i had thought of Context as an implementation deta
// Generate the setup.exe path where we patch/uncompress setup resource.
PathString setup_dest_path;
- if (!setup_dest_path.assign(base_path) ||
+ if (!setup_dest_path.assign(context->base_path) ||
!setup_dest_path.append(kSetupExe))
return ProcessExitResult(PATH_STRING_OVERFLOW);
- // Prepare the input to OnResourceFound method that needs a location where
- // it will write all the resources.
- Context context = {
- base_path,
- archive_path,
- setup_path,
- };
-
// Get the resources of type 'B7' (7zip archive).
// We need a chrome archive to do the installation. So if there
// is a problem in fetching B7 resource, just return an error.
if (!::EnumResourceNames(module, kLZMAResourceType, OnResourceFound,
- reinterpret_cast<LONG_PTR>(&context))) {
+ reinterpret_cast<LONG_PTR>(context))) {
return ProcessExitResult(UNABLE_TO_EXTRACT_CHROME_ARCHIVE,
::GetLastError());
}
- if (archive_path->length() == 0) {
+ if (context->chrome_resource_path->length() == 0) {
return ProcessExitResult(UNABLE_TO_EXTRACT_CHROME_ARCHIVE);
}
@@ -365,22 +364,18 @@ ProcessExitResult UnpackBinaryResources(const Configuration& configuration,
// If we found setup 'B7' resource (used for differential updates), handle
// it. Note that this is only for Chrome; Chromium installs are always
// "full" installs.
- if (setup_path->length() > 0) {
+ if (context->setup_resource_path->length() > 0) {
CommandString cmd_line;
PathString exe_path;
// Get the path to setup.exe first.
exit_code = GetPreviousSetupExePath(configuration, exe_path.get(),
exe_path.capacity());
if (exit_code.IsSuccess()) {
- if (!cmd_line.append(exe_path.get()) ||
- !cmd_line.append(L" --") ||
- !cmd_line.append(kCmdUpdateSetupExe) ||
- !cmd_line.append(L"=\"") ||
- !cmd_line.append(setup_path->get()) ||
- !cmd_line.append(L"\" --") ||
- !cmd_line.append(kCmdNewSetupExe) ||
- !cmd_line.append(L"=\"") ||
- !cmd_line.append(setup_dest_path.get()) ||
+ if (!cmd_line.append(exe_path.get()) || !cmd_line.append(L" --") ||
+ !cmd_line.append(kCmdUpdateSetupExe) || !cmd_line.append(L"=\"") ||
+ !cmd_line.append(context->setup_resource_path->get()) ||
+ !cmd_line.append(L"\" --") || !cmd_line.append(kCmdNewSetupExe) ||
+ !cmd_line.append(L"=\"") || !cmd_line.append(setup_dest_path.get()) ||
!cmd_line.append(L"\"")) {
exit_code = ProcessExitResult(COMMAND_STRING_OVERFLOW);
}
@@ -394,8 +389,8 @@ ProcessExitResult UnpackBinaryResources(const Configuration& configuration,
exit_code = RunProcessAndWait(exe_path.get(), cmd_line.get());
if (!exit_code.IsSuccess())
- DeleteFile(setup_path->get());
- else if (!setup_path->assign(setup_dest_path.get()))
+ DeleteFile(context->setup_resource_path->get());
+ else if (!context->setup_resource_path->assign(setup_dest_path.get()))
exit_code = ProcessExitResult(PATH_STRING_OVERFLOW);
return exit_code;
@@ -404,21 +399,21 @@ ProcessExitResult UnpackBinaryResources(const Configuration& configuration,
// setup.exe wasn't sent as 'B7', lets see if it was sent as 'BL'
// (compressed setup).
if (!::EnumResourceNames(module, kLZCResourceType, OnResourceFound,
- reinterpret_cast<LONG_PTR>(&context))) {
+ reinterpret_cast<LONG_PTR>(context))) {
return ProcessExitResult(UNABLE_TO_EXTRACT_SETUP_BL, ::GetLastError());
}
- if (setup_path->length() == 0) {
+ if (context->setup_resource_path->length() == 0) {
// Neither setup_patch.packed.7z nor setup.ex_ was found.
return ProcessExitResult(UNABLE_TO_EXTRACT_SETUP);
}
// Uncompress LZ compressed resource. Setup is packed with 'MSCF'
// as opposed to old DOS way of 'SZDD'. Hence we don't use LZCopy.
- bool success =
- mini_installer::Expand(setup_path->get(), setup_dest_path.get());
- ::DeleteFile(setup_path->get());
+ bool success = mini_installer::Expand(context->setup_resource_path->get(),
+ setup_dest_path.get());
+ ::DeleteFile(context->setup_resource_path->get());
if (success) {
- if (!setup_path->assign(setup_dest_path.get())) {
+ if (!context->setup_resource_path->assign(setup_dest_path.get())) {
::DeleteFile(setup_dest_path.get());
exit_code = ProcessExitResult(PATH_STRING_OVERFLOW);
}
@@ -426,11 +421,31 @@ ProcessExitResult UnpackBinaryResources(const Configuration& configuration,
exit_code = ProcessExitResult(UNABLE_TO_EXTRACT_SETUP_EXE);
}
+#if defined(SYZYASAN)
+ PathString syzyasan_dest_path;
+ if (!syzyasan_dest_path.assign(context->base_path) ||
+ !syzyasan_dest_path.append(L"syzyasan_rtl.dll")) {
+ return ProcessExitResult(PATH_STRING_OVERFLOW);
+ }
+ success = mini_installer::Expand(context->syzyasan_resource_path->get(),
+ syzyasan_dest_path.get());
+ ::DeleteFile(context->syzyasan_resource_path->get());
+ if (success) {
+ if (!context->syzyasan_resource_path->assign(syzyasan_dest_path.get())) {
+ ::DeleteFile(syzyasan_dest_path.get());
+ exit_code = ProcessExitResult(PATH_STRING_OVERFLOW);
+ }
+ } else {
+ // TODO(sebmarchand): Add a new exit code for syzyasan_rtl.dll?
+ exit_code = ProcessExitResult(UNABLE_TO_EXTRACT_SETUP_EXE);
+ }
+#endif
+
#if defined(COMPONENT_BUILD)
if (exit_code.IsSuccess()) {
// Extract the (uncompressed) modules required by setup.exe.
if (!::EnumResourceNames(module, kBinResourceType, WriteResourceToDirectory,
- reinterpret_cast<LONG_PTR>(base_path))) {
+ reinterpret_cast<LONG_PTR>(context->base_path))) {
return ProcessExitResult(UNABLE_TO_EXTRACT_SETUP, ::GetLastError());
}
}
@@ -844,8 +859,18 @@ ProcessExitResult WMain(HMODULE module) {
PathString archive_path;
PathString setup_path;
- exit_code = UnpackBinaryResources(configuration, module, base_path.get(),
- &archive_path, &setup_path);
+#if defined(SYZYASAN)
+ PathString syzyasan_rtl_path;
+#endif
+ Context context = {
grt (UTC plus 2) 2017/04/20 09:30:50 maybe it's cleaner have Context contain the output
+ base_path.get(),
+ &archive_path,
+ &setup_path,
+#if defined(SYZYASAN)
+ &syzyasan_rtl_path,
+#endif
+ };
+ exit_code = UnpackBinaryResources(configuration, module, &context);
// While unpacking the binaries, we paged in a whole bunch of memory that
// we don't need anymore. Let's give it back to the pool before running

Powered by Google App Engine
This is Rietveld 408576698