Hi,
This is more a FYI patch and GCC 4.0+ specific.
This enhancement detects if the size of a known buffer is different than
the specified size.
Thie tests/sock.c adjustement is necessary due to stdlib.h inclusion.
Ciao, Marcus
---
dlls/kernel32/locale.c | 2 ++
dlls/ws2_32/tests/sock.c | 2 +-
include/winnls.h | 45 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 48 insertions(+), 1 deletions(-)
d0e7840335b6bbe4990b1c043dcff9b298c7a5a8
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index bc7db75..1d4ceaf 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -1757,6 +1757,7 @@ BOOL WINAPI EnumSystemCodePagesW( CODEPA
* is passed, and ERROR_NO_UNICODE_TRANSLATION if no translation is
* possible for src.
*/
+#undef MultiByteToWideChar
INT WINAPI MultiByteToWideChar( UINT page, DWORD flags, LPCSTR src, INT srclen,
LPWSTR dst, INT dstlen )
{
@@ -1850,6 +1851,7 @@ INT WINAPI MultiByteToWideChar( UINT pag
* and dstlen != 0, and ERROR_INVALID_PARAMETER, if an invalid
* parameter was given.
*/
+#undef WideCharToMultiByte
INT WINAPI WideCharToMultiByte( UINT page, DWORD flags, LPCWSTR src, INT srclen,
LPSTR dst, INT dstlen, LPCSTR defchar, BOOL *used )
{
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index c8b9cc8..f5ed0c1 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -22,8 +22,8 @@
#include <stdarg.h>
#include <windef.h>
-#include <winbase.h>
#include <winsock2.h>
+#include <winbase.h>
#include <mswsock.h>
#include "wine/test.h"
#include <winnt.h>
diff --git a/include/winnls.h b/include/winnls.h
index 8888171..c13c0bf 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -20,6 +20,10 @@
#define __WINE_WINNLS_H
#ifndef NONLS
+#ifndef RC_INVOKED
+# include <stdlib.h>
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -768,6 +772,26 @@ INT WINAPI LCMapStringW(LCID,DWO
#define LCMapString WINELIB_NAME_AW(LCMapString)
LCID WINAPI LocaleNameToLCID(LPCWSTR,DWORD);
INT WINAPI MultiByteToWideChar(UINT,DWORD,LPCSTR,INT,LPWSTR,INT);
+
+static inline INT
+WINAPI MultiByteToWideChar_ichk(
+ UINT cp,DWORD flags,
+ LPCSTR src,INT srclen,INT srcbuflen,
+ LPWSTR dst,INT dstlen,INT dstbuflen
+) {
+ if ((srclen != -1) && (srcbuflen != -1) && (srcbuflen < srclen))
+ abort();
+ if ((dstlen != -1) && (dstbuflen != -1) && (dstbuflen/2 < dstlen))
+ abort();
+ /* later add assertions regarding conversion lengths */
+ return MultiByteToWideChar(cp,flags,src,srclen,dst,dstlen);
+}
+#define MultiByteToWideChar(cp,flags,src,srclen,dst,dstlen) \
+ MultiByteToWideChar_ichk(cp,flags, \
+ src,srclen,__builtin_object_size(src,0), \
+ dst,dstlen,__builtin_object_size(dst,0) \
+ )
+
INT WINAPI SetCalendarInfoA(LCID,CALID,CALTYPE,LPCSTR);
INT WINAPI SetCalendarInfoW(LCID,CALID,CALTYPE,LPCWSTR);
#define SetCalendarInfo WINELIB_NAME_AW(SetCalendarInfo)
@@ -778,6 +802,27 @@ BOOL WINAPI SetThreadLocale(LCID)
BOOL WINAPI SetUserGeoID(GEOID);
INT WINAPI WideCharToMultiByte(UINT,DWORD,LPCWSTR,INT,LPSTR,INT,LPCSTR,LPBOOL);
+static inline INT
+WINAPI WideCharToMultiByte_ichk(
+ UINT cp,DWORD flags,
+ LPCWSTR src,INT srclen,INT srcbuflen,
+ LPSTR dst,INT dstlen,INT dstbuflen,
+ LPCSTR xstr,LPBOOL b
+) {
+ if ((srclen != -1) && (srcbuflen != -1) && (srcbuflen/2 < srclen))
+ abort();
+ if ((dstlen != -1) && (dstbuflen != -1) && (dstbuflen < dstlen))
+ abort();
+ /* later add assertions regarding conversion lengths */
+ return WideCharToMultiByte(cp,flags,src,srclen,dst,dstlen,xstr,b);
+}
+#define WideCharToMultiByte(cp,flags,src,srclen,dst,dstlen,defchar,b) \
+ WideCharToMultiByte_ichk(cp,flags, \
+ src,srclen,__builtin_object_size(src,0), \
+ dst,dstlen,__builtin_object_size(dst,0), \
+ defchar,b \
+ )
+
#ifdef __cplusplus
}
#endif
--
1.2.4