Thread (1 message) 1 message, 1 author, 2016-06-15

Re: Possible Solaris problem in 'checkout_entry()'

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:44:24

Linus Torvalds [off-list ref] writes:
On Mon, 17 Mar 2008, Linus Torvalds wrote:
quoted
IOW, the real "checking" is taking place in "create_file()", so if the 
unlinking failed (due to a read-only directory or something), that's where 
we'll do the proper error reporting.
Thinking about this, I'm probably full of sh*t.

My argument is admittedly true in general, but there is one case it is 
*not* true for: if the old entry was a symlink.

IOW, let's imagine that the directory is read-only (or other permission 
issue), and we want to unlink the old symlink, which points somewhere we 
can write to. In that case, the symlink removal is important, because we 
won't necessarily catch the error when we create the file in place later 
(because that will just follow the symlink).

So I retract my statement. We *should* check the result of the unlink.
While I agree we should check the result, I think we are safe against the
un-unlinkable symlink case.  If you have a stale symlink at "dir/file"
where you are checking out a new blob, and the directory "dir" the symlink
is in is unwritable, then our callpath would look like this:

	checkout_entry()
         unlink("dir/file") -- failure silently ignored which is bad
	 write_entry()
          create_file("dir/file")
           open("dir/file", O_WRONLY | O_CREAT | O_EXCL)

which would fail, and we get:

    error: git-checkout-index: unable to create file a/b (File exists)

from around ll.135 in entry.c::write_entry()

So I'll apply the patch purely as "Root on Solaris safety fix".
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help