Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rofiles-fuse: Fix lchown() (and pro-actively NOFOLLOW) #1137

Closed
wants to merge 1 commit into from

Commits on Sep 7, 2017

  1. rofiles-fuse: Fix lchown() and hardlink verification for symlinks

    If you lchown("symlink") then we were incorrectly trying to chown the
    symlink target, rather than the symlink itself. In particular, this cause
    cp -a to fail for a broken symlink. Additionally, it was using the
    symlink target when verifying writability, rather than the symlink
    itself.
    
    To fix this, we need pass AT_SYMLINK_NOFOLLOW in these cases.
    
    In general, the kernel itself will always resolve any symlinks for us
    before calling into the fuse backend, so we should really never do any
    symlink following in the fuse fs itself. So, we pro-actively add
    NOFOLLOW flags to a few other places:
    
     truncate:
          In reality this will never be hit, because
          the kernel will resolve symlinks before calling us.
     access:
          It seems the current fuse implementation never calls this
          (faccessat w/AT_SYMLINK_NOFOLLOW never reaches the fuse fs)
          but if this ever is implemented this is the correct behaviour.
    
    We would ideally do `chmod` but this is not implemented on current kernels.
    Because we're not multi-threaded, this is OK anyways.
    
    Further, our write verification wasn't correctly handling the case of hardlinked
    symlinks, which can occur for `bare` checkouts but *not* `bare-user` which the
    tests were using. Change to `bare` mode to verify that.
    alexlarsson authored and cgwalters committed Sep 7, 2017
    Configuration menu
    Copy the full SHA
    3c906f9 View commit details
    Browse the repository at this point in the history