[PATCH] ole32: Release marshal data before removing apartment from list.
Huw Davies
huw at codeweavers.com
Wed Sep 12 02:32:20 CDT 2018
On Tue, Sep 11, 2018 at 06:04:09PM -0500, Sergio Gómez Del Real wrote:
> For local servers, we are first removing the apartment from the list and
> then calling CoReleaseMarshalData(). This last function actually depends
> on the apartment still being in the list (because of
> apartment_findfromoxid()). The result is that CoReleaseMarshalData() is
> failing, as can be seen in marshal.ok tests.
> I only moved part of the code inside the critical section to keep it as
> small as possible.
We're going to need a test for this.
Huw.
> Signed-off-by: Sergio Gómez Del Real <sdelreal at codeweavers.com>
> ---
> dlls/ole32/compobj.c | 20 +++++++++++++-------
> 1 file changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
> index 66b1683d98..bae5941438 100644
> --- a/dlls/ole32/compobj.c
> +++ b/dlls/ole32/compobj.c
> @@ -1169,6 +1169,7 @@ static void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
> DWORD apartment_release(struct apartment *apt)
> {
> DWORD ret;
> + LocalServer *local_server = NULL;
>
> EnterCriticalSection(&csApartment);
>
> @@ -1187,6 +1188,16 @@ DWORD apartment_release(struct apartment *apt)
> apt->being_destroyed = TRUE;
> if (apt == MTA) MTA = NULL;
> else if (apt == MainApartment) MainApartment = NULL;
> + /* we must release marshal data before removing apartment from its list */
> + if(apt->local_server) {
> + LARGE_INTEGER zero;
> + local_server = apt->local_server;
> +
> + memset(&zero, 0, sizeof(zero));
> + IStream_Seek(local_server->marshal_stream, zero, STREAM_SEEK_SET, NULL);
> + CoReleaseMarshalData(local_server->marshal_stream);
> + }
> +
> list_remove(&apt->entry);
> }
>
> @@ -1198,13 +1209,8 @@ DWORD apartment_release(struct apartment *apt)
>
> TRACE("destroying apartment %p, oxid %s\n", apt, wine_dbgstr_longlong(apt->oxid));
>
> - if(apt->local_server) {
> - LocalServer *local_server = apt->local_server;
> - LARGE_INTEGER zero;
> -
> - memset(&zero, 0, sizeof(zero));
> - IStream_Seek(local_server->marshal_stream, zero, STREAM_SEEK_SET, NULL);
> - CoReleaseMarshalData(local_server->marshal_stream);
> + if (local_server)
> + {
> IStream_Release(local_server->marshal_stream);
> local_server->marshal_stream = NULL;
>
> --
> 2.17.1
>
>
>
More information about the wine-devel
mailing list