diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-09-29 22:52:35 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-09-29 22:52:35 +0000 |
commit | a5f93401d35c8c84b5f99c4b0b63f0f4aa0d262e (patch) | |
tree | ac73440abba28859617c92cb404a2a267c7507ec /pkg/sentry/fs | |
parent | 503847eeb85b1172ec55679aec241d4fa235f08f (diff) | |
parent | 4a428b13b20baf055e7e70ecb51a87299f0c6d8e (diff) |
Merge release-20200921.0-71-g4a428b13b (automated)
Diffstat (limited to 'pkg/sentry/fs')
-rw-r--r-- | pkg/sentry/fs/proc/proc_state_autogen.go | 27 | ||||
-rw-r--r-- | pkg/sentry/fs/proc/task.go | 44 |
2 files changed, 71 insertions, 0 deletions
diff --git a/pkg/sentry/fs/proc/proc_state_autogen.go b/pkg/sentry/fs/proc/proc_state_autogen.go index f7f65fa43..de5e7de5e 100644 --- a/pkg/sentry/fs/proc/proc_state_autogen.go +++ b/pkg/sentry/fs/proc/proc_state_autogen.go @@ -1037,6 +1037,32 @@ func (x *exe) StateLoad(m state.Source) { m.Load(1, &x.t) } +func (x *cwd) StateTypeName() string { + return "pkg/sentry/fs/proc.cwd" +} + +func (x *cwd) StateFields() []string { + return []string{ + "Symlink", + "t", + } +} + +func (x *cwd) beforeSave() {} + +func (x *cwd) StateSave(m state.Sink) { + x.beforeSave() + m.Save(0, &x.Symlink) + m.Save(1, &x.t) +} + +func (x *cwd) afterLoad() {} + +func (x *cwd) StateLoad(m state.Source) { + m.Load(0, &x.Symlink) + m.Load(1, &x.t) +} + func (x *namespaceSymlink) StateTypeName() string { return "pkg/sentry/fs/proc.namespaceSymlink" } @@ -1527,6 +1553,7 @@ func init() { state.Register((*subtasks)(nil)) state.Register((*subtasksFile)(nil)) state.Register((*exe)(nil)) + state.Register((*cwd)(nil)) state.Register((*namespaceSymlink)(nil)) state.Register((*mapsData)(nil)) state.Register((*smapsData)(nil)) diff --git a/pkg/sentry/fs/proc/task.go b/pkg/sentry/fs/proc/task.go index 103bfc600..22d658acf 100644 --- a/pkg/sentry/fs/proc/task.go +++ b/pkg/sentry/fs/proc/task.go @@ -84,6 +84,7 @@ func (p *proc) newTaskDir(t *kernel.Task, msrc *fs.MountSource, isThreadGroup bo "auxv": newAuxvec(t, msrc), "cmdline": newExecArgInode(t, msrc, cmdlineExecArg), "comm": newComm(t, msrc), + "cwd": newCwd(t, msrc), "environ": newExecArgInode(t, msrc, environExecArg), "exe": newExe(t, msrc), "fd": newFdDir(t, msrc), @@ -300,6 +301,49 @@ func (e *exe) Readlink(ctx context.Context, inode *fs.Inode) (string, error) { return exec.PathnameWithDeleted(ctx), nil } +// cwd is an fs.InodeOperations symlink for the /proc/PID/cwd file. +// +// +stateify savable +type cwd struct { + ramfs.Symlink + + t *kernel.Task +} + +func newCwd(t *kernel.Task, msrc *fs.MountSource) *fs.Inode { + cwdSymlink := &cwd{ + Symlink: *ramfs.NewSymlink(t, fs.RootOwner, ""), + t: t, + } + return newProcInode(t, cwdSymlink, msrc, fs.Symlink, t) +} + +// Readlink implements fs.InodeOperations. +func (e *cwd) Readlink(ctx context.Context, inode *fs.Inode) (string, error) { + if !kernel.ContextCanTrace(ctx, e.t, false) { + return "", syserror.EACCES + } + if err := checkTaskState(e.t); err != nil { + return "", err + } + cwd := e.t.FSContext().WorkingDirectory() + if cwd == nil { + // It could have raced with process deletion. + return "", syserror.ESRCH + } + defer cwd.DecRef(ctx) + + root := fs.RootFromContext(ctx) + if root == nil { + // It could have raced with process deletion. + return "", syserror.ESRCH + } + defer root.DecRef(ctx) + + name, _ := cwd.FullName(root) + return name, nil +} + // namespaceSymlink represents a symlink in the namespacefs, such as the files // in /proc/<pid>/ns. // |