• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision9134 (tree)
Time2021-01-23 00:00:52
Authornmaya

Log Message

CreateFile の共有モードを修正

- GENERIC_WRITE で開くときに FILE_SHARE_WRITE で共有している箇所を 0 (共有しない)に修正
- Win16 API の _lcreat, _lopen はロックしないので、互換性のため FILE_SHARE_READ | FILE_SHARE_WRITE に変更
- TTL の filecreate, fileopen のファイルハンドルは filelock でロックするので、 FILE_SHARE_READ | FILE_SHARE_WRITE に変更

dwShareMode で指定する共有モードは、後続の"ファイルを開く"操作に対して「有効にする」アクセスを指定する

https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
Enables subsequent open operations on a file or device to request xxx access.

#41305 の修正を含む

Change Summary

Incremental Difference

--- trunk/doc/en/html/about/history.html (revision 9133)
+++ trunk/doc/en/html/about/history.html (revision 9134)
@@ -41,6 +41,7 @@
4141
4242 <li>Bug fixes
4343 <ul>
44+ <li><a href="../macro/command/filecreate.html">filecreate</a>, <a href="../macro/command/fileopen.html">fileopen</a> マクロコマンドで開いたファイルハンドルがロックしている問題を修正した。</li>
4445 </ul>
4546 </li>
4647
--- trunk/doc/ja/html/about/history.html (revision 9133)
+++ trunk/doc/ja/html/about/history.html (revision 9134)
@@ -41,6 +41,7 @@
4141
4242 <li>Bug fixes
4343 <ul>
44+ <li><a href="../macro/command/filecreate.html">filecreate</a>, <a href="../macro/command/fileopen.html">fileopen</a> マクロコマンドで開いたファイルハンドルがロックしている問題を修正した。</li>
4445 </ul>
4546 </li>
4647
--- trunk/teraterm/common/win16api.c (revision 9133)
+++ trunk/teraterm/common/win16api.c (revision 9134)
@@ -30,6 +30,12 @@
3030 #include <assert.h>
3131
3232 /**
33+ * Win16 API の _lcreat, _lopen はロックしないので、
34+ * 互換性のため CreateFile() の dwShareMode には
35+ * FILE_SHARE_READ | FILE_SHARE_WRITE を指定する。
36+ */
37+
38+/**
3339 * win16_lcreat() の wchar_t版
3440 * @param[in] iAttribute teratermでは0しか使用しない
3541 * @retval handle
@@ -41,7 +47,7 @@
4147 HANDLE handle;
4248 assert(iAttribute == 0);
4349 handle = CreateFileW(FileName,
44- GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
50+ GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
4551 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
4652 return handle;
4753 }
@@ -57,7 +63,7 @@
5763 HANDLE handle;
5864 assert(iAttribute == 0);
5965 handle = CreateFileA(FileName,
60- GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
66+ GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
6167 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
6268 return handle;
6369 }
@@ -75,13 +81,13 @@
7581 case OF_READ:
7682 // read only
7783 handle = CreateFileW(FileName,
78- GENERIC_READ, FILE_SHARE_READ, NULL,
84+ GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
7985 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
8086 break;
8187 case OF_WRITE:
8288 // write
8389 handle = CreateFileW(FileName,
84- GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
90+ GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
8591 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
8692 break;
8793 default:
@@ -104,13 +110,13 @@
104110 case OF_READ:
105111 // read only
106112 handle = CreateFileA(FileName,
107- GENERIC_READ, FILE_SHARE_READ, NULL,
113+ GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
108114 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
109115 break;
110116 case OF_WRITE:
111117 // write
112118 handle = CreateFileA(FileName,
113- GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
119+ GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
114120 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
115121 break;
116122 default:
--- trunk/teraterm/teraterm/filesys_log.cpp (revision 9133)
+++ trunk/teraterm/teraterm/filesys_log.cpp (revision 9134)
@@ -679,6 +679,8 @@
679679
680680 static void OpenLogFile(PFileVar fv)
681681 {
682+ // LogLockExclusive が有効な場合にまったく共有しないと、
683+ // 書き込み中のログファイルを他のエディタで開けないため
682684 int dwShareMode = FILE_SHARE_READ;
683685 if (!ts.LogLockExclusive) {
684686 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
--- trunk/teraterm/ttpfile/filesys_win32.cpp (revision 9133)
+++ trunk/teraterm/ttpfile/filesys_win32.cpp (revision 9134)
@@ -77,7 +77,7 @@
7777 TFileIOWin32 *data = (TFileIOWin32 *)fv->data;
7878 wc filenameW = GetFilenameW(data, filename);
7979 HANDLE hFile = _CreateFileW(filenameW,
80- GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
80+ GENERIC_WRITE, 0, NULL,
8181 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
8282 if (hFile == INVALID_HANDLE_VALUE) {
8383 data->FileHandle = INVALID_HANDLE_VALUE;
--- trunk/teraterm/ttpmacro/ttl.cpp (revision 9133)
+++ trunk/teraterm/ttpmacro/ttl.cpp (revision 9134)
@@ -1207,7 +1207,7 @@
12071207
12081208 wc FName1W = wc::fromUtf8(FName1);
12091209 HANDLE FH1 = _CreateFileW(FName1W,
1210- GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
1210+ GENERIC_WRITE, 0, NULL,
12111211 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
12121212 if (FH1 == INVALID_HANDLE_VALUE) {
12131213 SetResult(3);
@@ -1315,8 +1315,10 @@
13151315 return Err;
13161316 }
13171317 wc FNameW = wc::fromUtf8(FName);
1318+ // TTL のファイルハンドルは filelock でロックするので、
1319+ // dwShareMode での共有モードは Read/Write とも有効にする。
13181320 FH = _CreateFileW(FNameW,
1319- GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE, NULL,
1321+ GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
13201322 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
13211323 if (FH == INVALID_HANDLE_VALUE) {
13221324 SetResult(2);
@@ -1417,10 +1419,12 @@
14171419 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
14181420 }
14191421 else {
1420- // ファイルをオープンする、
1421- // 存在しない場合は作成した後オープンする
1422+ // ファイルをオープンする。
1423+ // 存在しない場合は作成した後オープンする。
1424+ // TTL のファイルハンドルは filelock でロックするので、
1425+ // dwShareMode での共有モードは Read/Write とも有効にする。
14221426 FH = _CreateFileW(FNameW,
1423- GENERIC_WRITE|GENERIC_READ, FILE_SHARE_WRITE, NULL,
1427+ GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
14241428 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
14251429 }
14261430 if (FH == INVALID_HANDLE_VALUE) {
Show on old repository browser