Don't load assemblies inside bundle when using LoadFrom (#40826)
authorMateo Torres-Ruiz <mateoatr@users.noreply.github.com>
Mon, 17 Aug 2020 22:00:34 +0000 (15:00 -0700)
committerGitHub <noreply@github.com>
Mon, 17 Aug 2020 22:00:34 +0000 (15:00 -0700)
* Don't use bundler's probe in LoadFromPath

src/coreclr/src/vm/assemblynative.cpp
src/coreclr/src/vm/peimage.cpp
src/coreclr/src/vm/peimage.h
src/coreclr/src/vm/peimage.inl

index f73697d..8f5bb78 100644 (file)
@@ -240,7 +240,7 @@ void QCALLTYPE AssemblyNative::LoadFromPath(INT_PTR ptrNativeAssemblyLoadContext
     {
         pILImage = PEImage::OpenImage(pwzILPath,
                                       MDInternalImport_Default,
-                                      Bundle::ProbeAppBundle(pwzILPath));
+                                      BundleFileLocation::Invalid());
 
         // Need to verify that this is a valid CLR assembly.
         if (!pILImage->CheckILFormat())
@@ -260,7 +260,7 @@ void QCALLTYPE AssemblyNative::LoadFromPath(INT_PTR ptrNativeAssemblyLoadContext
     {
         pNIImage = PEImage::OpenImage(pwzNIPath,
                                       MDInternalImport_TrustedNativeImage,
-                                      Bundle::ProbeAppBundle(pwzNIPath));
+                                      BundleFileLocation::Invalid());
 
         if (pNIImage->HasReadyToRunHeader())
         {
index 802a20a..fc2c7de 100644 (file)
@@ -367,7 +367,9 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2)
     EX_TRY
     {
         SString path(SString::Literal, pLocator->m_pPath);
-        if (PathEquals(path, pImage->GetPath()))
+        BOOL isInBundle = pLocator->m_bIsInBundle;
+        if (PathEquals(path, pImage->GetPath()) &&
+            (!isInBundle == !pImage->IsInBundle()))
             ret = TRUE;
     }
     EX_CATCH_HRESULT(hr); //<TODO>ignores failure!</TODO>
index 96b3ea0..230da7d 100644 (file)
@@ -120,7 +120,8 @@ public:
     };
 
     static PTR_PEImage FindById(UINT64 uStreamAsmId, DWORD dwModuleId);
-    static PTR_PEImage FindByPath(LPCWSTR pPath);
+    static PTR_PEImage FindByPath(LPCWSTR pPath,
+                                  BOOL isInBundle = TRUE);
     static PTR_PEImage FindByShortPath(LPCWSTR pPath);
     static PTR_PEImage FindByLongPath(LPCWSTR pPath);
     void AddToHashMap();
@@ -245,15 +246,18 @@ private:
     {
 
         LPCWSTR m_pPath;
+        BOOL m_bIsInBundle;
 
-        PEImageLocator(LPCWSTR pPath)
-            : m_pPath(pPath)
+        PEImageLocator(LPCWSTR pPath, BOOL bIsInBundle)
+            : m_pPath(pPath),
+              m_bIsInBundle(bIsInBundle)
         {
         }
 
         PEImageLocator(PEImage * pImage)
             : m_pPath(pImage->m_path.GetUnicode())
         {
+            m_bIsInBundle = pImage->IsInBundle();
         }
     };
 
index 56d0b04..06d897e 100644 (file)
@@ -478,7 +478,7 @@ inline void  PEImage::Init(LPCWSTR pPath, BundleFileLocation bundleFileLocation)
 
 
 /*static*/
-inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath)
+inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath, BOOL isInBundle /* = TRUE */)
 {
     CONTRACTL
     {
@@ -492,13 +492,13 @@ inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath)
 
     int CaseHashHelper(const WCHAR *buffer, COUNT_T count);
 
-    PEImageLocator locator(pPath);
+    PEImageLocator locator(pPath, isInBundle);
 #ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
     DWORD dwHash=path.Hash();
 #else
     DWORD dwHash = CaseHashHelper(pPath, (COUNT_T) wcslen(pPath));
 #endif
-   return (PEImage *) s_Images->LookupValue(dwHash, &locator);
+    return (PEImage *) s_Images->LookupValue(dwHash, &locator);
 
 }
 
@@ -516,7 +516,7 @@ inline PTR_PEImage PEImage::OpenImage(LPCWSTR pPath, MDInternalImportFlags flags
 
     CrstHolder holder(&s_hashLock);
 
-    PEImage* found = FindByPath(pPath);
+    PEImage* found = FindByPath(pPath, bundleFileLocation.IsValid());
 
 
     if (found == (PEImage*) INVALIDENTRY)
@@ -604,7 +604,6 @@ inline ULONG PEImage::GetIDHash()
     }
     CONTRACT_END;
 
-
 #ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
     RETURN m_path.Hash();
 #else