Commit f00b7f40 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcrt: Use fd critical section in _setmode.

parent e05e99d7
...@@ -2797,30 +2797,34 @@ int CDECL MSVCRT__read(int fd, void *buf, unsigned int count) ...@@ -2797,30 +2797,34 @@ int CDECL MSVCRT__read(int fd, void *buf, unsigned int count)
*/ */
int CDECL MSVCRT__setmode(int fd,int mode) int CDECL MSVCRT__setmode(int fd,int mode)
{ {
int ret = get_ioinfo_nolock(fd)->wxflag & WX_TEXT ? MSVCRT__O_TEXT : MSVCRT__O_BINARY; ioinfo *info = get_ioinfo(fd);
if(ret==MSVCRT__O_TEXT && (get_ioinfo_nolock(fd)->exflag & (EF_UTF8|EF_UTF16))) int ret = info->wxflag & WX_TEXT ? MSVCRT__O_TEXT : MSVCRT__O_BINARY;
if(ret==MSVCRT__O_TEXT && (info->exflag & (EF_UTF8|EF_UTF16)))
ret = MSVCRT__O_WTEXT; ret = MSVCRT__O_WTEXT;
if(mode!=MSVCRT__O_TEXT && mode!=MSVCRT__O_BINARY && mode!=MSVCRT__O_WTEXT if(mode!=MSVCRT__O_TEXT && mode!=MSVCRT__O_BINARY && mode!=MSVCRT__O_WTEXT
&& mode!=MSVCRT__O_U16TEXT && mode!=MSVCRT__O_U8TEXT) { && mode!=MSVCRT__O_U16TEXT && mode!=MSVCRT__O_U8TEXT) {
*MSVCRT__errno() = MSVCRT_EINVAL; *MSVCRT__errno() = MSVCRT_EINVAL;
release_ioinfo(info);
return -1; return -1;
} }
if(mode == MSVCRT__O_BINARY) { if(mode == MSVCRT__O_BINARY) {
get_ioinfo_nolock(fd)->wxflag &= ~WX_TEXT; info->wxflag &= ~WX_TEXT;
get_ioinfo_nolock(fd)->exflag &= ~(EF_UTF8|EF_UTF16); info->exflag &= ~(EF_UTF8|EF_UTF16);
release_ioinfo(info);
return ret; return ret;
} }
get_ioinfo_nolock(fd)->wxflag |= WX_TEXT; info->wxflag |= WX_TEXT;
if(mode == MSVCRT__O_TEXT) if(mode == MSVCRT__O_TEXT)
get_ioinfo_nolock(fd)->exflag &= ~(EF_UTF8|EF_UTF16); info->exflag &= ~(EF_UTF8|EF_UTF16);
else if(mode == MSVCRT__O_U8TEXT) else if(mode == MSVCRT__O_U8TEXT)
get_ioinfo_nolock(fd)->exflag = (get_ioinfo_nolock(fd)->exflag & ~EF_UTF16) | EF_UTF8; info->exflag = (info->exflag & ~EF_UTF16) | EF_UTF8;
else else
get_ioinfo_nolock(fd)->exflag = (get_ioinfo_nolock(fd)->exflag & ~EF_UTF8) | EF_UTF16; info->exflag = (info->exflag & ~EF_UTF8) | EF_UTF16;
release_ioinfo(info);
return ret; return ret;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment