diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2009-08-20 08:34:21 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2009-08-20 08:34:21 +0000 |
commit | 1c1b04b84cfedf7a7c6ce087d9644d6648372676 (patch) | |
tree | 2164743f228755601941500265256852b44a165a | |
parent | 5546e07b4f4106b0f11d3d1ab206422a636fd42b (diff) | |
download | newlib-1c1b04b84cfedf7a7c6ce087d9644d6648372676.zip newlib-1c1b04b84cfedf7a7c6ce087d9644d6648372676.tar.gz newlib-1c1b04b84cfedf7a7c6ce087d9644d6648372676.tar.bz2 |
* 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.
-rw-r--r-- | winsup/cygwin/ChangeLog | 11 | ||||
-rw-r--r-- | winsup/cygwin/dtable.cc | 16 | ||||
-rw-r--r-- | winsup/cygwin/dtable.h | 2 | ||||
-rw-r--r-- | winsup/cygwin/mmap.cc | 2 |
4 files changed, 23 insertions, 8 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 1e21dd0..3d16bbe 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -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. diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index 8783a62..377c138 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -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 diff --git a/winsup/cygwin/dtable.h b/winsup/cygwin/dtable.h index f685624..9d187e8 100644 --- a/winsup/cygwin/dtable.h +++ b/winsup/cygwin/dtable.h @@ -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 (); diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc index df4cb45..94dee5e 100644 --- a/winsup/cygwin/mmap.cc +++ b/winsup/cygwin/mmap.cc @@ -536,7 +536,7 @@ void mmap_record::free_fh (fhandler_base *fh) { if (!anonymous ()) - cfree (fh); + delete fh; } mmap_record * |