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