[PATCH v2 1/1] ntdll: Fix reading stale Information from IOSB.

Jin-oh Kang jinoh.kang.kr at gmail.com
Mon May 30 20:23:04 CDT 2022


On Tue, May 31, 2022, 7:52 AM Zebediah Figura wrote:

> On 5/30/22 14:20, Jinoh Kang wrote:
> > +
> > +    /* GetOverlappedResultEx() skips waiting for the event/file handle
> if the
> > +     * Status field indicates completion, and returns the result from
> the
> > +     * Information field.
> > +     *
> > +     * Hence, we have to ensure that writes to the Information field
> are seen
> > +     * from the other threads *before* writes to the Status field.
> > +     *
> > +     * Otherwise, a race condition results: if writing the Status field
> has
> > +     * been completed but the subsequent update to the Information
> field has
> > +     * not, the application may end up reading stale value from it.
> > +     *
> > +     * The race condition can be especially problematic with
> applications that
> > +     * use the HasOverlappedIoCompleted() macro in a tight loop to
> busy-wait
> > +     * for completion of overlapped I/O.
> > +     */
> > +    MemoryBarrier();  /* TODO: consider replacing with a store-release.
> */
> > +    *(volatile NTSTATUS *)status_ptr = status;
> >   }
> >
> >   static inline client_ptr_t iosb_client_ptr( IO_STATUS_BLOCK *io )
>
> Unpaired MemoryBarrier() is pretty much always wrong. (In fact, I think
> unpaired anything would be, here.)
>

By pairing, do you mean that another MemoryBarrier() should follow the
status write?


> It also doesn't seem clear to me that it's actually better than a
> store-release, as you point out. Ideally what we want is ReadAcquire()
> and WriteRelease(), but even setting that aside, a pair of interlocked
> operations will probably be an improvement by themselves.
>

As in, convert both status and information writes to interlocked
operations, or replace the barrier with a dummy atomic op?

>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20220531/195a43e6/attachment.htm>


More information about the wine-devel mailing list