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

Unified Diff: printing/backend/win_helper.cc

Issue 6037019: Fixed a crash with some HP printer drivers (when invoking PTGetPrintCapabilit... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 11 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
« no previous file with comments | « printing/backend/win_helper.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: printing/backend/win_helper.cc
===================================================================
--- printing/backend/win_helper.cc (revision 70422)
+++ printing/backend/win_helper.cc (working copy)
@@ -175,4 +175,36 @@
return g_close_provider_proc(provider);
}
+ScopedXPSInitializer::ScopedXPSInitializer() : initialized_(false) {
+ if (XPSModule::Init()) {
+ // Calls to XPS APIs typically require the XPS provider to be opened with
+ // PTOpenProvider. PTOpenProvider calls CoInitializeEx with
+ // COINIT_MULTITHREADED. We have seen certain buggy HP printer driver DLLs
+ // that call CoInitializeEx with COINIT_APARTMENTTHREADED in the context of
+ // PTGetPrintCapabilities. This call fails but the printer driver calls
+ // CoUninitialize anyway. This results in the apartment being torn down too
+ // early and the msxml DLL being unloaded which in turn causes code in
+ // unidrvui.dll to have a dangling pointer to an XML document which causes a
+ // crash. To protect ourselves from such drivers we make sure we always have
+ // an extra CoInitialize (calls to CoInitialize/CoUninitialize are
+ // refcounted).
+ HRESULT coinit_ret = CoInitializeEx(NULL, COINIT_MULTITHREADED);
+ // If this succeeded we are done because the PTOpenProvider call will
+ // provide the extra refcount on the apartment. If it failed because someone
+ // already called CoInitializeEx with COINIT_APARTMENTTHREADED, we try
+ // the other model to provide the additional refcount (since we don't know
+ // which model buggy printer drivers will use).
+ if (coinit_ret == RPC_E_CHANGED_MODE)
+ coinit_ret = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
+ DCHECK(SUCCEEDED(coinit_ret));
+ initialized_ = true;
+ }
+}
+
+ScopedXPSInitializer::~ScopedXPSInitializer() {
+ if (initialized_)
+ CoUninitialize();
+ initialized_ = false;
+}
+
} // namespace printing
« no previous file with comments | « printing/backend/win_helper.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698