msvcrt: Don't hold FILE critical section in some functions

Piotr Caban piotr at codeweavers.com
Tue Nov 15 10:08:28 CST 2011


On 11/15/11 16:34, Alexandre Julliard wrote:
> Piotr Caban<piotr at codeweavers.com>  writes:
>
>> @@ -3117,25 +3098,20 @@ int CDECL MSVCRT_fputc(int c, MSVCRT_FILE* file)
>>    */
>>   int CDECL MSVCRT__flsbuf(int c, MSVCRT_FILE* file)
>>   {
>> -    MSVCRT__lock_file(file);
>> -
>>       /* Flush output buffer */
>>       if(file->_bufsiz == 0&&  !(file->_flag&  MSVCRT__IONBF)) {
>>           msvcrt_alloc_buffer(file);
>>       }
>>       if(!(file->_flag&  MSVCRT__IOWRT)) {
>> -        if(file->_flag&  MSVCRT__IORW) {
>> +        if(file->_flag&  MSVCRT__IORW)
>>               file->_flag |= MSVCRT__IOWRT;
>> -        } else {
>> -            MSVCRT__unlock_file(file);
>> +        else
>
> That doesn't look safe.
>
This function is not safe under Windows 7. I was testing it with 
following program:

static DWORD WINAPI block_stdin(void *arg)
{
	_lock_file(stdout);
	return 0;
}

int main( )
{
	DWORD thread_id;

	CreateThread(NULL, 0, block_stdin, NULL, 0, &thread_id);
	Sleep(500);
	_flsbuf(32, stdout);
	return 0;
}

It terminates in Windows 7. It never ends with Wine both with and 
without my patch (because of locks in fputc and fwrite).



More information about the wine-devel mailing list