Soren Hansen wrote:
> On Thu, May 17, 2007 at 06:03:18PM -0700, Micah Cowan wrote:
>>> A completely different approach could be that the calls that
>>> actually write to a file check that the file does not exist. You
>>> could activate this with a system-wide flag, but I strongly suspect
>>> that this would be more work than the few words it took for me to
>>> write the idea.
>> The call of which you speak (open()) already does this, unless you
>> tell it that you specifically wish to overwrite files (which tar
>> does).
> 
> That's not quite right.
> 
> Usually, you'll just pass the O_CREAT and O_TRUNC flags to open(2) in
> order to just open the file (creating it if it doesn't exist already),
> while you have to explicitly give it the O_EXCL flag to bail out if the
> file already exists.

True, my bad: you do have to explicitly ask it not to overwrite. I was
thinking of O_TRUNC for some reason, but of course, without O_TRUNC it
will still overwrite the existing file (just without truncating it first).

> Passing --backup to tar makes it check if it should
> make a backup of the file, does so, and then proceeds to open the file
> with (O_WRONLY | O_BINARY | O_CREAT | O_TRUNC) unless you pass it '-k',
> in which case O_TRUNC is replaced with O_EXCL.

Ouch, so it does. That's broken (race condition). OTOH, I've racked my
brain to come up with an alternate solution, and they all have race
conditions (or else copy to a backup instead of move, which may not be
an improvement over the race condition), so maybe it's not broken.

-- 
Micah J. Cowan
Programmer, musician, typesetting enthusiast, gamer...
http://micah.cowan.name/


Attachment: signature.asc
Description: OpenPGP digital signature

-- 
Ubuntu-devel-discuss mailing list
Ubuntu-devel-discuss@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/ubuntu-devel-discuss

Reply via email to