This is the mail archive of the gdb@sourceware.org mailing list for the GDB 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: MinGW status for readline


On Tue, Apr 11, 2006 at 11:05:03AM -0400, Chet Ramey wrote:
> Daniel Jacobowitz wrote:
> > On Tue, Apr 11, 2006 at 10:15:07AM -0400, Chet Ramey wrote:
> >> No, you never free username.  isolate_tilde_prefix allocates memory
> >> whether you have the getpwent family available or not.
> > 
> > It should be?  user_entry = 0, so the other branch of the if is taken.
> 
> ?
> 
> `username' is assigned before user_entry is.  It really should be freed
> outside the if-then block, now that I'm looking at it.

Well, yeah.  But:


#if defined (HAVE_GETPWNAM)
  user_entry = getpwnam (username);
#else
  user_entry = 0;
#endif
  if (user_entry == 0)
    {
      /* If the calling program has a special syntax for expanding tildes,
         and we couldn't find a standard expansion, then let them try.  */
      if (tilde_expansion_failure_hook)
        {
          expansion = (*tilde_expansion_failure_hook) (username);
          if (expansion)
            {
              dirname = glue_prefix_and_suffix (expansion, filename, user_len);
              free (expansion);
            }
        }
      free (username);
      /* If we don't have a failure hook, or if the failure hook did not
         expand the tilde, return a copy of what we were passed. */
      if (dirname == 0)
        dirname = savestring (filename);
    }
#if defined (HAVE_GETPWENT)
  else
    {
      free (username);
      dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
    }
  endpwent ();
#endif

Suppose !HAVE_GETPWENT.  Then probably also !HAVE_GETPWNAM.  So
user_entry = 0, so the first half of the if is taken, and username gets
freed.

I suppose this would make more sense though:

#if defined (HAVE_GETPWNAM)
  else
    {
      free (username);
      dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
    }
#endif
#if defined (HAVE_GETPWENT)
  endpwent ();
#endif

> 
> >> (I call endpwent() because its sole usual purpose is to close any open
> >> file descriptors on the password database, whatever it is.  getpwent
> >> and getpwnam usually keep the database open.)
> > 
> > Oh, huh.  So much for useful man pages.
> 
> The BSD man pages, at least, say
> 
> 	The endpwent() function closes any open files.
> 
> Chet
> -- 
> ``The lyf so short, the craft so long to lerne.'' - Chaucer
> ( ``Discere est Dolere'' -- chet )
> 				       Live Strong.  No day but today.
> Chet Ramey, ITS, CWRU    chet@case.edu    http://cnswww.cns.cwru.edu/~chet/
> 

-- 
Daniel Jacobowitz
CodeSourcery


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