[Bug 28023] New: CoreAudio queue memory leak

wine-bugs at winehq.org wine-bugs at winehq.org
Mon Aug 8 08:57:07 CDT 2011


http://bugs.winehq.org/show_bug.cgi?id=28023

           Summary: CoreAudio queue memory leak
           Product: Wine
           Version: 1.3.25
          Platform: x86
        OS/Version: Mac OS X 10.5
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: mmdevapi
        AssignedTo: wine-bugs at winehq.org
        ReportedBy: hoehle at users.sourceforge.net
                CC: aeikum at codeweavers.com


While working on a patch to fix the Get/ReleaseBuffer ordering, see bug #27184
comment #3, I found a bug in memory management in winecoreaudio's mmdevapi.

510      HeapFree(GetProcessHeap(), 0, This->public_buffer);
but public_buffer originates from
1625      sc = AudioQueueAllocateBuffer(This->aqueue, bytes,
1626              &This->public_buffer);
The APIs don't match.  It currently doesn't crash because
public_buffer is NULL upon regular exit.  This matches:
1634     AudioQueueFreeBuffer(This->aqueue, This->public_buffer);

That would be easy to fix, but it leads to question how AudioClient_Release
frees the buffer queue.

502      if(This->aqueue)
503          AudioQueueDispose(This->aqueue, 1);

I suppose that Dispose gets rid of all the MacOS-level elements left in the
queue, but I doubt it can handle the additional AQBuffer that Wine links to
every object via the mUserData slot.

1632      buf = HeapAlloc(GetProcessHeap(), 0, sizeof(AQBuffer));
1640      This->public_buffer->mUserData = buf;

Therefore I believe Wine must iterate through the list (aqueue or
avail_buffers?) and free remaining objects one by one.

As I'm not familiar with the MacOS API's, I'd like somebody knowledgeable
(Andrew, Ken?), to check this issue and write the patch.

BTW, I believe that correct freeing should first return
This->public_buffer into the queue -- where it originated -- like I did in my
ordering patch, then delete the whole queue.

+     if(This->public_buffer){
+         AQBuffer *buf = This->public_buffer->mUserData;
+         list_add_tail(&This->avail_buffers, &buf->entry);
+         This->public_buffer = NULL;
+     }

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.



More information about the wine-bugs mailing list