Fix a bug in LoadNativeStringResource to honor the contract properly when the buffer...
authorYi Zhang (CLR) <yizhang82@users.noreply.github.com>
Fri, 2 Jun 2017 16:10:34 +0000 (09:10 -0700)
committerJan Vorlicek <janvorli@microsoft.com>
Fri, 2 Jun 2017 16:10:34 +0000 (18:10 +0200)
* Return last error properly

* adjust pcwchUsed if ERROR_INSUFFICIENT_BUFFER

* return hr

* ERROR_INSUFFICIENT_BUFFER is a win32 error....

src/nativeresources/resourcestring.cpp
src/utilcode/ccomprc.cpp
src/utilcode/sstring_com.cpp

index 236a2a3..1c3f50a 100644 (file)
@@ -38,6 +38,16 @@ int LoadNativeStringResource(const NativeStringResourceTable &nativeStringResour
         if (resourceEntry != NULL)
         {
             len = PAL_GetResourceString(NULL, resourceEntry->resourceString, szBuffer, iMax);
+            if (len == 0)
+            {
+                int hr = HRESULT_FROM_GetLastError();
+
+                // Tell the caller if the buffer isn't big enough
+                if (hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) && pcwchUsed)
+                    *pcwchUsed = iMax;
+                    
+                return hr;
+            }
         }
         else
         {
@@ -47,6 +57,8 @@ int LoadNativeStringResource(const NativeStringResourceTable &nativeStringResour
             {   
                 // The only possible failure is that that string didn't fit the buffer. So the buffer contains 
                 // partial string terminated by '\0'
+                // We could return ERROR_INSUFFICIENT_BUFFER, but we'll error on the side of caution here and
+                // actually show something (given that this is likely a scenario involving a bug/deployment issue)
                 len = iMax - 1;
             }
         }
index ed902dc..bc649e7 100644 (file)
@@ -852,9 +852,8 @@ HRESULT CCompRC::LoadString(ResourceCategory eCategory, LocaleID langId, UINT iR
 
     return hr;
 #else // !FEATURE_PAL
-    LoadNativeStringResource(NATIVE_STRING_RESOURCE_TABLE(NATIVE_STRING_RESOURCE_NAME), iResourceID,
+    return LoadNativeStringResource(NATIVE_STRING_RESOURCE_TABLE(NATIVE_STRING_RESOURCE_NAME), iResourceID,
       szBuffer, iMax, pcwchUsed);
-    return S_OK;
 #endif // !FEATURE_PAL
 }
 
index 61cf4dd..ada4c9c 100644 (file)
@@ -60,7 +60,7 @@ HRESULT SString::LoadResourceAndReturnHR(CCompRC* pResourceDLL, CCompRC::Resourc
                 // In fatal error reporting scenarios, we may not have enough memory to 
                 // allocate a larger buffer.
             
-                hr = pResourceDLL->LoadString(eCategory, resourceID, GetRawUnicode(), GetRawCount()+1,&size);
+                hr = pResourceDLL->LoadString(eCategory, resourceID, GetRawUnicode(), GetRawCount()+1, &size);
                 if (hr != HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER))
                 {
                     if (FAILED(hr))