winmm: Initialize struct MMIOINFO in MMIO_Open (try 2)

Bruno Jesus 00cpxxx at gmail.com
Sat Oct 24 23:38:38 CDT 2015


Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>

Superseeds 115694.

Try 2:
Zero the whole struct as suggested by Andrew Eikum

The program from bug 35872 registers an IO handler that test adwInfo
and crashes because when MMIO_Open is called these values have
garbage.

Fixes https://bugs.winehq.org/show_bug.cgi?id=35872
-------------- next part --------------
diff --git a/dlls/winmm/mmio.c b/dlls/winmm/mmio.c
index ad73564..bc69f9e 100644
--- a/dlls/winmm/mmio.c
+++ b/dlls/winmm/mmio.c
@@ -591,11 +591,7 @@ static HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD dwOpenFlags,
 
     if (!refmminfo) {
         refmminfo = &mmioinfo;
-
-	mmioinfo.fccIOProc = 0;
-	mmioinfo.pIOProc = NULL;
-	mmioinfo.pchBuffer = NULL;
-	mmioinfo.cchBuffer = 0;
+	memset(&mmioinfo, 0, sizeof(mmioinfo));
         is_unicode = FALSE;
     }
 
diff --git a/dlls/winmm/tests/mmio.c b/dlls/winmm/tests/mmio.c
index fd5433c..48367ee 100644
--- a/dlls/winmm/tests/mmio.c
+++ b/dlls/winmm/tests/mmio.c
@@ -599,12 +599,15 @@ static void test_mmioSetBuffer(char *fname)
 static LRESULT CALLBACK mmio_test_IOProc(LPSTR lpMMIOInfo, UINT uMessage, LPARAM lParam1, LPARAM lParam2)
 {
     LPMMIOINFO lpInfo = (LPMMIOINFO) lpMMIOInfo;
+    int i;
 
     switch (uMessage)
     {
     case MMIOM_OPEN:
         if (lpInfo->fccIOProc == FOURCC_DOS)
             lpInfo->fccIOProc = mmioFOURCC('F', 'A', 'I', 'L');
+        for (i = 0; i < sizeof(lpInfo->adwInfo) / sizeof(*lpInfo->adwInfo); i++)
+            ok(lpInfo->adwInfo[i] == 0, "[%d] Expected 0, got %u\n", i, lpInfo->adwInfo[i]);
         return MMSYSERR_NOERROR;
     case MMIOM_CLOSE:
         return MMSYSERR_NOERROR;
@@ -642,6 +645,18 @@ static void test_mmioOpen_fourcc(void)
        mmio.lDiskOffset);
     mmioClose(hmmio, 0);
 
+    /* Same test with NULL info */
+    memset(&mmio, 0, sizeof(mmio));
+    hmmio = mmioOpenA(fname, NULL, MMIO_READ);
+    mmioGetInfo(hmmio, &mmio, 0);
+    ok(hmmio && mmio.fccIOProc == FOURCC_XYZ, "mmioOpenA error %u, got %4.4s\n",
+            mmio.wErrorRet, (LPCSTR)&mmio.fccIOProc);
+    ok(mmio.adwInfo[1] == 0, "mmioOpenA sent MMIOM_SEEK, got %d\n",
+       mmio.adwInfo[1]);
+    ok(mmio.lDiskOffset == 0, "mmioOpenA updated lDiskOffset, got %d\n",
+       mmio.lDiskOffset);
+    mmioClose(hmmio, 0);
+
     mmioInstallIOProcA(FOURCC_XYZ, NULL, MMIO_REMOVEPROC);
 
     memset(&mmio, 0, sizeof(mmio));


More information about the wine-patches mailing list