joerg@mwtech.UUCP (Joerg Werner) (08/20/90)
I am using Minix ST 1.1, but I believe the following problem exists in
MINIX 1.5 (PC and ST), too.
Crossing from the mounting filesystem to the mounted-on filesystem
(cd ..) works only if the i-node-modes of the mounted-on and
mounted directories are identical (similar at least :-).
Try following commands:
# mkdir /mnt # if not already exists
# chmod 000 /mnt # mounted-on inode-mode
# ls -dl /mnt
d--------- 2 root 32 Jun 16 17:41 /mnt
# /etc/mount /dev/disk /mnt # use your favourite device
# chmod 755 /mnt # mounted inode-mode
# ls -dl /mnt
drwxr-xr-x 2 root 32 Jun 16 17:41 /mnt
# cd /mnt
# cd .. # good luck
If everything works ok so far, I am wrong and you can type 'n'. But
if you can't change the directory, there is probably a bug in the FS.
(Of course "cd /" still works.)
I think the function forbidden(rip,access_desired,real_uid) in
fs/protect,c is responsible for that. (I refer to AST's book
[11779-11824].-)
forbidden() doesn't check, if the inode 'rip' is a mounted point. If
the inode is marked as "mounted-on" this routine should find the
mounted inode and determine if the access for this inode is allowed.
I include the changes I made.
BTW, try this with SCO XENIX :-(. But before you change the directories
you must log in as a normal user (not root). If you type
$ cd /mnt
$ ls -la
you will probably miss the ".." entry.
Joerg
------------------------------------------------------------------------
PUBLIC int forbidden(rip, access_desired, real_uid)
register struct inode *rip;
mask_bits access_desired;
int real_uid;
{
register struct inode *old_rip = rip;
register struct super_block *sp;
register mask_bits bits, perm_bits, xmask;
int r, shift, test_uid, test_gid;
extern struct inode *get_inode();
if (rip->i_mount == I_MOUNT) /* The inode is mounted on. */
for (sp = &super_block[1]; sp < &super_block[NR_SUPERS]; sp++)
if (sp->s_imount == rip) {
rip = get_inode(sp->s_dev, ROOT_INODE);
break;
} /* if */
[ ... old code (not changed)... ]
if (rip != old_rip) put_inode(rip);
return r;
} /* forbidden */
--
Joerg Werner, email: joerg@mwtech.UUCP, voice: 49-(0)6151-37 33 66