[ruby-dev:49046] [Ruby trunk - Bug #11172] Windowsでmode: ab+の時に開いたファイルの内容が読めない

From: usa@...
Date: 2015-06-09 07:25:22 UTC
List: ruby-dev #49046
Issue #11172 has been updated by Usaku NAKAMURA.

Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED to 2.0.=
0: REQUIRED, 2.1: DONE, 2.2: REQUIRED

ruby_2_1 r50806 merged revision(s) 50637.

----------------------------------------
Bug #11172: Windows=E3=81=A7mode: ab+=E3=81=AE=E6=99=82=E3=81=AB=E9=96=8B=
=E3=81=84=E3=81=9F=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E5=86=85=E5=
=AE=B9=E3=81=8C=E8=AA=AD=E3=82=81=E3=81=AA=E3=81=84
https://bugs.ruby-lang.org/issues/11172#change-52800

* Author: Yui NARUSE
* Status: Closed
* Priority: Normal
* Assignee: Usaku NAKAMURA
* ruby -v:=20
* Backport: 2.0.0: REQUIRED, 2.1: DONE, 2.2: REQUIRED
----------------------------------------
Windows=E3=81=A7open("hoge.txt", "ab+")=E3=81=99=E3=82=8B=E3=81=A8=E3=80=81=
=E9=96=8B=E3=81=84=E3=81=9F=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E6=
=97=A2=E5=AD=98=E3=81=AE=E5=86=85=E5=AE=B9=E3=81=8C=E8=AA=AD=E3=82=81=E3=81=
=BE=E3=81=9B=E3=82=93=E3=80=82
File::APPEND|File::CREAT|File::RDWR|File::BINARY=E3=81=A7=E3=82=82=E5=90=8C=
=E6=A7=98=E3=81=A7=E3=81=99=E3=80=82

Unix=E3=81=A7=E3=81=AF=E8=AA=AD=E3=82=81=E3=82=8B=E4=B8=8A=E3=81=AB=E3=80=
=81a+=E3=81=AE=E6=99=82=E3=80=81=E3=81=A4=E3=81=BE=E3=82=8A_open=E3=82=92=
=E4=BD=BF=E3=81=86=E5=A0=B4=E5=90=88=E3=82=82=E8=AA=AD=E3=82=81=E3=82=8B=E3=
=81=AE=E3=81=A7=E3=80=81=E6=84=8F=E5=9B=B3=E3=81=97=E3=81=AA=E3=81=84=E6=8C=
=99=E5=8B=95=E3=81=A7=E3=81=97=E3=82=87=E3=81=86=E3=80=82

```
diff --git a/win32/win32.c b/win32/win32.c
index 55e0d2e..57d9df4 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -6476,12 +6476,16 @@ rb_w32_close(int fd)
 }
=20
 static int
-setup_overlapped(OVERLAPPED *ol, int fd)
+setup_overlapped(OVERLAPPED *ol, int fd, int iswrite)
 {
     memset(ol, 0, sizeof(*ol));
     if (!(_osfile(fd) & (FDEV | FPIPE))) {
 	LONG high =3D 0;
-	DWORD method =3D _osfile(fd) & FAPPEND ? FILE_END : FILE_CURRENT;
+	/* On mode:a, it can write only FILE_END.
+	 * On mode:a+, though it can write only FILE_END,
+	 * it can read from everywhere.
+	 */
+	DWORD method =3D ((_osfile(fd) & FAPPEND) && iswrite) ? FILE_END : FILE_C=
URRENT;
 	DWORD low =3D SetFilePointer((HANDLE)_osfhnd(fd), 0, &high, method);
 #ifndef INVALID_SET_FILE_POINTER
 #define INVALID_SET_FILE_POINTER ((DWORD)-1)
@@ -6578,7 +6582,7 @@ rb_w32_read(int fd, void *buf, size_t size)
=20
     /* if have cancel_io, use Overlapped I/O */
     if (cancel_io) {
-	if (setup_overlapped(&ol, fd)) {
+	if (setup_overlapped(&ol, fd, FALSE)) {
 	    rb_acrt_lowio_unlock_fh(fd);
 	    return -1;
 	}
@@ -6708,7 +6712,7 @@ rb_w32_write(int fd, const void *buf, size_t size)
=20
     /* if have cancel_io, use Overlapped I/O */
     if (cancel_io) {
-	if (setup_overlapped(&ol, fd)) {
+	if (setup_overlapped(&ol, fd, TRUE)) {
 	    rb_acrt_lowio_unlock_fh(fd);
 	    return -1;
 	}
```



--=20
https://bugs.ruby-lang.org/

In This Thread

Prev Next