comment
This commit is contained in:
parent
4288f7576a
commit
a358eb1faa
1 changed files with 52 additions and 0 deletions
|
@ -0,0 +1,52 @@
|
|||
[[!comment format=mdwn
|
||||
username="joey"
|
||||
subject="""comment 1"""
|
||||
date="2020-08-06T18:01:23Z"
|
||||
content="""
|
||||
Thanks, I was able to reproduce this easily:
|
||||
|
||||
git init r
|
||||
cd r
|
||||
mkdir a
|
||||
mkdir b
|
||||
dd if=/dev/zero of=a/big bs=1M count=1000
|
||||
cd b
|
||||
git annex add ../a & (sleep 1; mv ../b ~/trash)
|
||||
|
||||
By moving the directory the process is running in, all relative path
|
||||
accesses it does after the move are relative to the new location. This is
|
||||
super unsafe, but I don't know if it's super unsafe in a way that's unique to
|
||||
git-annex. If a process does any relative path accesses with ../ in them,
|
||||
it's going to be vulnerable to being flung around in this way and will start
|
||||
to do unexpected things.
|
||||
|
||||
git seems to avoid this being a problem by starting with a chdir to the top
|
||||
of the repo, and then uses relative paths without ../. (Mostly.. --git-dir
|
||||
with ../ in it will make git use such paths.)
|
||||
|
||||
Other commands.. not so much. `rm -rf ../foo` ends by unlinking "../foo"
|
||||
so if it's flung around it will delete the wrong thing. (Though its
|
||||
directory tree traversal uses openat() and so avoids deleting a whole wrong
|
||||
directory tree.) And `vim ../foo` overwrote an existing file after being
|
||||
moved, bypassing its usual protections about overwriting a modified file.
|
||||
|
||||
So, I think the super unsafe thing is generally moving directories around
|
||||
when they have processes running in them. Unfortunately, the file manager
|
||||
has a good reason to want to do it to handle deletions too.. Well, my
|
||||
opinion of unix's safety was already not great, but it's now gone down some
|
||||
more.
|
||||
|
||||
(Fun thing to consider: What if you have the ability to move a directory
|
||||
that a root-owned process is running in, and the root-owned process does
|
||||
relative paths accesses? This seems like it could be a fertile source of
|
||||
security holes.)
|
||||
|
||||
----
|
||||
|
||||
The git error message about the cached option happen when "git diff
|
||||
--cached" is run outside a git repository. Why is it outside a git
|
||||
repository? See above. So I don't think it can be avoided.
|
||||
|
||||
Only improvement that seems feasible is, to keep an open handle to the
|
||||
file, so it can fchmod the fix the permissions back.
|
||||
"""]]
|
Loading…
Reference in a new issue