[PATCH] atl: also handle struct sizes for 64bit
Marcus Meissner
meissner at suse.de
Tue Jun 15 04:04:33 CDT 2010
Hi,
Yet another improved version of the struct size checking.
adjusted:
- check every value between 0 and 511.
- use sizeof() where possible.
Not sure if those struct shouldnt be global somewhere,
but this is a bit difficult due to ATL being C++ usually.
Ciao, Marcus
---
configure | 1 +
configure.ac | 1 +
dlls/atl/atl_main.c | 12 ++++-
dlls/atl/tests/Makefile.in | 11 +++++
dlls/atl/tests/module.c | 108 ++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 131 insertions(+), 2 deletions(-)
create mode 100644 dlls/atl/tests/Makefile.in
create mode 100644 dlls/atl/tests/module.c
diff --git a/configure b/configure
index 5e20b93..a01d5f6 100755
--- a/configure
+++ b/configure
@@ -14288,6 +14288,7 @@ wine_fn_config_dll amstream enable_amstream
wine_fn_config_test dlls/amstream/tests amstream_test
wine_fn_config_dll appwiz.cpl enable_appwiz_cpl
wine_fn_config_dll atl enable_atl atl
+wine_fn_config_test dlls/atl/tests atl_test
wine_fn_config_dll authz enable_authz
wine_fn_config_dll avicap32 enable_avicap32 avicap32
wine_fn_config_dll avifil32 enable_avifil32 avifil32
diff --git a/configure.ac b/configure.ac
index eed1487..61f376e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2224,6 +2224,7 @@ WINE_CONFIG_DLL(amstream)
WINE_CONFIG_TEST(dlls/amstream/tests)
WINE_CONFIG_DLL(appwiz.cpl)
WINE_CONFIG_DLL(atl,,[atl])
+WINE_CONFIG_TEST(dlls/atl/tests)
WINE_CONFIG_DLL(authz)
WINE_CONFIG_DLL(avicap32,,[avicap32])
WINE_CONFIG_DLL(avifil32,,[avifil32])
diff --git a/dlls/atl/atl_main.c b/dlls/atl/atl_main.c
index fedfc1a..425f248 100644
--- a/dlls/atl/atl_main.c
+++ b/dlls/atl/atl_main.c
@@ -53,7 +53,11 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
return TRUE;
}
+#ifdef _WIN64
+#define ATLVer1Size 176
+#else
#define ATLVer1Size 100
+#endif
HRESULT WINAPI AtlModuleInit(_ATL_MODULEW* pM, _ATL_OBJMAP_ENTRYW* p, HINSTANCE h)
{
@@ -63,9 +67,13 @@ HRESULT WINAPI AtlModuleInit(_ATL_MODULEW* pM, _ATL_OBJMAP_ENTRYW* p, HINSTANCE
FIXME("SEMI-STUB (%p %p %p)\n",pM,p,h);
size = pM->cbSize;
- if (size != sizeof(_ATL_MODULEW) && size != ATLVer1Size)
+ if (size != sizeof(_ATL_MODULEW) && size != ATLVer1Size
+#ifdef _WIN64
+ && size != sizeof(_ATL_MODULEW)+8
+#endif
+ )
{
- FIXME("Unknown structure version (size %i)\n",size);
+ FIXME("Unknown structure version (size %i), expected %d or %d\n",size, (int)sizeof(_ATL_MODULEW), ATLVer1Size);
return E_INVALIDARG;
}
diff --git a/dlls/atl/tests/Makefile.in b/dlls/atl/tests/Makefile.in
new file mode 100644
index 0000000..b9752d4
--- /dev/null
+++ b/dlls/atl/tests/Makefile.in
@@ -0,0 +1,11 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../../..
+SRCDIR = @srcdir@
+VPATH = @srcdir@
+TESTDLL = atl.dll
+IMPORTS = atl oleaut32 ole32 rpcrt4 user32 gdi32 advapi32 kernel32
+
+C_SRCS = \
+ module.c
+
+ at MAKE_TEST_RULES@
diff --git a/dlls/atl/tests/module.c b/dlls/atl/tests/module.c
new file mode 100644
index 0000000..00df5aa
--- /dev/null
+++ b/dlls/atl/tests/module.c
@@ -0,0 +1,108 @@
+/*
+ * ATL test program
+ *
+ * Copyright 2010 Marcus Meissner
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#define COBJMACROS
+
+#include <wine/test.h>
+#include <windef.h>
+#include <winbase.h>
+#include <winuser.h>
+#include <wingdi.h>
+#include <winnls.h>
+#include <winerror.h>
+#include <winnt.h>
+#include <initguid.h>
+#include <wtypes.h>
+#include <olectl.h>
+#include <ocidl.h>
+
+struct _ATL_OBJMAP_ENTRYW;
+struct _AtlCreateWndData;
+struct _ATL_TERMFUNC_ELEM;
+
+struct _ATL_MODULEW
+{
+ UINT cbSize;
+ HINSTANCE m_hInst;
+ HINSTANCE m_hInstResource;
+ HINSTANCE m_hInstTypeLib;
+ struct _ATL_OBJMAP_ENTRYW* m_pObjMap;
+ LONG m_nLockCnt;
+ HANDLE m_hHeap;
+ union
+ {
+ CRITICAL_SECTION m_csTypeInfoHolder;
+ CRITICAL_SECTION m_csStaticDataInit;
+ } u;
+ CRITICAL_SECTION m_csWindowCreate;
+ CRITICAL_SECTION m_csObjMap;
+
+ DWORD dwAtlBuildVer;
+ struct _AtlCreateWndData* m_pCreateWndList;
+ BOOL m_bDestroyHeap;
+ GUID* pguidVer;
+ DWORD m_dwHeaps;
+ HANDLE* m_phHeaps;
+ int m_nHeap;
+ struct _ATL_TERMFUNC_ELEM* m_pTermFuncs;
+};
+
+
+HRESULT WINAPI AtlModuleInit(struct _ATL_MODULEW* pM, struct _ATL_OBJMAP_ENTRYW* p, HINSTANCE h);
+
+#define MAXSIZE 512
+void
+test_StructSize(void)
+{
+ struct _ATL_MODULEW *tst;
+ HRESULT hres;
+ int i;
+
+ tst = HeapAlloc (GetProcessHeap(),HEAP_ZERO_MEMORY,MAXSIZE);
+
+ for (i=0;i<MAXSIZE;i++) {
+ tst->cbSize = i;
+ hres = AtlModuleInit(tst, NULL, NULL);
+
+ switch (i) {
+ case sizeof(struct _ATL_MODULEW):
+#ifdef _WIN64
+ case 176: /* ATLVersion1Size ... for 64bit apparently */
+ case sizeof(struct _ATL_MODULEW)+8:
+#else
+ case 100: /* ATLVersion1Size ... for 32bit */
+#endif
+ ok (hres == S_OK, "AtlModuleInit with %d failed (0x%x).\n", i, (int)hres);
+ break;
+ default:
+ ok (FAILED(hres), "AtlModuleInit with %d succeeded? (0x%x).\n", i, (int)hres);
+ break;
+ }
+ }
+}
+
+START_TEST(module)
+{
+ test_StructSize();
+}
--
1.7.1
More information about the wine-patches
mailing list