[PATCH] mlang: Handle to small buffers in LcidToRfc1766

Detlef Riekenberg wine.dev at web.de
Mon May 25 07:05:11 CDT 2009


---
 dlls/mlang/mlang.c |   69 ++++++++++++++++++++++++++++-----------------------
 1 files changed, 38 insertions(+), 31 deletions(-)

diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c
index 079099e..89644fc 100644
--- a/dlls/mlang/mlang.c
+++ b/dlls/mlang/mlang.c
@@ -1138,57 +1138,64 @@ HRESULT WINAPI IsConvertINetStringAvailable(
 
 static inline INT lcid_to_rfc1766A( LCID lcid, LPSTR rfc1766, INT len )
 {
-    INT n = GetLocaleInfoA( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
+    CHAR buffer[MAX_RFC1766_NAME];
+    INT n = GetLocaleInfoA( lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME );
+    INT i;
     if (n)
     {
-        rfc1766[n - 1] = '-';
-        n += GetLocaleInfoA( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n );
-        LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
-        return n;
+        buffer[n - 1] = '-';
+        i = GetLocaleInfoA( lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n );
+        if (!i)
+            buffer[n - 1] = '\0';
+        
+        LCMapStringA( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, buffer, n + i, rfc1766, len );
+        return n + i;
     }
     return 0;
 }
 
 static inline INT lcid_to_rfc1766W( LCID lcid, LPWSTR rfc1766, INT len )
 {
-    INT n = GetLocaleInfoW( lcid, LOCALE_SISO639LANGNAME, rfc1766, len );
-    INT save = n;
+    WCHAR buffer[MAX_RFC1766_NAME];
+    INT n = GetLocaleInfoW( lcid, LOCALE_SISO639LANGNAME, buffer, MAX_RFC1766_NAME );
+    INT i;
     if (n)
     {
-        rfc1766[n - 1] = '-';
-        n += GetLocaleInfoW( lcid, LOCALE_SISO3166CTRYNAME, rfc1766 + n, len - n );
-        if (n == save)
-            rfc1766[n - 1] = '\0';
-        LCMapStringW( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, rfc1766, n, rfc1766, len );
-        return n;
+        buffer[n - 1] = '-';
+        i = GetLocaleInfoW( lcid, LOCALE_SISO3166CTRYNAME, buffer + n, MAX_RFC1766_NAME - n );
+        if (!i)
+            buffer[n - 1] = '\0';
+        
+        LCMapStringW( LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, buffer, n + i, rfc1766, len );
+        return n + i;
     }
     return 0;
 }
 
-HRESULT WINAPI LcidToRfc1766A(
-    LCID lcid,
-    LPSTR pszRfc1766,
-    INT nChar)
+HRESULT WINAPI LcidToRfc1766A(LCID lcid, LPSTR pszRfc1766, INT nChar)
 {
-    TRACE("%04x %p %u\n", lcid, pszRfc1766, nChar);
-
-    if (lcid_to_rfc1766A( lcid, pszRfc1766, nChar ))
-        return S_OK;
+    INT n;
 
-    return S_FALSE;
+    TRACE("(0x%04x, %p, %d)\n", lcid, pszRfc1766, nChar);
+    if (pszRfc1766) {
+        n = lcid_to_rfc1766A( lcid, pszRfc1766, nChar );
+        if ((n > 0) && (n <= nChar))
+            return S_OK;
+    }
+    return E_INVALIDARG;
 }
 
-HRESULT WINAPI LcidToRfc1766W(
-    LCID lcid,
-    LPWSTR pszRfc1766,
-    INT nChar)
+HRESULT WINAPI LcidToRfc1766W(LCID lcid, LPWSTR pszRfc1766, INT nChar)
 {
-    TRACE("%04x %p %u\n", lcid, pszRfc1766, nChar);
-
-    if (lcid_to_rfc1766W( lcid, pszRfc1766, nChar ))
-        return S_OK;
+    INT n;
 
-    return S_FALSE;
+    TRACE("(0x%04x, %p, %d)\n", lcid, pszRfc1766, nChar);
+    if (pszRfc1766) {
+        n = lcid_to_rfc1766W( lcid, pszRfc1766, nChar );
+        if ((n > 0) && (n <= nChar))
+            return S_OK;
+    }
+    return E_INVALIDARG;
 }
 
 static HRESULT lcid_from_rfc1766(IEnumRfc1766 *iface, LCID *lcid, LPCWSTR rfc1766, BOOL lazy)
-- 
1.5.4.3


--=-SnqBp9uFQCwYa7ieChvt--




More information about the wine-patches mailing list