summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFabricio Voznika <fvoznika@google.com>2019-06-26 14:23:35 -0700
committergVisor bot <gvisor-bot@google.com>2019-06-26 14:24:44 -0700
commit42e212f6b7d4f6dd70e9751562f1524231e39a0e (patch)
treeead76a098737fe0bf48b52c9091f1edc88009f67
parent857e5c47e914aeeec12662d85466d91bf4ce3504 (diff)
Preserve permissions when checking lower
The code was wrongly assuming that only read access was required from the lower overlay when checking for permissions. This allowed non-writable files to be writable in the overlay. Fixes #316 PiperOrigin-RevId: 255263686
-rw-r--r--pkg/sentry/fs/inode_overlay.go6
-rw-r--r--runsc/boot/fs.go13
-rw-r--r--test/syscalls/BUILD2
3 files changed, 14 insertions, 7 deletions
diff --git a/pkg/sentry/fs/inode_overlay.go b/pkg/sentry/fs/inode_overlay.go
index 57b8b14e3..920d86042 100644
--- a/pkg/sentry/fs/inode_overlay.go
+++ b/pkg/sentry/fs/inode_overlay.go
@@ -537,12 +537,6 @@ func overlayCheck(ctx context.Context, o *overlayEntry, p PermMask) error {
if o.upper != nil {
err = o.upper.check(ctx, p)
} else {
- if p.Write {
- // Since writes will be redirected to the upper filesystem, the lower
- // filesystem need not be writable, but must be readable for copy-up.
- p.Write = false
- p.Read = true
- }
err = o.lower.check(ctx, p)
}
o.copyMu.RUnlock()
diff --git a/runsc/boot/fs.go b/runsc/boot/fs.go
index 67a286212..5c2220d83 100644
--- a/runsc/boot/fs.go
+++ b/runsc/boot/fs.go
@@ -85,6 +85,19 @@ func addOverlay(ctx context.Context, conf *Config, lower *fs.Inode, name string,
if err != nil {
return nil, fmt.Errorf("creating tmpfs overlay: %v", err)
}
+
+ // Replicate permissions and owner from lower to upper mount point.
+ attr, err := lower.UnstableAttr(ctx)
+ if err != nil {
+ return nil, fmt.Errorf("reading attributes from lower mount point: %v", err)
+ }
+ if !upper.InodeOperations.SetPermissions(ctx, upper, attr.Perms) {
+ return nil, fmt.Errorf("error setting permission to upper mount point")
+ }
+ if err := upper.InodeOperations.SetOwner(ctx, upper, attr.Owner); err != nil {
+ return nil, fmt.Errorf("setting owner to upper mount point: %v", err)
+ }
+
return fs.NewOverlayRoot(ctx, upper, lower, upperFlags)
}
diff --git a/test/syscalls/BUILD b/test/syscalls/BUILD
index 731e2aa85..b06e46c03 100644
--- a/test/syscalls/BUILD
+++ b/test/syscalls/BUILD
@@ -240,7 +240,7 @@ syscall_test(
syscall_test(test = "//test/syscalls/linux:munmap_test")
syscall_test(
- add_overlay = False, # TODO(gvisor.dev/issue/316): enable when fixed.
+ add_overlay = True,
test = "//test/syscalls/linux:open_create_test",
)