Pass overlay credentials via context in copy up.

Some VFS operations (those which operate on FDs) get their credentials via the
context instead of via an explicit creds param. For these cases, we must pass
the overlay credentials on the context.

PiperOrigin-RevId: 327881259
This commit is contained in:
Nicolas Lacasse
2020-08-21 15:06:09 -07:00
committed by gVisor bot
parent 5ec3d4ed3e
commit 5f33fdf37e
3 changed files with 26 additions and 21 deletions
+1 -21
View File
@@ -144,27 +144,7 @@ func (t *TestContext) MemoryFile() *pgalloc.MemoryFile {
// RootContext returns a Context that may be used in tests that need root
// credentials. Uses ptrace as the platform.Platform.
func RootContext(tb testing.TB) context.Context {
return WithCreds(Context(tb), auth.NewRootCredentials(auth.NewRootUserNamespace()))
}
// WithCreds returns a copy of ctx carrying creds.
func WithCreds(ctx context.Context, creds *auth.Credentials) context.Context {
return &authContext{ctx, creds}
}
type authContext struct {
context.Context
creds *auth.Credentials
}
// Value implements context.Context.
func (ac *authContext) Value(key interface{}) interface{} {
switch key {
case auth.CtxCredentials:
return ac.creds
default:
return ac.Context.Value(key)
}
return auth.ContextWithCredentials(Context(tb), auth.NewRootCredentials(auth.NewRootUserNamespace()))
}
// WithLimitSet returns a copy of ctx carrying l.
+5
View File
@@ -22,6 +22,7 @@ import (
"gvisor.dev/gvisor/pkg/abi/linux"
"gvisor.dev/gvisor/pkg/context"
"gvisor.dev/gvisor/pkg/fspath"
"gvisor.dev/gvisor/pkg/sentry/kernel/auth"
"gvisor.dev/gvisor/pkg/sentry/vfs"
"gvisor.dev/gvisor/pkg/syserror"
"gvisor.dev/gvisor/pkg/usermem"
@@ -40,6 +41,10 @@ func (d *dentry) copyUpLocked(ctx context.Context) error {
return nil
}
// Attach our credentials to the context, as some VFS operations use
// credentials from context rather an take an explicit creds parameter.
ctx = auth.ContextWithCredentials(ctx, d.fs.creds)
ftype := atomic.LoadUint32(&d.mode) & linux.S_IFMT
switch ftype {
case linux.S_IFREG, linux.S_IFDIR, linux.S_IFLNK, linux.S_IFBLK, linux.S_IFCHR:
+20
View File
@@ -34,3 +34,23 @@ func CredentialsFromContext(ctx context.Context) *Credentials {
}
return NewAnonymousCredentials()
}
// ContextWithCredentials returns a copy of ctx carrying creds.
func ContextWithCredentials(ctx context.Context, creds *Credentials) context.Context {
return &authContext{ctx, creds}
}
type authContext struct {
context.Context
creds *Credentials
}
// Value implements context.Context.
func (ac *authContext) Value(key interface{}) interface{} {
switch key {
case CtxCredentials:
return ac.creds
default:
return ac.Context.Value(key)
}
}