Il 21/09/2012 14:17, Jeff Cody ha scritto:
> On 09/21/2012 04:43 AM, Paolo Bonzini wrote:
>> Il 21/09/2012 10:33, Kevin Wolf ha scritto:
>>>>> +    /* could not reopen the file handle, so fall back to opening
>>>>> +     * new file (CreateFile) */
>>>>> +    if (raw_s->hfile == INVALID_HANDLE_VALUE) {
>>>>> +        raw_s->hfile = CreateFile(state->bs->filename, access_flags,
>>>>> +                                  FILE_SHARE_READ, NULL, OPEN_EXISTING,
>>>>> +                                  overlapped, NULL);
>>>>> +        if (raw_s->hfile == INVALID_HANDLE_VALUE) {
>>>>> +            /* this could happen because the access_flags requested are
>>>>> +             * incompatible with the existing share mode of s->hfile,
>>>>> +             * so our only option now is to close s->hfile, and try 
>>>>> again.
>>>>> +             * This could end badly */
>>>>> +            CloseHandle(s->hfile);
>>> How common is this case?
>>>
>>> We do have another option, namely not reopen at all and return an error.
>>> Of course, this only makes sense if it doesn't mean that we almost never
>>> succeed.
>>
>> Probably pretty common since we specify FILE_SHARE_READ for the sharing
>> mode, meaning that "subsequent open operations on a file or device are
>> only able to request read access".
> 
> Yes, I think this is by far the most common case.

Actually ReOpenFile probably only takes into account _other_ sharing
modes, not the one for hFile, so it may even be unnecessary.

But...

>> I would change it to FILE_SHARE_READ|FILE_SHARE_WRITE and remove this code.
> 
> I contemplated doing that, but I wasn't sure if there was any particular
> reason it was originally done with FILE_SHARE_READ only in the first
> place (security, etc..). I was hesitant to override that behaviour as
> the new default under w32.  Do we know if this is acceptable / safe?

... let's just make things work the same as in Unix.

Paolo


Reply via email to