[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