[PATCH 2/3] winecoreaudio: Ignore failure to notify winmm wave clients

Joerg-Cyril.Hoehle at t-systems.com Joerg-Cyril.Hoehle at t-systems.com
Mon Mar 14 05:07:28 CDT 2011


All 3 drivers leaked resources when given bad callback flags.
It was wrong to fully initialize the device, then finally do
-    ret = wodNotifyClient(wwo, WOM_OPEN, 0L, 0L);
     return ret;
and perhaps return an error, causing winmm not to see the open'ed device
 => leak.

Two solution paths:
A either use if (err) goto errcleanup;
B ignore the notification error (check for it earlier).

I choose B because
 - Native ignores some combinations of callback flags that don't make sense (testbot job 9779), therefore the ability to notify is not a condition for successful opening.
 - DriverCallback does not perform interesting error tests that could not be detected in advance by looking at the flags.
 - The different MMSYSERR_ values that the winmm returns for particular sets of bad flags (bug #16544 among others) cannot be derived from DriverCallback's binary TRUE/FALSE result.

The MCI performs a similar check and returns MCIERR_NO_WINDOW from "window a handle 1"

Hence this set of driver patches should be complemented by
one winmm patch which I've not yet written:
Mixer/aux/mod/wodopen () {
  /* first check cb flags
  dwRet = verifyCallback(cbinstance, dwFlags)
  If (dwRet) return dwRet or goto errorcleanup;
  /* then only perform other checks
static verifyCallback
  { return MMSYSERR_INVALPARAM etc. }

BTW, according to MSDN, DriverCallback should return false when the task's queue is full.  Wine ignores PostThreadMessage's return value.

 Jörg Höhle

More information about the wine-patches mailing list