Module: wine Branch: master Commit: 6698e9e0b0ede4aed2b5e333feb79ab0a62d2539 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=6698e9e0b0ede4aed2b5e333...
Author: Jan Zerebecki jan.wine@zerebecki.de Date: Wed Sep 6 10:43:24 2006 +0200
winmm: Prevent NULL dereference in MCI_Close and add testcase for it.
---
dlls/winmm/mci.c | 5 ++-- dlls/winmm/tests/Makefile.in | 1 + dlls/winmm/tests/mci.c | 51 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 dlls/winmm/tests/mci.c
diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c index b981ab0..7b44966 100644 --- a/dlls/winmm/mci.c +++ b/dlls/winmm/mci.c @@ -1797,8 +1797,9 @@ static DWORD MCI_Close(UINT16 wDevID, DW MCI_UnLoadMciDriver(wmd);
if (dwParam & MCI_NOTIFY) - mciDriverNotify((HWND)lpParms->dwCallback, wDevID, - (dwRet == 0) ? MCI_NOTIFY_SUCCESSFUL : MCI_NOTIFY_FAILURE); + mciDriverNotify(lpParms ? (HWND)lpParms->dwCallback : 0, + wDevID, + dwRet ? MCI_NOTIFY_FAILURE : MCI_NOTIFY_SUCCESSFUL);
return dwRet; } diff --git a/dlls/winmm/tests/Makefile.in b/dlls/winmm/tests/Makefile.in index e002f37..2865116 100644 --- a/dlls/winmm/tests/Makefile.in +++ b/dlls/winmm/tests/Makefile.in @@ -7,6 +7,7 @@ IMPORTS = winmm user32 kernel32
CTESTS = \ capture.c \ + mci.c \ mixer.c \ mmio.c \ timer.c \ diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c new file mode 100644 index 0000000..4b608a7 --- /dev/null +++ b/dlls/winmm/tests/mci.c @@ -0,0 +1,51 @@ +/* + * Test winmm mci + * + * Copyright 2006 Jan Zerebecki + * + * 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 "wine/test.h" +#include "winuser.h" +#include "mmsystem.h" + +START_TEST(mci) +{ + int err; + const char command_open[] = "open new type waveaudio alias mysound"; + const char command_close_my[] = "close mysound notify"; + const char command_close_all[] = "close all notify"; + MSG msg; + + err = mciSendString(command_open, NULL, 0, NULL); + ok(!err,"mciSendString(%s, NULL, 0 , NULL) returned error: %d\n", command_open, err); + + err = mciSendString(command_close_my, NULL, 0, NULL); + ok(!err,"mciSendString(%s, NULL, 0 , NULL) returned error: %d\n", command_close_my, err); + + ok(PeekMessageW( &msg, (HWND)-1, 0, 0, PM_REMOVE ), "PeekMessage should succeed\n"); + ok(msg.hwnd == NULL, "got %p instead of NULL\n", msg.hwnd); + ok(msg.message == MM_MCINOTIFY, "got %04x instead of MM_MCINOTIFY\n", msg.message); + ok(msg.wParam == MCI_NOTIFY_SUCCESSFUL, "got %08x instead of MCI_NOTIFY_SUCCESSFUL\n", msg.wParam); + + err = mciSendString(command_close_all, NULL, 0, NULL); + todo_wine ok(!err,"mciSendString(%s, NULL, 0 , NULL) returned error: %d\n", command_close_all, err); + + err = mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, MCI_NOTIFY, 0); + todo_wine ok(err == MCIERR_INVALID_DEVICE_ID, + "mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, MCI_NOTIFY, NULL) returned %d instead of %d\n", + err, MCIERR_INVALID_DEVICE_ID); +}