bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: closeout bug?


From: Eric Blake
Subject: Re: closeout bug?
Date: Fri, 21 Jul 2006 20:03:14 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

Paul Eggert <eggert <at> CS.UCLA.EDU> writes:

> 
> How about something like this change?  It's simple, and it fixes the
> (perhaps-theoretical) problem.  One price we pay is that you must be
> careful about the order of atexit calls, but coreutils already invokes
> atexit (close_stdout) first, so that won't be a problem for coreutils.
> Another price is that applications must flush their buffers before
> exiting, and should not use tmpfile, but coreutils already does that
> as well.

This is a behavior change - previously, you could use close_stdout outside of 
an atexit handler, and still have atexit handlers invoked on error.  Should we 
document this change in the comment at the start of close_stdout (as opposed to 
inside the implementation body), stating that the recommended use is inside 
atexit?  Also, should we make the closeout module depend on the atexit module?

This also puts me in a bit of a dilemma with m4.  I just proposed adding 
tmpfile_safer to solve m4's bug where tmpfile could capture stderr output.  But 
using the closeout module would make this unsafe.  It would be nice to have a 
drop-in streams-based temporary file replacement that worked nicely with the 
closeout module, perhaps as part of Bruno's proposed module for temporary files 
with clean removal on exit.

A naive approach to safe tmp file removal is this, from m4's output.c:

FILE *
tmpfile (void)
{
  char buf[32];
  int fd;
  strcpy (buf, "/tmp/m4XXXXXX");
  fd = mkstemp (buf);
  if (fd < 0)
    return NULL;
  unlink (buf);
  return fdopen (fd, O_BINARY ? "wb+" : "w+");
}

However, POSIX allows unlink to fail if a file is in use, so coreutils's tac.c 
goes through some contortions when DONT_UNLINK_WHILE_OPEN is defined to 
register an atexit handler that closes the tmp file (although it also admits 
that there is a data race between the mkstemp and the eventual unlink; 
hopefully this is resolved by Bruno's module).

-- 
Eric Blake






reply via email to

[Prev in Thread] Current Thread [Next in Thread]