OSDN Git Service

* dtable.cc (build_fh_dev): Take additional bool parameter indicating
authorcorinna <corinna>
Thu, 20 Aug 2009 08:34:19 +0000 (08:34 +0000)
committercorinna <corinna>
Thu, 20 Aug 2009 08:34:19 +0000 (08:34 +0000)
whether set_name should be called or not.
(dtable::dup_worker): Call build_fh_pc with new second parameter set
to false.  Explain why.  If fhandler's dup failed, delete rather than
cfree newfh and set newfh to NULL to indicate failure correctly.
* dtable.h (build_fh_pc): Change declaration according to above change.
Default set_name parameter to true.
* mmap.cc (mmap_record::free_fh): Delete rather than cfree fh.

winsup/cygwin/ChangeLog
winsup/cygwin/dtable.cc
winsup/cygwin/dtable.h
winsup/cygwin/mmap.cc

index 1e21dd0..3d16bbe 100644 (file)
@@ -1,3 +1,14 @@
+2009-08-20  Corinna Vinschen  <corinna@vinschen.de>
+
+       * dtable.cc (build_fh_dev): Take additional bool parameter indicating
+       whether set_name should be called or not.
+       (dtable::dup_worker): Call build_fh_pc with new second parameter set
+       to false.  Explain why.  If fhandler's dup failed, delete rather than
+       cfree newfh and set newfh to NULL to indicate failure correctly.
+       * dtable.h (build_fh_pc): Change declaration according to above change.
+       Default set_name parameter to true.
+       * mmap.cc (mmap_record::free_fh): Delete rather than cfree fh.
+
 2009-08-18  Christopher Faylor  <me+cygwin@cgf.cx>
 
        * dtable.cc (dtable::fixup_after_exec): Close any popen'ed file handles here.
index 8783a62..377c138 100644 (file)
@@ -444,7 +444,7 @@ build_fh_dev (const device& dev, const char *unix_name)
 
 #define fh_unset ((fhandler_base *) 1)
 fhandler_base *
-build_fh_pc (path_conv& pc)
+build_fh_pc (path_conv& pc, bool set_name)
 {
   fhandler_base *fh = fh_unset;
 
@@ -564,10 +564,10 @@ build_fh_pc (path_conv& pc)
   if (fh == fh_unset)
     fh = cnew (fhandler_nodevice) ();
 
-  if (fh)
-    fh->set_name (pc);
-  else
+  if (!fh)
     set_errno (EMFILE);
+  else if (set_name)
+    fh->set_name (pc);
 
   debug_printf ("fh %p", fh);
   return fh;
@@ -576,7 +576,10 @@ build_fh_pc (path_conv& pc)
 fhandler_base *
 dtable::dup_worker (fhandler_base *oldfh)
 {
-  fhandler_base *newfh = build_fh_pc (oldfh->pc);
+  /* Don't call set_name in build_fh_pc.  It will be called in
+     fhandler_base::operator= below.  Calling it twice will result
+     in double allocation. */
+  fhandler_base *newfh = build_fh_pc (oldfh->pc, false);
   if (!newfh)
     debug_printf ("build_fh_pc failed");
   else
@@ -585,7 +588,8 @@ dtable::dup_worker (fhandler_base *oldfh)
       newfh->set_io_handle (NULL);
       if (oldfh->dup (newfh))
        {
-         cfree (newfh);
+         delete newfh;
+         newfh = NULL;
          debug_printf ("oldfh->dup failed");
        }
       else
index f685624..9d187e8 100644 (file)
@@ -83,7 +83,7 @@ public:
 fhandler_base *build_fh_dev (const device&, const char * = NULL);
 fhandler_base *build_fh_name (const char *, HANDLE = NULL, unsigned = 0, suffix_info * = NULL);
 fhandler_base *build_fh_name (const UNICODE_STRING *, HANDLE = NULL, unsigned = 0, suffix_info * = NULL);
-fhandler_base *build_fh_pc (path_conv& pc);
+fhandler_base *build_fh_pc (path_conv& pc, bool set_name = true);
 
 void dtable_init ();
 void stdio_init ();
index df4cb45..94dee5e 100644 (file)
@@ -536,7 +536,7 @@ void
 mmap_record::free_fh (fhandler_base *fh)
 {
   if (!anonymous ())
-    cfree (fh);
+    delete fh;
 }
 
 mmap_record *