Discussion:
undelivered "dirperm1 and whiteouts bug"
s***@users.sourceforge.net
2016-08-31 10:29:57 UTC
Permalink
I don't know why but a bug report with a patch from Dave Mills was not
delivered to me. I've just find it in the mail archives on SF.net and
mail-archive.com.
If anyone knows him personally, please forward this mail to him since
the mail archive service doesn't display the sender's mail address.


Hello Dave,

Thanx for the report and the patch.
You are right. That is a bug of aufs dirperm1 option. I will include
your patch into next release. I hope you won't mind that the fix won't
be merged into aufs3 and aufs4.0.

J. R. Okajima


(Dave Mills' mail from the mail archive)
----------------------------------------------------------------------

Hi,
I noticed and fixed this for myself last year but hadn't got around to
reporting it.. :(
It appears that the current implementation of dirperm1 doesn't use the
correct permission overriding method when checking for whiteouts in dentry.c
The below bash script can simulate the issue:
#!/bin/bash
BASE=/root/aufsissue
BASE2=$BASE/aufs
#Create testuser
#adduser testissue
#Cleanup previous executions
umount $BASE2/mnt 2>/dev/null
rm -R $BASE2 2>/dev/null
#Setup a mount directory and two branches to be overlaid
mkdir $BASE2 $BASE2/branch1 $BASE2/branch2 $BASE2/mnt
#Mount branch1 on $BASE2/mnt
mount -t aufs -o dirperm1,dio,br:$BASE2/branch1=rw none $BASE2/mnt
#make two test directories on the lower branch
mkdir $BASE2/mnt/test1 $BASE2/mnt/test2
#Change permissions of two test directories
chmod -R 755 $BASE2/mnt/test1
chmod -R 700 $BASE2/mnt/test2
#Mount branch2 over branch1 in $BASE2/mnt
mount -t aufs -o
remount,dirperm1,mod:$BASE2/branch1=ro+wh,prepend:$BASE2/branch2=rwnone
$BASE2/mnt
#Change ownership of two test directories
chown -R testissue:testissue $BASE2/mnt/test1
chown -R testissue:testissue $BASE2/mnt/test2
#Works correctly
echo
echo This works correctly
su testissue -c "touch $BASE2/mnt/test1/works"
#ls shows file was created
ls -lart $BASE2/branch2/test1
#Fails as unable to check for whiteouts with au_wh_test
#Even though the user "testissue" has ownership it cant read whiteouts
#from the lower branch with permission 700 because at the lower branch
testissue isnt the owner.
#change dentry.c
#wh_found = au_wh_test(h_parent, wh_name, /*try_sio*/0);
#to
#wh_found = au_wh_test(h_parent, wh_name, /*try_sio*/ignore_perm);
echo
echo This fails
su testissue -c "touch $BASE2/mnt/test2/fails"
#ls shows no file was created
ls -lart $BASE2/branch2/test2
The below patch fixed the issue for me:
--- a/fs/aufs/dentry.c
+++ b/fs/aufs/dentry.c
@@ -57,7 +57,7 @@
br = au_sbr(dentry->d_sb, bindex);
wh_able = !!au_br_whable(br->br_perm);
if (wh_able)
- wh_found = au_wh_test(h_parent, wh_name, /*try_sio*/0);
+ wh_found = au_wh_test(h_parent, wh_name, /*try_sio*/ignore_perm);
h_dentry = ERR_PTR(wh_found);
if (!wh_found)
goto real_lookup;
Regards
Dave
N.B. Its also listed as this bug in
Docker [1]https://github.com/docker/docker/issues/20240

References

1. https://github.com/docker/docker/issues/20240

------------------------------------------------------------------------------
Loading...