[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