Huw Davies : oleaut32: Alignment fixes for safearrays.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 5 15:24:09 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 17ec77f19e7acd4d8728208c16892146f58109e3
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=17ec77f19e7acd4d8728208c16892146f58109e3

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed May  3 17:30:35 2006 +0100

oleaut32: Alignment fixes for safearrays.

---

 dlls/oleaut32/tests/usrmarshal.c |   21 +++++++++++++++++++++
 dlls/oleaut32/usrmarshal.c       |   17 ++++++++++++++---
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/dlls/oleaut32/tests/usrmarshal.c b/dlls/oleaut32/tests/usrmarshal.c
index 3f417e1..1659407 100644
--- a/dlls/oleaut32/tests/usrmarshal.c
+++ b/dlls/oleaut32/tests/usrmarshal.c
@@ -164,6 +164,8 @@ static void test_marshal_LPSAFEARRAY(voi
     *(DWORD *)lpsa->pvData = 0xcafebabe;
 
     lpsa->cLocks = 7;
+    size = LPSAFEARRAY_UserSize(&umcb.Flags, 1, &lpsa);
+    ok(size == 68, "size should be 68 bytes, not %ld\n", size);
     size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa);
     ok(size == 64, "size should be 64 bytes, not %ld\n", size);
     buffer = (unsigned char *)HeapAlloc(GetProcessHeap(), 0, size);
@@ -196,6 +198,25 @@ static void test_marshal_LPSAFEARRAY(voi
         LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2);
     }
     HeapFree(GetProcessHeap(), 0, buffer);
+
+    sab.lLbound = 5;
+    sab.cElements = 10;
+
+    lpsa = SafeArrayCreate(VT_R8, 1, &sab);
+    *(double *)lpsa->pvData = 3.1415;
+
+    lpsa->cLocks = 7;
+    size = LPSAFEARRAY_UserSize(&umcb.Flags, 1, &lpsa);
+    ok(size == 128, "size should be 128 bytes, not %ld\n", size);
+    size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa);
+    ok(size == 128, "size should be 128 bytes, not %ld\n", size);
+    buffer = (unsigned char *)HeapAlloc(GetProcessHeap(), 0, size);
+    LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
+
+    check_safearray(buffer, lpsa);
+
+    HeapFree(GetProcessHeap(), 0, buffer);
+    SafeArrayDestroy(lpsa);
 }
 
 static void check_bstr(void *buffer, BSTR b)
diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c
index 05aef80..c4519a1 100644
--- a/dlls/oleaut32/usrmarshal.c
+++ b/dlls/oleaut32/usrmarshal.c
@@ -662,6 +662,7 @@ unsigned long WINAPI LPSAFEARRAY_UserSiz
 
     TRACE("("); dump_user_flags(pFlags); TRACE(", %ld, %p\n", StartingSize, *ppsa);
 
+    ALIGN_LENGTH(size, 3);
     size += sizeof(ULONG_PTR);
     if (*ppsa)
     {
@@ -726,10 +727,12 @@ unsigned long WINAPI LPSAFEARRAY_UserSiz
                 }
                 break;
             }
+            case SF_I8:
+                ALIGN_LENGTH(size, 7);
+                /* fallthrough */
             case SF_I1:
             case SF_I2:
             case SF_I4:
-            case SF_I8:
                 size += ulCellCount * psa->cbElements;
                 break;
             default:
@@ -747,6 +750,7 @@ unsigned char * WINAPI LPSAFEARRAY_UserM
 
     TRACE("("); dump_user_flags(pFlags); TRACE(", %p, &%p\n", Buffer, *ppsa);
 
+    ALIGN_POINTER(Buffer, 3);
     *(ULONG_PTR *)Buffer = *ppsa ? TRUE : FALSE;
     Buffer += sizeof(ULONG_PTR);
     if (*ppsa)
@@ -836,10 +840,13 @@ unsigned char * WINAPI LPSAFEARRAY_UserM
                     }
                     break;
                 }
+
+                case SF_I8:
+                    ALIGN_POINTER(Buffer, 7);
+                    /* fallthrough */
                 case SF_I1:
                 case SF_I2:
                 case SF_I4:
-                case SF_I8:
                     /* Just copy the data over */
                     memcpy(Buffer, psa->pvData, ulCellCount * psa->cbElements);
                     Buffer += ulCellCount * psa->cbElements;
@@ -871,6 +878,7 @@ unsigned char * WINAPI LPSAFEARRAY_UserU
 
     TRACE("("); dump_user_flags(pFlags); TRACE(", %p, %p\n", Buffer, ppsa);
 
+    ALIGN_POINTER(Buffer, 3);
     ptr = *(ULONG_PTR *)Buffer;
     Buffer += sizeof(ULONG_PTR);
 
@@ -964,10 +972,13 @@ unsigned char * WINAPI LPSAFEARRAY_UserU
 
                 break;
             }
+
+            case SF_I8:
+                ALIGN_POINTER(Buffer, 7);
+                /* fallthrough */
             case SF_I1:
             case SF_I2:
             case SF_I4:
-            case SF_I8:
                 /* Just copy the data over */
                 memcpy((*ppsa)->pvData, Buffer, cell_count * (*ppsa)->cbElements);
                 Buffer += cell_count * (*ppsa)->cbElements;




More information about the wine-cvs mailing list