diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2015-08-15 12:30:09 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-08-15 12:30:09 +0200 |
commit | 344860a1045cbb8ef1f3caf265a9d706cdda01e0 (patch) | |
tree | 80b734af69beb744ae132e8e27bcf449cb6f5cca /winsup/cygwin/fhandler.h | |
parent | 36d500e4258a8ae324df213e32d70e8d40b3d436 (diff) | |
download | cygnal-344860a1045cbb8ef1f3caf265a9d706cdda01e0.tar.gz cygnal-344860a1045cbb8ef1f3caf265a9d706cdda01e0.tar.bz2 cygnal-344860a1045cbb8ef1f3caf265a9d706cdda01e0.zip |
Cygwin: Try to fix potential data corruption in pipe write
* fhandler.cc (fhandler_base_overlapped::raw_write): When performing
nonblocking I/O, copy user space data into own buffer. Add longish
comment to explain why.
* fhandler.h (fhandler_base_overlapped::atomic_write_buf): New member.
(fhandler_base_overlapped::fhandler_base_overlapped): Initialize
atomic_write_buf.
(fhandler_base_overlapped::fhandler_base_overlapped): New destructor,
free'ing atomic_write_buf.
(fhandler_base_overlapped::copyto): Set atomic_write_buf to NULL in
copied fhandler.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup/cygwin/fhandler.h')
-rw-r--r-- | winsup/cygwin/fhandler.h | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index e15f94632..6e964aaec 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -661,6 +661,7 @@ protected: OVERLAPPED io_status; OVERLAPPED *overlapped; size_t max_atomic_write; + void *atomic_write_buf; public: wait_return __reg3 wait_overlapped (bool, bool, DWORD *, bool, DWORD = 0); int __reg1 setup_overlapped (); @@ -670,7 +671,7 @@ public: OVERLAPPED *&get_overlapped () {return overlapped;} OVERLAPPED *get_overlapped_buffer () {return &io_status;} void set_overlapped (OVERLAPPED *ov) {overlapped = ov;} - fhandler_base_overlapped (): io_pending (false), overlapped (NULL), max_atomic_write (0) + fhandler_base_overlapped (): io_pending (false), overlapped (NULL), max_atomic_write (0), atomic_write_buf (NULL) { memset (&io_status, 0, sizeof io_status); } @@ -686,11 +687,17 @@ public: static void __reg1 flush_all_async_io ();; fhandler_base_overlapped (void *) {} + ~fhandler_base_overlapped () + { + if (atomic_write_buf) + cfree (atomic_write_buf); + } virtual void copyto (fhandler_base *x) { x->pc.free_strings (); *reinterpret_cast<fhandler_base_overlapped *> (x) = *this; + reinterpret_cast<fhandler_base_overlapped *> (x)->atomic_write_buf = NULL; x->reset (this); } |