[PATCH 6/7] winmm: Fix int-to-pointer and pointer-to-int casts warnings.

Andrew Eikum aeikum at codeweavers.com
Thu Nov 14 10:54:09 CST 2019


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Wed, Nov 13, 2019 at 02:51:23PM +0100, Rémi Bernon wrote:
> The stream pointer was used as the DWORD id, which is only going to
> work on 32bit. It may very well be that winmm is only used in 32bit,
> but then we still build a 64bit version of it.
> 
> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
> ---
>  dlls/winmm/winmm.c | 58 ++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 53 insertions(+), 5 deletions(-)
> 
> diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
> index 0f0cd946d1d..9075a78f343 100644
> --- a/dlls/winmm/winmm.c
> +++ b/dlls/winmm/winmm.c
> @@ -54,6 +54,7 @@
>  #include "winemm.h"
>  
>  #include "wine/debug.h"
> +#include "wine/rbtree.h"
>  
>  WINE_DEFAULT_DEBUG_CHANNEL(winmm);
>  
> @@ -72,12 +73,16 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
>  };
>  CRITICAL_SECTION WINMM_cs = { &critsect_debug, -1, 0, 0, 0, 0 };
>  
> +static struct wine_rb_tree wine_midi_streams;
> +static int wine_midi_stream_compare(const void *key, const struct wine_rb_entry *entry);
> +
>  /**************************************************************************
>   * 			WINMM_CreateIData			[internal]
>   */
>  static	BOOL	WINMM_CreateIData(HINSTANCE hInstDLL)
>  {
>      hWinMM32Instance = hInstDLL;
> +    wine_rb_init(&wine_midi_streams, wine_midi_stream_compare);
>      psLastEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
>      return psLastEvent != NULL;
>  }
> @@ -924,6 +929,8 @@ typedef struct WINE_MIDIStream {
>      WORD			status;
>      HANDLE			hEvent;
>      LPMIDIHDR			lpMidiHdr;
> +    DWORD			dwStreamID;
> +    struct wine_rb_entry	entry;
>  } WINE_MIDIStream;
>  
>  #define WINE_MSM_HEADER		(WM_USER+0)
> @@ -935,12 +942,50 @@ typedef struct WINE_MIDIStream {
>  #define MSM_STATUS_PAUSED	WINE_MSM_PAUSE
>  #define MSM_STATUS_PLAYING	WINE_MSM_RESUME
>  
> +static int wine_midi_stream_compare(const void *key, const struct wine_rb_entry *entry)
> +{
> +    WINE_MIDIStream *stream = WINE_RB_ENTRY_VALUE(entry, struct WINE_MIDIStream, entry);
> +    return memcmp(key, &stream->dwStreamID, sizeof(stream->dwStreamID));
> +}
> +
> +static WINE_MIDIStream *wine_midi_stream_allocate(void)
> +{
> +    DWORD stream_id = 1;
> +    WINE_MIDIStream *stream = NULL;
> +
> +    EnterCriticalSection(&WINMM_cs);
> +
> +    while (stream_id < 0xFFFFFFFF && wine_rb_get(&wine_midi_streams, &stream_id))
> +        stream_id++;
> +
> +    if (stream_id < 0xFFFFFFFF &&
> +        (stream = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_MIDIStream))))
> +    {
> +        stream->dwStreamID = stream_id;
> +        wine_rb_put(&wine_midi_streams, &stream_id, &stream->entry);
> +    }
> +
> +    LeaveCriticalSection(&WINMM_cs);
> +    return stream;
> +}
> +
> +static void wine_midi_stream_free(WINE_MIDIStream *stream)
> +{
> +    EnterCriticalSection(&WINMM_cs);
> +
> +    wine_rb_remove(&wine_midi_streams, &stream->entry);
> +    HeapFree(GetProcessHeap(), 0, stream);
> +
> +    LeaveCriticalSection(&WINMM_cs);
> +}
> +
>  /**************************************************************************
>   * 				MMSYSTEM_GetMidiStream		[internal]
>   */
>  static	BOOL	MMSYSTEM_GetMidiStream(HMIDISTRM hMidiStrm, WINE_MIDIStream** lpMidiStrm, WINE_MIDI** lplpwm)
>  {
>      WINE_MIDI* lpwm = (LPWINE_MIDI)MMDRV_Get(hMidiStrm, MMDRV_MIDIOUT, FALSE);
> +    struct wine_rb_entry *entry;
>  
>      if (lplpwm)
>  	*lplpwm = lpwm;
> @@ -949,7 +994,10 @@ static	BOOL	MMSYSTEM_GetMidiStream(HMIDISTRM hMidiStrm, WINE_MIDIStream** lpMidi
>  	return FALSE;
>      }
>  
> -    *lpMidiStrm = (WINE_MIDIStream*)lpwm->mod.rgIds.dwStreamID;
> +    EnterCriticalSection(&WINMM_cs);
> +    if ((entry = wine_rb_get(&wine_midi_streams, &lpwm->mod.rgIds.dwStreamID)))
> +        *lpMidiStrm = WINE_RB_ENTRY_VALUE(entry, struct WINE_MIDIStream, entry);
> +    LeaveCriticalSection(&WINMM_cs);
>  
>      return *lpMidiStrm != NULL;
>  }
> @@ -1106,7 +1154,7 @@ static	BOOL	MMSYSTEM_MidiStream_MessageHandler(WINE_MIDIStream* lpMidiStrm, LPWI
>  #endif
>              if (((LPMIDIEVENT)lpData)->dwStreamID != 0 &&
>                  ((LPMIDIEVENT)lpData)->dwStreamID != 0xFFFFFFFF &&
> -                ((LPMIDIEVENT)lpData)->dwStreamID != (DWORD)lpMidiStrm) {
> +                ((LPMIDIEVENT)lpData)->dwStreamID != lpMidiStrm->dwStreamID) {
>                  FIXME("Dropping bad %s lpMidiHdr (streamID=%08x)\n",
>                        (lpMidiHdr->dwFlags & MHDR_ISSTRM) ? "stream" : "regular",
>                        ((LPMIDIEVENT)lpData)->dwStreamID);
> @@ -1301,7 +1349,7 @@ MMRESULT WINAPI midiStreamClose(HMIDISTRM hMidiStrm)
>      if(!ret) {
>          lpMidiStrm->lock.DebugInfo->Spare[0] = 0;
>          DeleteCriticalSection(&lpMidiStrm->lock);
> -        HeapFree(GetProcessHeap(), 0, lpMidiStrm);
> +        wine_midi_stream_free(lpMidiStrm);
>      }
>  
>      return midiOutClose((HMIDIOUT)hMidiStrm);
> @@ -1330,7 +1378,7 @@ MMRESULT WINAPI midiStreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
>      if (ret != MMSYSERR_NOERROR)
>  	return ret;
>  
> -    lpMidiStrm = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_MIDIStream));
> +    lpMidiStrm = wine_midi_stream_allocate();
>      if (!lpMidiStrm)
>  	return MMSYSERR_NOMEM;
>  
> @@ -1341,7 +1389,7 @@ MMRESULT WINAPI midiStreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
>      lpMidiStrm->status = MSM_STATUS_PAUSED;
>      lpMidiStrm->dwElapsedMS = 0;
>  
> -    mosm.dwStreamID = (DWORD)lpMidiStrm;
> +    mosm.dwStreamID = lpMidiStrm->dwStreamID;
>      /* FIXME: the correct value is not allocated yet for MAPPER */
>      mosm.wDeviceID  = *lpuDeviceID;
>      lpwm = MIDI_OutAlloc(&hMidiOut, &dwCallback, &dwInstance, &fdwOpen, 1, &mosm);
> -- 
> 2.24.0.rc2
> 
> 



More information about the wine-devel mailing list