Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/coreclr/debug/daccess/request.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -2642,8 +2642,7 @@ ClrDataAccess::GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, _Inout_u
// Turn from bytes to wide characters
if (!pAssembly->GetPEAssembly()->GetPath().IsEmpty())
{
if (!pAssembly->GetPEAssembly()->GetPath().
DacGetUnicode(count, location, pNeeded))
if (!pAssembly->GetPEAssembly()->GetPath().DacGetUnicode(count, location, pNeeded))
{
hr = E_FAIL;
}
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/inc/sstring.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -683,7 +683,9 @@ class EMPTY_BASES_DECL SString : private SBuffer
BOOL IsASCIIScanned() const;
void SetASCIIScanned() const;
void SetNormalized() const;
public:
BOOL IsNormalized() const;
private:
void ClearNormalized() const;

void EnsureWritable() const;
Expand Down
8 changes: 0 additions & 8 deletions src/coreclr/md/compiler/mdutil.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -265,11 +265,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand DownExpand Up@@ -299,11 +295,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand Down
8 changes: 3 additions & 5 deletions src/coreclr/vm/dwbucketmanager.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -960,11 +960,9 @@ bool BaseBucketParamsManager::GetFileVersionInfoForModule(Module* pModule, USHOR
// if we failed to get the version info from the native image then fall back to the IL image.
if (!succeeded)
{
LPCWSTR modulePath = pPEAssembly->GetPath().GetUnicode();
if (modulePath != NULL && modulePath != SString::Empty() && SUCCEEDED(DwGetFileVersionInfo(modulePath, major, minor, build, revision)))
{
succeeded = true;
}
const SString& modulePath = pPEAssembly->GetPath();
_ASSERTE(modulePath.IsNormalized());
succeeded = !modulePath.IsEmpty() && SUCCEEDED(DwGetFileVersionInfo(modulePath.GetUnicode(), major, minor, build, revision));
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/coreclr/vm/excep.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -11616,7 +11616,8 @@ VOID GetAssemblyDetailInfo(SString &sType,

SString sAlcName;
pPEAssembly->GetAssemblyBinder()->GetNameForDiagnostics(sAlcName);
if (pPEAssembly->GetPath().IsEmpty())
SString assemblyPath{ pPEAssembly->GetPath() };
if (assemblyPath.IsEmpty())
{
detailsUtf8.Printf("Type %s originates from '%s' in the context '%s' in a byte array",
sType.GetUTF8(),
Expand All@@ -11629,7 +11630,7 @@ VOID GetAssemblyDetailInfo(SString &sType,
sType.GetUTF8(),
sAssemblyDisplayName.GetUTF8(),
sAlcName.GetUTF8(),
pPEAssembly->GetPath().GetUTF8());
assemblyPath.GetUTF8());
}

sAssemblyDetailInfo.Append(detailsUtf8.GetUnicode());
Expand Down
10 changes: 3 additions & 7 deletions src/coreclr/vm/peimage.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -141,11 +141,11 @@ ULONG PEImage::Release()
result=InterlockedDecrement(&m_refCount);
if (result == 0 )
{
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing Image %s\n", m_path.GetUTF8()));
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing %p\n", this));
if(m_bInHashMap)
{
PEImageLocator locator(this);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(GetPathHash(), &locator);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(m_pathHash, &locator);
_ASSERTE(deleted == this);
}
}
Expand DownExpand Up@@ -249,12 +249,7 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2)
EX_TRY
{
SString path(SString::Literal, pLocator->m_pPath);

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (pImage->GetPath().Equals(path))
#else
if (pImage->GetPath().EqualsCaseInsensitive(path))
#endif
{
ret = TRUE;
}
Expand DownExpand Up@@ -623,6 +618,7 @@ void PEImage::EnumMemoryRegions(CLRDataEnumMemoryFlags flags)

PEImage::PEImage():
m_path(),
m_pathHash(0),
m_refCount(1),
m_bInHashMap(FALSE),
m_bundleFileLocation(),
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/vm/peimage.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -132,8 +132,6 @@ class PEImage final
PTR_PEImageLayout GetLoadedLayout();
PTR_PEImageLayout GetFlatLayout();

BOOL HasPath();
ULONG GetPathHash();
const SString& GetPath();
const SString& GetPathToLoad();
LPCWSTR GetPathForErrorMessages() { return GetPath(); }
Expand DownExpand Up@@ -288,6 +286,7 @@ class PEImage final
// ------------------------------------------------------------

SString m_path;
ULONG m_pathHash;
LONG m_refCount;

// means this is a unique (deduped) instance.
Expand Down
32 changes: 2 additions & 30 deletions src/coreclr/vm/peimage.inl
Original file line numberDiff line numberDiff line change
Expand Up@@ -288,6 +288,7 @@ inline void PEImage::Init(LPCWSTR pPath, BundleFileLocation bundleFileLocation)

m_path = pPath;
m_path.Normalize();
m_pathHash = m_path.HashCaseInsensitive();
m_bundleFileLocation = bundleFileLocation;
SetModuleFileNameHintForDAC();
}
Expand All@@ -310,11 +311,7 @@ inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath, BOOL isInBundle /* = TRUE
int CaseHashHelper(const WCHAR *buffer, COUNT_T count);

PEImageLocator locator(pPath, isInBundle);
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
DWORD dwHash=path.Hash();
#else
DWORD dwHash = CaseHashHelper(pPath, (COUNT_T) u16_strlen(pPath));
#endif
return (PEImage *) s_Images->LookupValue(dwHash, &locator);
}

Expand DownExpand Up@@ -366,7 +363,7 @@ inline void PEImage::AddToHashMap()
CONTRACTL_END;

_ASSERTE(s_hashLock.OwnedByCurrentThread());
s_Images->InsertValue(GetPathHash(),this);
s_Images->InsertValue(m_pathHash,this);
m_bInHashMap=TRUE;
}

Expand All@@ -378,31 +375,6 @@ inline BOOL PEImage::Has32BitNTHeaders()
return GetOrCreateLayout(PEImageLayout::LAYOUT_ANY)->Has32BitNTHeaders();
}

inline BOOL PEImage::HasPath()
{
LIMITED_METHOD_CONTRACT;

return !GetPath().IsEmpty();
}

inline ULONG PEImage::GetPathHash()
{
CONTRACT(ULONG)
{
PRECONDITION(HasPath());
MODE_ANY;
GC_NOTRIGGER;
THROWS;
}
CONTRACT_END;

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
RETURN m_path.Hash();
#else
RETURN m_path.HashCaseInsensitive();
#endif
}

inline void PEImage::GetPEKindAndMachine(DWORD* pdwKind, DWORD* pdwMachine)
{
CONTRACTL
Expand Down
15 changes: 12 additions & 3 deletions src/coreclr/vm/peimagelayout.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -534,7 +534,10 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)

IfFailThrow(Init(m_Module, true));

LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

#else
HANDLE hFile = pOwner->GetFileHandle();
Expand All@@ -548,8 +551,11 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)
return;
}

#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: image %s (hFile %p) mapped @ %p\n",
pOwner->GetPath().GetUTF8(), hFile, (void*)m_LoadedFile));
ownerPath.GetUTF8(), hFile, (void*)m_LoadedFile));
#endif // LOGGING

IfFailThrow(Init((void*)m_LoadedFile));

Expand DownExpand Up@@ -616,7 +622,10 @@ FlatImageLayout::FlatImageLayout(PEImage* pOwner)
INT64 offset = pOwner->GetOffset();
INT64 size = pOwner->GetSize();

LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

// If a size is not specified, load the whole file
if (size == 0)
Expand Down
7 changes: 4 additions & 3 deletions src/coreclr/vm/readytoruninfo.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -429,7 +429,8 @@ static void LogR2r(const char *msg, PEAssembly *pPEAssembly)
if (r2rLogFile == NULL)
return;

fprintf(r2rLogFile, "%s: \"%s\".\n", msg, pPEAssembly->GetPath().GetUTF8());
SString assemblyPath{ pPEAssembly->GetPath() };
fprintf(r2rLogFile, "%s: \"%s\".\n", msg, assemblyPath.GetUTF8());
fflush(r2rLogFile);
}

Expand DownExpand Up@@ -1904,7 +1905,7 @@ uint32_t ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCount(mdTypeDef input,
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand All@@ -1922,7 +1923,7 @@ HRESULT ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCountNoThrow(mdTypeDef
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
`PEImage` should not permit `m_path` field mutation by AaronRobinsonMSFT · Pull Request #90753 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/coreclr/debug/daccess/request.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -2642,8 +2642,7 @@ ClrDataAccess::GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, _Inout_u
// Turn from bytes to wide characters
if (!pAssembly->GetPEAssembly()->GetPath().IsEmpty())
{
if (!pAssembly->GetPEAssembly()->GetPath().
DacGetUnicode(count, location, pNeeded))
if (!pAssembly->GetPEAssembly()->GetPath().DacGetUnicode(count, location, pNeeded))
{
hr = E_FAIL;
}
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/inc/sstring.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -683,7 +683,9 @@ class EMPTY_BASES_DECL SString : private SBuffer
BOOL IsASCIIScanned() const;
void SetASCIIScanned() const;
void SetNormalized() const;
public:
BOOL IsNormalized() const;
private:
void ClearNormalized() const;

void EnsureWritable() const;
Expand Down
8 changes: 0 additions & 8 deletions src/coreclr/md/compiler/mdutil.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -265,11 +265,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand DownExpand Up@@ -299,11 +295,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand Down
8 changes: 3 additions & 5 deletions src/coreclr/vm/dwbucketmanager.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -960,11 +960,9 @@ bool BaseBucketParamsManager::GetFileVersionInfoForModule(Module* pModule, USHOR
// if we failed to get the version info from the native image then fall back to the IL image.
if (!succeeded)
{
LPCWSTR modulePath = pPEAssembly->GetPath().GetUnicode();
if (modulePath != NULL && modulePath != SString::Empty() && SUCCEEDED(DwGetFileVersionInfo(modulePath, major, minor, build, revision)))
{
succeeded = true;
}
const SString& modulePath = pPEAssembly->GetPath();
_ASSERTE(modulePath.IsNormalized());
succeeded = !modulePath.IsEmpty() && SUCCEEDED(DwGetFileVersionInfo(modulePath.GetUnicode(), major, minor, build, revision));
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/coreclr/vm/excep.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -11616,7 +11616,8 @@ VOID GetAssemblyDetailInfo(SString &sType,

SString sAlcName;
pPEAssembly->GetAssemblyBinder()->GetNameForDiagnostics(sAlcName);
if (pPEAssembly->GetPath().IsEmpty())
SString assemblyPath{ pPEAssembly->GetPath() };
if (assemblyPath.IsEmpty())
{
detailsUtf8.Printf("Type %s originates from '%s' in the context '%s' in a byte array",
sType.GetUTF8(),
Expand All@@ -11629,7 +11630,7 @@ VOID GetAssemblyDetailInfo(SString &sType,
sType.GetUTF8(),
sAssemblyDisplayName.GetUTF8(),
sAlcName.GetUTF8(),
pPEAssembly->GetPath().GetUTF8());
assemblyPath.GetUTF8());
}

sAssemblyDetailInfo.Append(detailsUtf8.GetUnicode());
Expand Down
10 changes: 3 additions & 7 deletions src/coreclr/vm/peimage.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -141,11 +141,11 @@ ULONG PEImage::Release()
result=InterlockedDecrement(&m_refCount);
if (result == 0 )
{
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing Image %s\n", m_path.GetUTF8()));
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing %p\n", this));
if(m_bInHashMap)
{
PEImageLocator locator(this);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(GetPathHash(), &locator);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(m_pathHash, &locator);
_ASSERTE(deleted == this);
}
}
Expand DownExpand Up@@ -249,12 +249,7 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2)
EX_TRY
{
SString path(SString::Literal, pLocator->m_pPath);

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (pImage->GetPath().Equals(path))
#else
if (pImage->GetPath().EqualsCaseInsensitive(path))
#endif
{
ret = TRUE;
}
Expand DownExpand Up@@ -623,6 +618,7 @@ void PEImage::EnumMemoryRegions(CLRDataEnumMemoryFlags flags)

PEImage::PEImage():
m_path(),
m_pathHash(0),
m_refCount(1),
m_bInHashMap(FALSE),
m_bundleFileLocation(),
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/vm/peimage.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -132,8 +132,6 @@ class PEImage final
PTR_PEImageLayout GetLoadedLayout();
PTR_PEImageLayout GetFlatLayout();

BOOL HasPath();
ULONG GetPathHash();
const SString& GetPath();
const SString& GetPathToLoad();
LPCWSTR GetPathForErrorMessages() { return GetPath(); }
Expand DownExpand Up@@ -288,6 +286,7 @@ class PEImage final
// ------------------------------------------------------------

SString m_path;
ULONG m_pathHash;
LONG m_refCount;

// means this is a unique (deduped) instance.
Expand Down
32 changes: 2 additions & 30 deletions src/coreclr/vm/peimage.inl
Original file line numberDiff line numberDiff line change
Expand Up@@ -288,6 +288,7 @@ inline void PEImage::Init(LPCWSTR pPath, BundleFileLocation bundleFileLocation)

m_path = pPath;
m_path.Normalize();
m_pathHash = m_path.HashCaseInsensitive();
m_bundleFileLocation = bundleFileLocation;
SetModuleFileNameHintForDAC();
}
Expand All@@ -310,11 +311,7 @@ inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath, BOOL isInBundle /* = TRUE
int CaseHashHelper(const WCHAR *buffer, COUNT_T count);

PEImageLocator locator(pPath, isInBundle);
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
DWORD dwHash=path.Hash();
#else
DWORD dwHash = CaseHashHelper(pPath, (COUNT_T) u16_strlen(pPath));
#endif
return (PEImage *) s_Images->LookupValue(dwHash, &locator);
}

Expand DownExpand Up@@ -366,7 +363,7 @@ inline void PEImage::AddToHashMap()
CONTRACTL_END;

_ASSERTE(s_hashLock.OwnedByCurrentThread());
s_Images->InsertValue(GetPathHash(),this);
s_Images->InsertValue(m_pathHash,this);
m_bInHashMap=TRUE;
}

Expand All@@ -378,31 +375,6 @@ inline BOOL PEImage::Has32BitNTHeaders()
return GetOrCreateLayout(PEImageLayout::LAYOUT_ANY)->Has32BitNTHeaders();
}

inline BOOL PEImage::HasPath()
{
LIMITED_METHOD_CONTRACT;

return !GetPath().IsEmpty();
}

inline ULONG PEImage::GetPathHash()
{
CONTRACT(ULONG)
{
PRECONDITION(HasPath());
MODE_ANY;
GC_NOTRIGGER;
THROWS;
}
CONTRACT_END;

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
RETURN m_path.Hash();
#else
RETURN m_path.HashCaseInsensitive();
#endif
}

inline void PEImage::GetPEKindAndMachine(DWORD* pdwKind, DWORD* pdwMachine)
{
CONTRACTL
Expand Down
15 changes: 12 additions & 3 deletions src/coreclr/vm/peimagelayout.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -534,7 +534,10 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)

IfFailThrow(Init(m_Module, true));

LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

#else
HANDLE hFile = pOwner->GetFileHandle();
Expand All@@ -548,8 +551,11 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)
return;
}

#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: image %s (hFile %p) mapped @ %p\n",
pOwner->GetPath().GetUTF8(), hFile, (void*)m_LoadedFile));
ownerPath.GetUTF8(), hFile, (void*)m_LoadedFile));
#endif // LOGGING

IfFailThrow(Init((void*)m_LoadedFile));

Expand DownExpand Up@@ -616,7 +622,10 @@ FlatImageLayout::FlatImageLayout(PEImage* pOwner)
INT64 offset = pOwner->GetOffset();
INT64 size = pOwner->GetSize();

LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

// If a size is not specified, load the whole file
if (size == 0)
Expand Down
7 changes: 4 additions & 3 deletions src/coreclr/vm/readytoruninfo.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -429,7 +429,8 @@ static void LogR2r(const char *msg, PEAssembly *pPEAssembly)
if (r2rLogFile == NULL)
return;

fprintf(r2rLogFile, "%s: \"%s\".\n", msg, pPEAssembly->GetPath().GetUTF8());
SString assemblyPath{ pPEAssembly->GetPath() };
fprintf(r2rLogFile, "%s: \"%s\".\n", msg, assemblyPath.GetUTF8());
fflush(r2rLogFile);
}

Expand DownExpand Up@@ -1904,7 +1905,7 @@ uint32_t ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCount(mdTypeDef input,
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand All@@ -1922,7 +1923,7 @@ HRESULT ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCountNoThrow(mdTypeDef
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' `PEImage` should not permit `m_path` field mutation by AaronRobinsonMSFT · Pull Request #90753 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/coreclr/debug/daccess/request.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -2642,8 +2642,7 @@ ClrDataAccess::GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, _Inout_u
// Turn from bytes to wide characters
if (!pAssembly->GetPEAssembly()->GetPath().IsEmpty())
{
if (!pAssembly->GetPEAssembly()->GetPath().
DacGetUnicode(count, location, pNeeded))
if (!pAssembly->GetPEAssembly()->GetPath().DacGetUnicode(count, location, pNeeded))
{
hr = E_FAIL;
}
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/inc/sstring.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -683,7 +683,9 @@ class EMPTY_BASES_DECL SString : private SBuffer
BOOL IsASCIIScanned() const;
void SetASCIIScanned() const;
void SetNormalized() const;
public:
BOOL IsNormalized() const;
private:
void ClearNormalized() const;

void EnsureWritable() const;
Expand Down
8 changes: 0 additions & 8 deletions src/coreclr/md/compiler/mdutil.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -265,11 +265,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand DownExpand Up@@ -299,11 +295,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand Down
8 changes: 3 additions & 5 deletions src/coreclr/vm/dwbucketmanager.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -960,11 +960,9 @@ bool BaseBucketParamsManager::GetFileVersionInfoForModule(Module* pModule, USHOR
// if we failed to get the version info from the native image then fall back to the IL image.
if (!succeeded)
{
LPCWSTR modulePath = pPEAssembly->GetPath().GetUnicode();
if (modulePath != NULL && modulePath != SString::Empty() && SUCCEEDED(DwGetFileVersionInfo(modulePath, major, minor, build, revision)))
{
succeeded = true;
}
const SString& modulePath = pPEAssembly->GetPath();
_ASSERTE(modulePath.IsNormalized());
succeeded = !modulePath.IsEmpty() && SUCCEEDED(DwGetFileVersionInfo(modulePath.GetUnicode(), major, minor, build, revision));
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/coreclr/vm/excep.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -11616,7 +11616,8 @@ VOID GetAssemblyDetailInfo(SString &sType,

SString sAlcName;
pPEAssembly->GetAssemblyBinder()->GetNameForDiagnostics(sAlcName);
if (pPEAssembly->GetPath().IsEmpty())
SString assemblyPath{ pPEAssembly->GetPath() };
if (assemblyPath.IsEmpty())
{
detailsUtf8.Printf("Type %s originates from '%s' in the context '%s' in a byte array",
sType.GetUTF8(),
Expand All@@ -11629,7 +11630,7 @@ VOID GetAssemblyDetailInfo(SString &sType,
sType.GetUTF8(),
sAssemblyDisplayName.GetUTF8(),
sAlcName.GetUTF8(),
pPEAssembly->GetPath().GetUTF8());
assemblyPath.GetUTF8());
}

sAssemblyDetailInfo.Append(detailsUtf8.GetUnicode());
Expand Down
10 changes: 3 additions & 7 deletions src/coreclr/vm/peimage.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -141,11 +141,11 @@ ULONG PEImage::Release()
result=InterlockedDecrement(&m_refCount);
if (result == 0 )
{
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing Image %s\n", m_path.GetUTF8()));
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing %p\n", this));
if(m_bInHashMap)
{
PEImageLocator locator(this);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(GetPathHash(), &locator);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(m_pathHash, &locator);
_ASSERTE(deleted == this);
}
}
Expand DownExpand Up@@ -249,12 +249,7 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2)
EX_TRY
{
SString path(SString::Literal, pLocator->m_pPath);

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (pImage->GetPath().Equals(path))
#else
if (pImage->GetPath().EqualsCaseInsensitive(path))
#endif
{
ret = TRUE;
}
Expand DownExpand Up@@ -623,6 +618,7 @@ void PEImage::EnumMemoryRegions(CLRDataEnumMemoryFlags flags)

PEImage::PEImage():
m_path(),
m_pathHash(0),
m_refCount(1),
m_bInHashMap(FALSE),
m_bundleFileLocation(),
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/vm/peimage.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -132,8 +132,6 @@ class PEImage final
PTR_PEImageLayout GetLoadedLayout();
PTR_PEImageLayout GetFlatLayout();

BOOL HasPath();
ULONG GetPathHash();
const SString& GetPath();
const SString& GetPathToLoad();
LPCWSTR GetPathForErrorMessages() { return GetPath(); }
Expand DownExpand Up@@ -288,6 +286,7 @@ class PEImage final
// ------------------------------------------------------------

SString m_path;
ULONG m_pathHash;
LONG m_refCount;

// means this is a unique (deduped) instance.
Expand Down
32 changes: 2 additions & 30 deletions src/coreclr/vm/peimage.inl
Original file line numberDiff line numberDiff line change
Expand Up@@ -288,6 +288,7 @@ inline void PEImage::Init(LPCWSTR pPath, BundleFileLocation bundleFileLocation)

m_path = pPath;
m_path.Normalize();
m_pathHash = m_path.HashCaseInsensitive();
m_bundleFileLocation = bundleFileLocation;
SetModuleFileNameHintForDAC();
}
Expand All@@ -310,11 +311,7 @@ inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath, BOOL isInBundle /* = TRUE
int CaseHashHelper(const WCHAR *buffer, COUNT_T count);

PEImageLocator locator(pPath, isInBundle);
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
DWORD dwHash=path.Hash();
#else
DWORD dwHash = CaseHashHelper(pPath, (COUNT_T) u16_strlen(pPath));
#endif
return (PEImage *) s_Images->LookupValue(dwHash, &locator);
}

Expand DownExpand Up@@ -366,7 +363,7 @@ inline void PEImage::AddToHashMap()
CONTRACTL_END;

_ASSERTE(s_hashLock.OwnedByCurrentThread());
s_Images->InsertValue(GetPathHash(),this);
s_Images->InsertValue(m_pathHash,this);
m_bInHashMap=TRUE;
}

Expand All@@ -378,31 +375,6 @@ inline BOOL PEImage::Has32BitNTHeaders()
return GetOrCreateLayout(PEImageLayout::LAYOUT_ANY)->Has32BitNTHeaders();
}

inline BOOL PEImage::HasPath()
{
LIMITED_METHOD_CONTRACT;

return !GetPath().IsEmpty();
}

inline ULONG PEImage::GetPathHash()
{
CONTRACT(ULONG)
{
PRECONDITION(HasPath());
MODE_ANY;
GC_NOTRIGGER;
THROWS;
}
CONTRACT_END;

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
RETURN m_path.Hash();
#else
RETURN m_path.HashCaseInsensitive();
#endif
}

inline void PEImage::GetPEKindAndMachine(DWORD* pdwKind, DWORD* pdwMachine)
{
CONTRACTL
Expand Down
15 changes: 12 additions & 3 deletions src/coreclr/vm/peimagelayout.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -534,7 +534,10 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)

IfFailThrow(Init(m_Module, true));

LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

#else
HANDLE hFile = pOwner->GetFileHandle();
Expand All@@ -548,8 +551,11 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)
return;
}

#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: image %s (hFile %p) mapped @ %p\n",
pOwner->GetPath().GetUTF8(), hFile, (void*)m_LoadedFile));
ownerPath.GetUTF8(), hFile, (void*)m_LoadedFile));
#endif // LOGGING

IfFailThrow(Init((void*)m_LoadedFile));

Expand DownExpand Up@@ -616,7 +622,10 @@ FlatImageLayout::FlatImageLayout(PEImage* pOwner)
INT64 offset = pOwner->GetOffset();
INT64 size = pOwner->GetSize();

LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

// If a size is not specified, load the whole file
if (size == 0)
Expand Down
7 changes: 4 additions & 3 deletions src/coreclr/vm/readytoruninfo.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -429,7 +429,8 @@ static void LogR2r(const char *msg, PEAssembly *pPEAssembly)
if (r2rLogFile == NULL)
return;

fprintf(r2rLogFile, "%s: \"%s\".\n", msg, pPEAssembly->GetPath().GetUTF8());
SString assemblyPath{ pPEAssembly->GetPath() };
fprintf(r2rLogFile, "%s: \"%s\".\n", msg, assemblyPath.GetUTF8());
fflush(r2rLogFile);
}

Expand DownExpand Up@@ -1904,7 +1905,7 @@ uint32_t ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCount(mdTypeDef input,
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand All@@ -1922,7 +1923,7 @@ HRESULT ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCountNoThrow(mdTypeDef
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' `PEImage` should not permit `m_path` field mutation by AaronRobinsonMSFT · Pull Request #90753 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/coreclr/debug/daccess/request.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -2642,8 +2642,7 @@ ClrDataAccess::GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, _Inout_u
// Turn from bytes to wide characters
if (!pAssembly->GetPEAssembly()->GetPath().IsEmpty())
{
if (!pAssembly->GetPEAssembly()->GetPath().
DacGetUnicode(count, location, pNeeded))
if (!pAssembly->GetPEAssembly()->GetPath().DacGetUnicode(count, location, pNeeded))
{
hr = E_FAIL;
}
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/inc/sstring.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -683,7 +683,9 @@ class EMPTY_BASES_DECL SString : private SBuffer
BOOL IsASCIIScanned() const;
void SetASCIIScanned() const;
void SetNormalized() const;
public:
BOOL IsNormalized() const;
private:
void ClearNormalized() const;

void EnsureWritable() const;
Expand Down
8 changes: 0 additions & 8 deletions src/coreclr/md/compiler/mdutil.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -265,11 +265,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand DownExpand Up@@ -299,11 +295,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand Down
8 changes: 3 additions & 5 deletions src/coreclr/vm/dwbucketmanager.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -960,11 +960,9 @@ bool BaseBucketParamsManager::GetFileVersionInfoForModule(Module* pModule, USHOR
// if we failed to get the version info from the native image then fall back to the IL image.
if (!succeeded)
{
LPCWSTR modulePath = pPEAssembly->GetPath().GetUnicode();
if (modulePath != NULL && modulePath != SString::Empty() && SUCCEEDED(DwGetFileVersionInfo(modulePath, major, minor, build, revision)))
{
succeeded = true;
}
const SString& modulePath = pPEAssembly->GetPath();
_ASSERTE(modulePath.IsNormalized());
succeeded = !modulePath.IsEmpty() && SUCCEEDED(DwGetFileVersionInfo(modulePath.GetUnicode(), major, minor, build, revision));
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/coreclr/vm/excep.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -11616,7 +11616,8 @@ VOID GetAssemblyDetailInfo(SString &sType,

SString sAlcName;
pPEAssembly->GetAssemblyBinder()->GetNameForDiagnostics(sAlcName);
if (pPEAssembly->GetPath().IsEmpty())
SString assemblyPath{ pPEAssembly->GetPath() };
if (assemblyPath.IsEmpty())
{
detailsUtf8.Printf("Type %s originates from '%s' in the context '%s' in a byte array",
sType.GetUTF8(),
Expand All@@ -11629,7 +11630,7 @@ VOID GetAssemblyDetailInfo(SString &sType,
sType.GetUTF8(),
sAssemblyDisplayName.GetUTF8(),
sAlcName.GetUTF8(),
pPEAssembly->GetPath().GetUTF8());
assemblyPath.GetUTF8());
}

sAssemblyDetailInfo.Append(detailsUtf8.GetUnicode());
Expand Down
10 changes: 3 additions & 7 deletions src/coreclr/vm/peimage.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -141,11 +141,11 @@ ULONG PEImage::Release()
result=InterlockedDecrement(&m_refCount);
if (result == 0 )
{
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing Image %s\n", m_path.GetUTF8()));
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing %p\n", this));
if(m_bInHashMap)
{
PEImageLocator locator(this);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(GetPathHash(), &locator);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(m_pathHash, &locator);
_ASSERTE(deleted == this);
}
}
Expand DownExpand Up@@ -249,12 +249,7 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2)
EX_TRY
{
SString path(SString::Literal, pLocator->m_pPath);

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (pImage->GetPath().Equals(path))
#else
if (pImage->GetPath().EqualsCaseInsensitive(path))
#endif
{
ret = TRUE;
}
Expand DownExpand Up@@ -623,6 +618,7 @@ void PEImage::EnumMemoryRegions(CLRDataEnumMemoryFlags flags)

PEImage::PEImage():
m_path(),
m_pathHash(0),
m_refCount(1),
m_bInHashMap(FALSE),
m_bundleFileLocation(),
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/vm/peimage.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -132,8 +132,6 @@ class PEImage final
PTR_PEImageLayout GetLoadedLayout();
PTR_PEImageLayout GetFlatLayout();

BOOL HasPath();
ULONG GetPathHash();
const SString& GetPath();
const SString& GetPathToLoad();
LPCWSTR GetPathForErrorMessages() { return GetPath(); }
Expand DownExpand Up@@ -288,6 +286,7 @@ class PEImage final
// ------------------------------------------------------------

SString m_path;
ULONG m_pathHash;
LONG m_refCount;

// means this is a unique (deduped) instance.
Expand Down
32 changes: 2 additions & 30 deletions src/coreclr/vm/peimage.inl
Original file line numberDiff line numberDiff line change
Expand Up@@ -288,6 +288,7 @@ inline void PEImage::Init(LPCWSTR pPath, BundleFileLocation bundleFileLocation)

m_path = pPath;
m_path.Normalize();
m_pathHash = m_path.HashCaseInsensitive();
m_bundleFileLocation = bundleFileLocation;
SetModuleFileNameHintForDAC();
}
Expand All@@ -310,11 +311,7 @@ inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath, BOOL isInBundle /* = TRUE
int CaseHashHelper(const WCHAR *buffer, COUNT_T count);

PEImageLocator locator(pPath, isInBundle);
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
DWORD dwHash=path.Hash();
#else
DWORD dwHash = CaseHashHelper(pPath, (COUNT_T) u16_strlen(pPath));
#endif
return (PEImage *) s_Images->LookupValue(dwHash, &locator);
}

Expand DownExpand Up@@ -366,7 +363,7 @@ inline void PEImage::AddToHashMap()
CONTRACTL_END;

_ASSERTE(s_hashLock.OwnedByCurrentThread());
s_Images->InsertValue(GetPathHash(),this);
s_Images->InsertValue(m_pathHash,this);
m_bInHashMap=TRUE;
}

Expand All@@ -378,31 +375,6 @@ inline BOOL PEImage::Has32BitNTHeaders()
return GetOrCreateLayout(PEImageLayout::LAYOUT_ANY)->Has32BitNTHeaders();
}

inline BOOL PEImage::HasPath()
{
LIMITED_METHOD_CONTRACT;

return !GetPath().IsEmpty();
}

inline ULONG PEImage::GetPathHash()
{
CONTRACT(ULONG)
{
PRECONDITION(HasPath());
MODE_ANY;
GC_NOTRIGGER;
THROWS;
}
CONTRACT_END;

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
RETURN m_path.Hash();
#else
RETURN m_path.HashCaseInsensitive();
#endif
}

inline void PEImage::GetPEKindAndMachine(DWORD* pdwKind, DWORD* pdwMachine)
{
CONTRACTL
Expand Down
15 changes: 12 additions & 3 deletions src/coreclr/vm/peimagelayout.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -534,7 +534,10 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)

IfFailThrow(Init(m_Module, true));

LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

#else
HANDLE hFile = pOwner->GetFileHandle();
Expand All@@ -548,8 +551,11 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)
return;
}

#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: image %s (hFile %p) mapped @ %p\n",
pOwner->GetPath().GetUTF8(), hFile, (void*)m_LoadedFile));
ownerPath.GetUTF8(), hFile, (void*)m_LoadedFile));
#endif // LOGGING

IfFailThrow(Init((void*)m_LoadedFile));

Expand DownExpand Up@@ -616,7 +622,10 @@ FlatImageLayout::FlatImageLayout(PEImage* pOwner)
INT64 offset = pOwner->GetOffset();
INT64 size = pOwner->GetSize();

LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

// If a size is not specified, load the whole file
if (size == 0)
Expand Down
7 changes: 4 additions & 3 deletions src/coreclr/vm/readytoruninfo.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -429,7 +429,8 @@ static void LogR2r(const char *msg, PEAssembly *pPEAssembly)
if (r2rLogFile == NULL)
return;

fprintf(r2rLogFile, "%s: \"%s\".\n", msg, pPEAssembly->GetPath().GetUTF8());
SString assemblyPath{ pPEAssembly->GetPath() };
fprintf(r2rLogFile, "%s: \"%s\".\n", msg, assemblyPath.GetUTF8());
fflush(r2rLogFile);
}

Expand DownExpand Up@@ -1904,7 +1905,7 @@ uint32_t ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCount(mdTypeDef input,
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand All@@ -1922,7 +1923,7 @@ HRESULT ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCountNoThrow(mdTypeDef
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' `PEImage` should not permit `m_path` field mutation by AaronRobinsonMSFT · Pull Request #90753 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/coreclr/debug/daccess/request.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -2642,8 +2642,7 @@ ClrDataAccess::GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, _Inout_u
// Turn from bytes to wide characters
if (!pAssembly->GetPEAssembly()->GetPath().IsEmpty())
{
if (!pAssembly->GetPEAssembly()->GetPath().
DacGetUnicode(count, location, pNeeded))
if (!pAssembly->GetPEAssembly()->GetPath().DacGetUnicode(count, location, pNeeded))
{
hr = E_FAIL;
}
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/inc/sstring.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -683,7 +683,9 @@ class EMPTY_BASES_DECL SString : private SBuffer
BOOL IsASCIIScanned() const;
void SetASCIIScanned() const;
void SetNormalized() const;
public:
BOOL IsNormalized() const;
private:
void ClearNormalized() const;

void EnsureWritable() const;
Expand Down
8 changes: 0 additions & 8 deletions src/coreclr/md/compiler/mdutil.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -265,11 +265,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand DownExpand Up@@ -299,11 +295,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand Down
8 changes: 3 additions & 5 deletions src/coreclr/vm/dwbucketmanager.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -960,11 +960,9 @@ bool BaseBucketParamsManager::GetFileVersionInfoForModule(Module* pModule, USHOR
// if we failed to get the version info from the native image then fall back to the IL image.
if (!succeeded)
{
LPCWSTR modulePath = pPEAssembly->GetPath().GetUnicode();
if (modulePath != NULL && modulePath != SString::Empty() && SUCCEEDED(DwGetFileVersionInfo(modulePath, major, minor, build, revision)))
{
succeeded = true;
}
const SString& modulePath = pPEAssembly->GetPath();
_ASSERTE(modulePath.IsNormalized());
succeeded = !modulePath.IsEmpty() && SUCCEEDED(DwGetFileVersionInfo(modulePath.GetUnicode(), major, minor, build, revision));
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/coreclr/vm/excep.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -11616,7 +11616,8 @@ VOID GetAssemblyDetailInfo(SString &sType,

SString sAlcName;
pPEAssembly->GetAssemblyBinder()->GetNameForDiagnostics(sAlcName);
if (pPEAssembly->GetPath().IsEmpty())
SString assemblyPath{ pPEAssembly->GetPath() };
if (assemblyPath.IsEmpty())
{
detailsUtf8.Printf("Type %s originates from '%s' in the context '%s' in a byte array",
sType.GetUTF8(),
Expand All@@ -11629,7 +11630,7 @@ VOID GetAssemblyDetailInfo(SString &sType,
sType.GetUTF8(),
sAssemblyDisplayName.GetUTF8(),
sAlcName.GetUTF8(),
pPEAssembly->GetPath().GetUTF8());
assemblyPath.GetUTF8());
}

sAssemblyDetailInfo.Append(detailsUtf8.GetUnicode());
Expand Down
10 changes: 3 additions & 7 deletions src/coreclr/vm/peimage.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -141,11 +141,11 @@ ULONG PEImage::Release()
result=InterlockedDecrement(&m_refCount);
if (result == 0 )
{
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing Image %s\n", m_path.GetUTF8()));
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing %p\n", this));
if(m_bInHashMap)
{
PEImageLocator locator(this);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(GetPathHash(), &locator);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(m_pathHash, &locator);
_ASSERTE(deleted == this);
}
}
Expand DownExpand Up@@ -249,12 +249,7 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2)
EX_TRY
{
SString path(SString::Literal, pLocator->m_pPath);

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (pImage->GetPath().Equals(path))
#else
if (pImage->GetPath().EqualsCaseInsensitive(path))
#endif
{
ret = TRUE;
}
Expand DownExpand Up@@ -623,6 +618,7 @@ void PEImage::EnumMemoryRegions(CLRDataEnumMemoryFlags flags)

PEImage::PEImage():
m_path(),
m_pathHash(0),
m_refCount(1),
m_bInHashMap(FALSE),
m_bundleFileLocation(),
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/vm/peimage.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -132,8 +132,6 @@ class PEImage final
PTR_PEImageLayout GetLoadedLayout();
PTR_PEImageLayout GetFlatLayout();

BOOL HasPath();
ULONG GetPathHash();
const SString& GetPath();
const SString& GetPathToLoad();
LPCWSTR GetPathForErrorMessages() { return GetPath(); }
Expand DownExpand Up@@ -288,6 +286,7 @@ class PEImage final
// ------------------------------------------------------------

SString m_path;
ULONG m_pathHash;
LONG m_refCount;

// means this is a unique (deduped) instance.
Expand Down
32 changes: 2 additions & 30 deletions src/coreclr/vm/peimage.inl
Original file line numberDiff line numberDiff line change
Expand Up@@ -288,6 +288,7 @@ inline void PEImage::Init(LPCWSTR pPath, BundleFileLocation bundleFileLocation)

m_path = pPath;
m_path.Normalize();
m_pathHash = m_path.HashCaseInsensitive();
m_bundleFileLocation = bundleFileLocation;
SetModuleFileNameHintForDAC();
}
Expand All@@ -310,11 +311,7 @@ inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath, BOOL isInBundle /* = TRUE
int CaseHashHelper(const WCHAR *buffer, COUNT_T count);

PEImageLocator locator(pPath, isInBundle);
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
DWORD dwHash=path.Hash();
#else
DWORD dwHash = CaseHashHelper(pPath, (COUNT_T) u16_strlen(pPath));
#endif
return (PEImage *) s_Images->LookupValue(dwHash, &locator);
}

Expand DownExpand Up@@ -366,7 +363,7 @@ inline void PEImage::AddToHashMap()
CONTRACTL_END;

_ASSERTE(s_hashLock.OwnedByCurrentThread());
s_Images->InsertValue(GetPathHash(),this);
s_Images->InsertValue(m_pathHash,this);
m_bInHashMap=TRUE;
}

Expand All@@ -378,31 +375,6 @@ inline BOOL PEImage::Has32BitNTHeaders()
return GetOrCreateLayout(PEImageLayout::LAYOUT_ANY)->Has32BitNTHeaders();
}

inline BOOL PEImage::HasPath()
{
LIMITED_METHOD_CONTRACT;

return !GetPath().IsEmpty();
}

inline ULONG PEImage::GetPathHash()
{
CONTRACT(ULONG)
{
PRECONDITION(HasPath());
MODE_ANY;
GC_NOTRIGGER;
THROWS;
}
CONTRACT_END;

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
RETURN m_path.Hash();
#else
RETURN m_path.HashCaseInsensitive();
#endif
}

inline void PEImage::GetPEKindAndMachine(DWORD* pdwKind, DWORD* pdwMachine)
{
CONTRACTL
Expand Down
15 changes: 12 additions & 3 deletions src/coreclr/vm/peimagelayout.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -534,7 +534,10 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)

IfFailThrow(Init(m_Module, true));

LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

#else
HANDLE hFile = pOwner->GetFileHandle();
Expand All@@ -548,8 +551,11 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)
return;
}

#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: image %s (hFile %p) mapped @ %p\n",
pOwner->GetPath().GetUTF8(), hFile, (void*)m_LoadedFile));
ownerPath.GetUTF8(), hFile, (void*)m_LoadedFile));
#endif // LOGGING

IfFailThrow(Init((void*)m_LoadedFile));

Expand DownExpand Up@@ -616,7 +622,10 @@ FlatImageLayout::FlatImageLayout(PEImage* pOwner)
INT64 offset = pOwner->GetOffset();
INT64 size = pOwner->GetSize();

LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

// If a size is not specified, load the whole file
if (size == 0)
Expand Down
7 changes: 4 additions & 3 deletions src/coreclr/vm/readytoruninfo.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -429,7 +429,8 @@ static void LogR2r(const char *msg, PEAssembly *pPEAssembly)
if (r2rLogFile == NULL)
return;

fprintf(r2rLogFile, "%s: \"%s\".\n", msg, pPEAssembly->GetPath().GetUTF8());
SString assemblyPath{ pPEAssembly->GetPath() };
fprintf(r2rLogFile, "%s: \"%s\".\n", msg, assemblyPath.GetUTF8());
fflush(r2rLogFile);
}

Expand DownExpand Up@@ -1904,7 +1905,7 @@ uint32_t ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCount(mdTypeDef input,
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand All@@ -1922,7 +1923,7 @@ HRESULT ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCountNoThrow(mdTypeDef
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' `PEImage` should not permit `m_path` field mutation by AaronRobinsonMSFT · Pull Request #90753 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/coreclr/debug/daccess/request.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -2642,8 +2642,7 @@ ClrDataAccess::GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, _Inout_u
// Turn from bytes to wide characters
if (!pAssembly->GetPEAssembly()->GetPath().IsEmpty())
{
if (!pAssembly->GetPEAssembly()->GetPath().
DacGetUnicode(count, location, pNeeded))
if (!pAssembly->GetPEAssembly()->GetPath().DacGetUnicode(count, location, pNeeded))
{
hr = E_FAIL;
}
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/inc/sstring.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -683,7 +683,9 @@ class EMPTY_BASES_DECL SString : private SBuffer
BOOL IsASCIIScanned() const;
void SetASCIIScanned() const;
void SetNormalized() const;
public:
BOOL IsNormalized() const;
private:
void ClearNormalized() const;

void EnsureWritable() const;
Expand Down
8 changes: 0 additions & 8 deletions src/coreclr/md/compiler/mdutil.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -265,11 +265,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand DownExpand Up@@ -299,11 +295,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand Down
8 changes: 3 additions & 5 deletions src/coreclr/vm/dwbucketmanager.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -960,11 +960,9 @@ bool BaseBucketParamsManager::GetFileVersionInfoForModule(Module* pModule, USHOR
// if we failed to get the version info from the native image then fall back to the IL image.
if (!succeeded)
{
LPCWSTR modulePath = pPEAssembly->GetPath().GetUnicode();
if (modulePath != NULL && modulePath != SString::Empty() && SUCCEEDED(DwGetFileVersionInfo(modulePath, major, minor, build, revision)))
{
succeeded = true;
}
const SString& modulePath = pPEAssembly->GetPath();
_ASSERTE(modulePath.IsNormalized());
succeeded = !modulePath.IsEmpty() && SUCCEEDED(DwGetFileVersionInfo(modulePath.GetUnicode(), major, minor, build, revision));
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/coreclr/vm/excep.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -11616,7 +11616,8 @@ VOID GetAssemblyDetailInfo(SString &sType,

SString sAlcName;
pPEAssembly->GetAssemblyBinder()->GetNameForDiagnostics(sAlcName);
if (pPEAssembly->GetPath().IsEmpty())
SString assemblyPath{ pPEAssembly->GetPath() };
if (assemblyPath.IsEmpty())
{
detailsUtf8.Printf("Type %s originates from '%s' in the context '%s' in a byte array",
sType.GetUTF8(),
Expand All@@ -11629,7 +11630,7 @@ VOID GetAssemblyDetailInfo(SString &sType,
sType.GetUTF8(),
sAssemblyDisplayName.GetUTF8(),
sAlcName.GetUTF8(),
pPEAssembly->GetPath().GetUTF8());
assemblyPath.GetUTF8());
}

sAssemblyDetailInfo.Append(detailsUtf8.GetUnicode());
Expand Down
10 changes: 3 additions & 7 deletions src/coreclr/vm/peimage.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -141,11 +141,11 @@ ULONG PEImage::Release()
result=InterlockedDecrement(&m_refCount);
if (result == 0 )
{
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing Image %s\n", m_path.GetUTF8()));
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing %p\n", this));
if(m_bInHashMap)
{
PEImageLocator locator(this);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(GetPathHash(), &locator);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(m_pathHash, &locator);
_ASSERTE(deleted == this);
}
}
Expand DownExpand Up@@ -249,12 +249,7 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2)
EX_TRY
{
SString path(SString::Literal, pLocator->m_pPath);

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (pImage->GetPath().Equals(path))
#else
if (pImage->GetPath().EqualsCaseInsensitive(path))
#endif
{
ret = TRUE;
}
Expand DownExpand Up@@ -623,6 +618,7 @@ void PEImage::EnumMemoryRegions(CLRDataEnumMemoryFlags flags)

PEImage::PEImage():
m_path(),
m_pathHash(0),
m_refCount(1),
m_bInHashMap(FALSE),
m_bundleFileLocation(),
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/vm/peimage.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -132,8 +132,6 @@ class PEImage final
PTR_PEImageLayout GetLoadedLayout();
PTR_PEImageLayout GetFlatLayout();

BOOL HasPath();
ULONG GetPathHash();
const SString& GetPath();
const SString& GetPathToLoad();
LPCWSTR GetPathForErrorMessages() { return GetPath(); }
Expand DownExpand Up@@ -288,6 +286,7 @@ class PEImage final
// ------------------------------------------------------------

SString m_path;
ULONG m_pathHash;
LONG m_refCount;

// means this is a unique (deduped) instance.
Expand Down
32 changes: 2 additions & 30 deletions src/coreclr/vm/peimage.inl
Original file line numberDiff line numberDiff line change
Expand Up@@ -288,6 +288,7 @@ inline void PEImage::Init(LPCWSTR pPath, BundleFileLocation bundleFileLocation)

m_path = pPath;
m_path.Normalize();
m_pathHash = m_path.HashCaseInsensitive();
m_bundleFileLocation = bundleFileLocation;
SetModuleFileNameHintForDAC();
}
Expand All@@ -310,11 +311,7 @@ inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath, BOOL isInBundle /* = TRUE
int CaseHashHelper(const WCHAR *buffer, COUNT_T count);

PEImageLocator locator(pPath, isInBundle);
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
DWORD dwHash=path.Hash();
#else
DWORD dwHash = CaseHashHelper(pPath, (COUNT_T) u16_strlen(pPath));
#endif
return (PEImage *) s_Images->LookupValue(dwHash, &locator);
}

Expand DownExpand Up@@ -366,7 +363,7 @@ inline void PEImage::AddToHashMap()
CONTRACTL_END;

_ASSERTE(s_hashLock.OwnedByCurrentThread());
s_Images->InsertValue(GetPathHash(),this);
s_Images->InsertValue(m_pathHash,this);
m_bInHashMap=TRUE;
}

Expand All@@ -378,31 +375,6 @@ inline BOOL PEImage::Has32BitNTHeaders()
return GetOrCreateLayout(PEImageLayout::LAYOUT_ANY)->Has32BitNTHeaders();
}

inline BOOL PEImage::HasPath()
{
LIMITED_METHOD_CONTRACT;

return !GetPath().IsEmpty();
}

inline ULONG PEImage::GetPathHash()
{
CONTRACT(ULONG)
{
PRECONDITION(HasPath());
MODE_ANY;
GC_NOTRIGGER;
THROWS;
}
CONTRACT_END;

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
RETURN m_path.Hash();
#else
RETURN m_path.HashCaseInsensitive();
#endif
}

inline void PEImage::GetPEKindAndMachine(DWORD* pdwKind, DWORD* pdwMachine)
{
CONTRACTL
Expand Down
15 changes: 12 additions & 3 deletions src/coreclr/vm/peimagelayout.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -534,7 +534,10 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)

IfFailThrow(Init(m_Module, true));

LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

#else
HANDLE hFile = pOwner->GetFileHandle();
Expand All@@ -548,8 +551,11 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)
return;
}

#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: image %s (hFile %p) mapped @ %p\n",
pOwner->GetPath().GetUTF8(), hFile, (void*)m_LoadedFile));
ownerPath.GetUTF8(), hFile, (void*)m_LoadedFile));
#endif // LOGGING

IfFailThrow(Init((void*)m_LoadedFile));

Expand DownExpand Up@@ -616,7 +622,10 @@ FlatImageLayout::FlatImageLayout(PEImage* pOwner)
INT64 offset = pOwner->GetOffset();
INT64 size = pOwner->GetSize();

LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

// If a size is not specified, load the whole file
if (size == 0)
Expand Down
7 changes: 4 additions & 3 deletions src/coreclr/vm/readytoruninfo.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -429,7 +429,8 @@ static void LogR2r(const char *msg, PEAssembly *pPEAssembly)
if (r2rLogFile == NULL)
return;

fprintf(r2rLogFile, "%s: \"%s\".\n", msg, pPEAssembly->GetPath().GetUTF8());
SString assemblyPath{ pPEAssembly->GetPath() };
fprintf(r2rLogFile, "%s: \"%s\".\n", msg, assemblyPath.GetUTF8());
fflush(r2rLogFile);
}

Expand DownExpand Up@@ -1904,7 +1905,7 @@ uint32_t ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCount(mdTypeDef input,
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand All@@ -1922,7 +1923,7 @@ HRESULT ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCountNoThrow(mdTypeDef
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' `PEImage` should not permit `m_path` field mutation by AaronRobinsonMSFT · Pull Request #90753 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/coreclr/debug/daccess/request.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -2642,8 +2642,7 @@ ClrDataAccess::GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, _Inout_u
// Turn from bytes to wide characters
if (!pAssembly->GetPEAssembly()->GetPath().IsEmpty())
{
if (!pAssembly->GetPEAssembly()->GetPath().
DacGetUnicode(count, location, pNeeded))
if (!pAssembly->GetPEAssembly()->GetPath().DacGetUnicode(count, location, pNeeded))
{
hr = E_FAIL;
}
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/inc/sstring.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -683,7 +683,9 @@ class EMPTY_BASES_DECL SString : private SBuffer
BOOL IsASCIIScanned() const;
void SetASCIIScanned() const;
void SetNormalized() const;
public:
BOOL IsNormalized() const;
private:
void ClearNormalized() const;

void EnsureWritable() const;
Expand Down
8 changes: 0 additions & 8 deletions src/coreclr/md/compiler/mdutil.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -265,11 +265,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand DownExpand Up@@ -299,11 +295,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand Down
8 changes: 3 additions & 5 deletions src/coreclr/vm/dwbucketmanager.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -960,11 +960,9 @@ bool BaseBucketParamsManager::GetFileVersionInfoForModule(Module* pModule, USHOR
// if we failed to get the version info from the native image then fall back to the IL image.
if (!succeeded)
{
LPCWSTR modulePath = pPEAssembly->GetPath().GetUnicode();
if (modulePath != NULL && modulePath != SString::Empty() && SUCCEEDED(DwGetFileVersionInfo(modulePath, major, minor, build, revision)))
{
succeeded = true;
}
const SString& modulePath = pPEAssembly->GetPath();
_ASSERTE(modulePath.IsNormalized());
succeeded = !modulePath.IsEmpty() && SUCCEEDED(DwGetFileVersionInfo(modulePath.GetUnicode(), major, minor, build, revision));
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/coreclr/vm/excep.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -11616,7 +11616,8 @@ VOID GetAssemblyDetailInfo(SString &sType,

SString sAlcName;
pPEAssembly->GetAssemblyBinder()->GetNameForDiagnostics(sAlcName);
if (pPEAssembly->GetPath().IsEmpty())
SString assemblyPath{ pPEAssembly->GetPath() };
if (assemblyPath.IsEmpty())
{
detailsUtf8.Printf("Type %s originates from '%s' in the context '%s' in a byte array",
sType.GetUTF8(),
Expand All@@ -11629,7 +11630,7 @@ VOID GetAssemblyDetailInfo(SString &sType,
sType.GetUTF8(),
sAssemblyDisplayName.GetUTF8(),
sAlcName.GetUTF8(),
pPEAssembly->GetPath().GetUTF8());
assemblyPath.GetUTF8());
}

sAssemblyDetailInfo.Append(detailsUtf8.GetUnicode());
Expand Down
10 changes: 3 additions & 7 deletions src/coreclr/vm/peimage.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -141,11 +141,11 @@ ULONG PEImage::Release()
result=InterlockedDecrement(&m_refCount);
if (result == 0 )
{
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing Image %s\n", m_path.GetUTF8()));
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing %p\n", this));
if(m_bInHashMap)
{
PEImageLocator locator(this);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(GetPathHash(), &locator);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(m_pathHash, &locator);
_ASSERTE(deleted == this);
}
}
Expand DownExpand Up@@ -249,12 +249,7 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2)
EX_TRY
{
SString path(SString::Literal, pLocator->m_pPath);

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (pImage->GetPath().Equals(path))
#else
if (pImage->GetPath().EqualsCaseInsensitive(path))
#endif
{
ret = TRUE;
}
Expand DownExpand Up@@ -623,6 +618,7 @@ void PEImage::EnumMemoryRegions(CLRDataEnumMemoryFlags flags)

PEImage::PEImage():
m_path(),
m_pathHash(0),
m_refCount(1),
m_bInHashMap(FALSE),
m_bundleFileLocation(),
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/vm/peimage.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -132,8 +132,6 @@ class PEImage final
PTR_PEImageLayout GetLoadedLayout();
PTR_PEImageLayout GetFlatLayout();

BOOL HasPath();
ULONG GetPathHash();
const SString& GetPath();
const SString& GetPathToLoad();
LPCWSTR GetPathForErrorMessages() { return GetPath(); }
Expand DownExpand Up@@ -288,6 +286,7 @@ class PEImage final
// ------------------------------------------------------------

SString m_path;
ULONG m_pathHash;
LONG m_refCount;

// means this is a unique (deduped) instance.
Expand Down
32 changes: 2 additions & 30 deletions src/coreclr/vm/peimage.inl
Original file line numberDiff line numberDiff line change
Expand Up@@ -288,6 +288,7 @@ inline void PEImage::Init(LPCWSTR pPath, BundleFileLocation bundleFileLocation)

m_path = pPath;
m_path.Normalize();
m_pathHash = m_path.HashCaseInsensitive();
m_bundleFileLocation = bundleFileLocation;
SetModuleFileNameHintForDAC();
}
Expand All@@ -310,11 +311,7 @@ inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath, BOOL isInBundle /* = TRUE
int CaseHashHelper(const WCHAR *buffer, COUNT_T count);

PEImageLocator locator(pPath, isInBundle);
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
DWORD dwHash=path.Hash();
#else
DWORD dwHash = CaseHashHelper(pPath, (COUNT_T) u16_strlen(pPath));
#endif
return (PEImage *) s_Images->LookupValue(dwHash, &locator);
}

Expand DownExpand Up@@ -366,7 +363,7 @@ inline void PEImage::AddToHashMap()
CONTRACTL_END;

_ASSERTE(s_hashLock.OwnedByCurrentThread());
s_Images->InsertValue(GetPathHash(),this);
s_Images->InsertValue(m_pathHash,this);
m_bInHashMap=TRUE;
}

Expand All@@ -378,31 +375,6 @@ inline BOOL PEImage::Has32BitNTHeaders()
return GetOrCreateLayout(PEImageLayout::LAYOUT_ANY)->Has32BitNTHeaders();
}

inline BOOL PEImage::HasPath()
{
LIMITED_METHOD_CONTRACT;

return !GetPath().IsEmpty();
}

inline ULONG PEImage::GetPathHash()
{
CONTRACT(ULONG)
{
PRECONDITION(HasPath());
MODE_ANY;
GC_NOTRIGGER;
THROWS;
}
CONTRACT_END;

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
RETURN m_path.Hash();
#else
RETURN m_path.HashCaseInsensitive();
#endif
}

inline void PEImage::GetPEKindAndMachine(DWORD* pdwKind, DWORD* pdwMachine)
{
CONTRACTL
Expand Down
15 changes: 12 additions & 3 deletions src/coreclr/vm/peimagelayout.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -534,7 +534,10 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)

IfFailThrow(Init(m_Module, true));

LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

#else
HANDLE hFile = pOwner->GetFileHandle();
Expand All@@ -548,8 +551,11 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)
return;
}

#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: image %s (hFile %p) mapped @ %p\n",
pOwner->GetPath().GetUTF8(), hFile, (void*)m_LoadedFile));
ownerPath.GetUTF8(), hFile, (void*)m_LoadedFile));
#endif // LOGGING

IfFailThrow(Init((void*)m_LoadedFile));

Expand DownExpand Up@@ -616,7 +622,10 @@ FlatImageLayout::FlatImageLayout(PEImage* pOwner)
INT64 offset = pOwner->GetOffset();
INT64 size = pOwner->GetSize();

LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

// If a size is not specified, load the whole file
if (size == 0)
Expand Down
7 changes: 4 additions & 3 deletions src/coreclr/vm/readytoruninfo.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -429,7 +429,8 @@ static void LogR2r(const char *msg, PEAssembly *pPEAssembly)
if (r2rLogFile == NULL)
return;

fprintf(r2rLogFile, "%s: \"%s\".\n", msg, pPEAssembly->GetPath().GetUTF8());
SString assemblyPath{ pPEAssembly->GetPath() };
fprintf(r2rLogFile, "%s: \"%s\".\n", msg, assemblyPath.GetUTF8());
fflush(r2rLogFile);
}

Expand DownExpand Up@@ -1904,7 +1905,7 @@ uint32_t ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCount(mdTypeDef input,
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand All@@ -1922,7 +1923,7 @@ HRESULT ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCountNoThrow(mdTypeDef
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); `PEImage` should not permit `m_path` field mutation by AaronRobinsonMSFT · Pull Request #90753 · dotnet/runtime · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/coreclr/debug/daccess/request.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -2642,8 +2642,7 @@ ClrDataAccess::GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, _Inout_u
// Turn from bytes to wide characters
if (!pAssembly->GetPEAssembly()->GetPath().IsEmpty())
{
if (!pAssembly->GetPEAssembly()->GetPath().
DacGetUnicode(count, location, pNeeded))
if (!pAssembly->GetPEAssembly()->GetPath().DacGetUnicode(count, location, pNeeded))
{
hr = E_FAIL;
}
Expand Down
2 changes: 2 additions & 0 deletions src/coreclr/inc/sstring.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -683,7 +683,9 @@ class EMPTY_BASES_DECL SString : private SBuffer
BOOL IsASCIIScanned() const;
void SetASCIIScanned() const;
void SetNormalized() const;
public:
BOOL IsNormalized() const;
private:
void ClearNormalized() const;

void EnsureWritable() const;
Expand Down
8 changes: 0 additions & 8 deletions src/coreclr/md/compiler/mdutil.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -265,11 +265,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand DownExpand Up@@ -299,11 +295,7 @@ HRESULT LOADEDMODULES::FindCachedReadOnlyEntry(
{
// If the name matches...
LPCWSTR pszName = pRegMeta->GetNameOfDBFile();
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (u16_strcmp(szName, pszName) == 0)
#else
if (SString::_wcsicmp(szName, pszName) == 0)
#endif
{
ULONG cRefs;

Expand Down
8 changes: 3 additions & 5 deletions src/coreclr/vm/dwbucketmanager.hpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -960,11 +960,9 @@ bool BaseBucketParamsManager::GetFileVersionInfoForModule(Module* pModule, USHOR
// if we failed to get the version info from the native image then fall back to the IL image.
if (!succeeded)
{
LPCWSTR modulePath = pPEAssembly->GetPath().GetUnicode();
if (modulePath != NULL && modulePath != SString::Empty() && SUCCEEDED(DwGetFileVersionInfo(modulePath, major, minor, build, revision)))
{
succeeded = true;
}
const SString& modulePath = pPEAssembly->GetPath();
_ASSERTE(modulePath.IsNormalized());
succeeded = !modulePath.IsEmpty() && SUCCEEDED(DwGetFileVersionInfo(modulePath.GetUnicode(), major, minor, build, revision));
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/coreclr/vm/excep.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -11616,7 +11616,8 @@ VOID GetAssemblyDetailInfo(SString &sType,

SString sAlcName;
pPEAssembly->GetAssemblyBinder()->GetNameForDiagnostics(sAlcName);
if (pPEAssembly->GetPath().IsEmpty())
SString assemblyPath{ pPEAssembly->GetPath() };
if (assemblyPath.IsEmpty())
{
detailsUtf8.Printf("Type %s originates from '%s' in the context '%s' in a byte array",
sType.GetUTF8(),
Expand All@@ -11629,7 +11630,7 @@ VOID GetAssemblyDetailInfo(SString &sType,
sType.GetUTF8(),
sAssemblyDisplayName.GetUTF8(),
sAlcName.GetUTF8(),
pPEAssembly->GetPath().GetUTF8());
assemblyPath.GetUTF8());
}

sAssemblyDetailInfo.Append(detailsUtf8.GetUnicode());
Expand Down
10 changes: 3 additions & 7 deletions src/coreclr/vm/peimage.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -141,11 +141,11 @@ ULONG PEImage::Release()
result=InterlockedDecrement(&m_refCount);
if (result == 0 )
{
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing Image %s\n", m_path.GetUTF8()));
LOG((LF_LOADER, LL_INFO100, "PEImage: Closing %p\n", this));
if(m_bInHashMap)
{
PEImageLocator locator(this);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(GetPathHash(), &locator);
PEImage* deleted = (PEImage *)s_Images->DeleteValue(m_pathHash, &locator);
_ASSERTE(deleted == this);
}
}
Expand DownExpand Up@@ -249,12 +249,7 @@ BOOL PEImage::CompareImage(UPTR u1, UPTR u2)
EX_TRY
{
SString path(SString::Literal, pLocator->m_pPath);

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
if (pImage->GetPath().Equals(path))
#else
if (pImage->GetPath().EqualsCaseInsensitive(path))
#endif
{
ret = TRUE;
}
Expand DownExpand Up@@ -623,6 +618,7 @@ void PEImage::EnumMemoryRegions(CLRDataEnumMemoryFlags flags)

PEImage::PEImage():
m_path(),
m_pathHash(0),
m_refCount(1),
m_bInHashMap(FALSE),
m_bundleFileLocation(),
Expand Down
3 changes: 1 addition & 2 deletions src/coreclr/vm/peimage.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -132,8 +132,6 @@ class PEImage final
PTR_PEImageLayout GetLoadedLayout();
PTR_PEImageLayout GetFlatLayout();

BOOL HasPath();
ULONG GetPathHash();
const SString& GetPath();
const SString& GetPathToLoad();
LPCWSTR GetPathForErrorMessages() { return GetPath(); }
Expand DownExpand Up@@ -288,6 +286,7 @@ class PEImage final
// ------------------------------------------------------------

SString m_path;
ULONG m_pathHash;
LONG m_refCount;

// means this is a unique (deduped) instance.
Expand Down
32 changes: 2 additions & 30 deletions src/coreclr/vm/peimage.inl
Original file line numberDiff line numberDiff line change
Expand Up@@ -288,6 +288,7 @@ inline void PEImage::Init(LPCWSTR pPath, BundleFileLocation bundleFileLocation)

m_path = pPath;
m_path.Normalize();
m_pathHash = m_path.HashCaseInsensitive();
m_bundleFileLocation = bundleFileLocation;
SetModuleFileNameHintForDAC();
}
Expand All@@ -310,11 +311,7 @@ inline PTR_PEImage PEImage::FindByPath(LPCWSTR pPath, BOOL isInBundle /* = TRUE
int CaseHashHelper(const WCHAR *buffer, COUNT_T count);

PEImageLocator locator(pPath, isInBundle);
#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
DWORD dwHash=path.Hash();
#else
DWORD dwHash = CaseHashHelper(pPath, (COUNT_T) u16_strlen(pPath));
#endif
return (PEImage *) s_Images->LookupValue(dwHash, &locator);
}

Expand DownExpand Up@@ -366,7 +363,7 @@ inline void PEImage::AddToHashMap()
CONTRACTL_END;

_ASSERTE(s_hashLock.OwnedByCurrentThread());
s_Images->InsertValue(GetPathHash(),this);
s_Images->InsertValue(m_pathHash,this);
m_bInHashMap=TRUE;
}

Expand All@@ -378,31 +375,6 @@ inline BOOL PEImage::Has32BitNTHeaders()
return GetOrCreateLayout(PEImageLayout::LAYOUT_ANY)->Has32BitNTHeaders();
}

inline BOOL PEImage::HasPath()
{
LIMITED_METHOD_CONTRACT;

return !GetPath().IsEmpty();
}

inline ULONG PEImage::GetPathHash()
{
CONTRACT(ULONG)
{
PRECONDITION(HasPath());
MODE_ANY;
GC_NOTRIGGER;
THROWS;
}
CONTRACT_END;

#ifdef FEATURE_CASE_SENSITIVE_FILESYSTEM
RETURN m_path.Hash();
#else
RETURN m_path.HashCaseInsensitive();
#endif
}

inline void PEImage::GetPEKindAndMachine(DWORD* pdwKind, DWORD* pdwMachine)
{
CONTRACTL
Expand Down
15 changes: 12 additions & 3 deletions src/coreclr/vm/peimagelayout.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -534,7 +534,10 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)

IfFailThrow(Init(m_Module, true));

LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

#else
HANDLE hFile = pOwner->GetFileHandle();
Expand All@@ -548,8 +551,11 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, HRESULT* loadFailure)
return;
}

#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO1000, "PEImage: image %s (hFile %p) mapped @ %p\n",
pOwner->GetPath().GetUTF8(), hFile, (void*)m_LoadedFile));
ownerPath.GetUTF8(), hFile, (void*)m_LoadedFile));
#endif // LOGGING

IfFailThrow(Init((void*)m_LoadedFile));

Expand DownExpand Up@@ -616,7 +622,10 @@ FlatImageLayout::FlatImageLayout(PEImage* pOwner)
INT64 offset = pOwner->GetOffset();
INT64 size = pOwner->GetSize();

LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", pOwner->GetPath().GetUTF8()));
#ifdef LOGGING
SString ownerPath{ pOwner->GetPath() };
LOG((LF_LOADER, LL_INFO100, "PEImage: Opening flat %s\n", ownerPath.GetUTF8()));
#endif // LOGGING

// If a size is not specified, load the whole file
if (size == 0)
Expand Down
7 changes: 4 additions & 3 deletions src/coreclr/vm/readytoruninfo.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -429,7 +429,8 @@ static void LogR2r(const char *msg, PEAssembly *pPEAssembly)
if (r2rLogFile == NULL)
return;

fprintf(r2rLogFile, "%s: \"%s\".\n", msg, pPEAssembly->GetPath().GetUTF8());
SString assemblyPath{ pPEAssembly->GetPath() };
fprintf(r2rLogFile, "%s: \"%s\".\n", msg, assemblyPath.GetUTF8());
fflush(r2rLogFile);
}

Expand DownExpand Up@@ -1904,7 +1905,7 @@ uint32_t ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCount(mdTypeDef input,
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand All@@ -1922,7 +1923,7 @@ HRESULT ReadyToRun_TypeGenericInfoMap::GetGenericArgumentCountNoThrow(mdTypeDef
uint32_t count = ((uint8_t)typeGenericInfo & (uint8_t)ReadyToRunTypeGenericInfo::GenericCountMask);
if (count > 2)
foundResult = false;

if (!foundResult)
{
HENUMInternalHolder hEnumTyPars(pImport);
Expand Down