This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: failure of unzip and recent cygwin1.dll


On Tue, Feb 17, 2004 at 12:33:34PM -0500, Christopher Faylor wrote:
> On Tue, Feb 17, 2004 at 11:09:39AM -0500, Christopher Faylor wrote:
> >>I believe a destructor would be cleaner, and the current code obviously
> >>misses at least one more place where this is needed.  Unfortunately, with
> >>my copyright assignment in flux, I can't send in a patch.  If noone fixes
> >>this by the time I can send patches, I'll try to send in a fix for this.
> >
> >It's not that simple.  path_conv objects can persist, even over fork/exec.
> >So a simple destructor would be guaranteed to do the wrong thing.
> 
> Actually maybe it is that simple.  In my exhaustive testing (i.e., one
> program) it seems like a destructor works just fine.  This is, I
> suppose, a tribute to the person who wrote most of the path handling
> code.  I should have had more faith in his abilities.
> 
> On reflection, another reason for not doing things this way was to avoid
> the cost of a destructor for all of the cases that path_conv was used
> when it wasn't really needed for the vast majority of cases.  I've been
> trying to move more and more to using fhandler_* instead of path_conv
> and fhandler does free normalized_path.  However, I obviously haven't
> done a 100% conversion so it's better to be safe.

I think I have figured it out.
stat_worker (and others like it) calls fh = build_fh_name()
which instantiates a path_conv, which may call cmalloc for the
normalized_path.
If everyting goes OK, the path_conv is copied into the handler
structure, in fh->set_name (pc).
There lies the rub: the normalized_path is cmalloced again.
That was unnecessary (before the destructor was added) because the
normalized path was not destroyed when build_fh_name() terminates.

As Chris points out, the original method (without destructor) is more
efficient (even more so without the unneeded cmalloc), but there is a
danger of leak. 
However a normalized path is only created when the PC_POSIX flag is 
given, which happens only in 3 spots. AFAICS the path_conv was 
properly handled in these three cases.

Pierre
 
 
  

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]