diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index c3e05ff8b..7c422e196 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -691,6 +691,17 @@ dtable::dup_worker (fhandler_base *oldfh, int flags, DWORD src_pid) if (src_pid && oldfh->archetype && !(newfh->archetype = find_archetype (oldfh->dev ()))) need_new_arch = true; + newfh->pc.close_conv_handle (); + if (oldfh->dup (newfh, flags)) + { + delete newfh; + newfh = NULL; + debug_printf ("oldfh->dup failed"); + } + else + { + /* Don't increment refcnt here since we don't know if this is a + allocated fd. So we leave this chore to the caller. */ if (!oldfh->archetype) newfh->set_handle (NULL); diff --git a/winsup/cygwin/fhandler_pipe.cc b/winsup/cygwin/fhandler_pipe.cc index 5683cb6e1..bf9613dc1 100644 --- a/winsup/cygwin/fhandler_pipe.cc +++ b/winsup/cygwin/fhandler_pipe.cc @@ -98,7 +98,7 @@ fhandler_pipe::open (int flags, mode_t mode) continue; cfd->copyto (this); set_handle (NULL); - pc.reset_conv_handle (); + pc.close_conv_handle (); if (!cfd->dup (this, flags)) return 1; return 0; diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index 7ec784e8b..33e7fdf6a 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -406,8 +406,6 @@ class path_conv return conv_handle.get_finfo (h, fs.is_nfs ()); } inline ino_t get_ino () const { return conv_handle.get_ino (fs.is_nfs ()); } - void set_conv_handle (HANDLE h) { conv_handle.set (h); } - void reset_conv_handle () { conv_handle.set (NULL); } void close_conv_handle () { conv_handle.close (); } ino_t get_ino_by_handle (HANDLE h);