First, rereading my e-mails I realize that there was some thinking behind my questions
which was only partially articulated.  Going back to my earlier position which I will restate
here as:
Use of a mask should never corrupt the semantics defined by the Single Unix
Specification
or its practical derivations and extensions, e.g., BSD and Linux.
That is, ideally if I created a standalone system that "looked" like the system the mask
provides then the process would behave equivalently.  I emphasize ideally because to
actually make that the case would require something closer to a virtual machine---which
is clearly beyond the scope of this project.

So I am looking for potential semantic anomalies which could be introduced by a
mask over a reiser4 file system, i.e., border cases where some upfront awareness
and attention may save re-design and re-writing later on.


Hans Reiser wrote:

The issue is how the mask might change the semantics of sys_execve().  I have spent some time
starting to trace code around, but more work is required.

For the moment I think we are safe if the setuid and setgroup can not be altered by the mask.

Ok.

For the moment I will focus on how the uid (and assume the group id will be similar)
of a process and how the mask might lead to a different uid than would be expected
under standard semantics.

So we agree that the process has an associated user: actually there is the concept
of real and effective uid also.

I believe the statement above to be true if the process never makes a setuid() system's call of
one flavor or another because the uid is inherited from the process calling execev() or is determined
by the owner of the executable if the executable's file set-uid permission bit is turned on via chmod.

We only change the semantics if the real/effective uid or gid is different at some point in the
processes execution because of the mask---begging situations where a call to setuid happens
only if a certain file is not available.

Say more.
If the process has the code like
if (stat("/etc/foobar.conf", statbuf)  < 0) {
     if (setuid(3) < 0) {   /* Try to become sys */
    }
    /* Do something here */
}
And the mask hides "/etc/foobar.conf" then in fact the uid
will change but not unexpectedly, IMO.  The mask is
creating a changed environment but the behavior is
understandable from the source code.

Put this another way, the semantics still seem correct to me
because you are getting the behavior of "/etc/foobar.conf" actually
not being there.

Now that I think about it masking a named pipe or a lock file
is perhaps more likely to cause problems then the setuid bit.
More cogitation required...  :-)