[PATCH] ntdll: Workaround for requesting thread affinity mask that isn't a subset of the system's mask

Roger Zoellner zoellner.roger at gmail.com
Sun Sep 9 10:27:59 CDT 2018


This line is definately a problem:
> else if (req_aff & ~affinity_mask) return STATUS_INVALID_PARAMETER;

After inverting affinity_mask, it will contain leading 1s. So the
comparison will always return true when req_aff > system_mask


Am So., 9. Sep. 2018 um 16:12 Uhr schrieb Roger Zoellner <
zoellner.roger at gmail.com>:

> I've created a test case that shows, that Wine indeed behaves incorrectly
> when the highest bit of the requested mask is set.
> With the (obvious) exception of ~0u, Wine returns STATUS_INVALID_PARAMETER
> while Windows returns 0 (SUCCESS).
>
> You're right. Casting to LONG is probably wrong here.
>
> Am So., 9. Sep. 2018 um 10:31 Uhr schrieb Chris Robinson <
> chris.kcat at gmail.com>:
>
>> On 09/08/2018 06:26 AM, Roger Zoellner wrote:
>> >               if ((ULONG)req_aff == ~0u) req_aff = affinity_mask;
>> > +            else if ((LONG) req_aff < 0) req_aff = affinity_mask &
>> req_aff;
>>
>> In addition to Dmitry's comment, it's notable that these two cases
>> basically become the same thing. ~0u is -1, which would make req_aff a
>> full mask. Though it may also be worth a test if the sign check actually
>> applies to LONG_PTR instead of LONG, since LONG_PTR is 64-bit on 64-bit
>> targets while LONG is 32-bit even on 64-bit targets.
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20180909/5bbaad53/attachment-0001.html>


More information about the wine-devel mailing list