Skip to content

Commit 63b807f

Browse files
dylanlanigansmithdylan-deepshard
authored andcommitted
Fix case when applying upperdir tar snapshot with empty files
Added size check to prevent sentry tmpfs mknodFromTar from trying to write empty files, this caused running containers from a snapshot from upper tar to fail when empty files were in the archive.
1 parent a46c37d commit 63b807f

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed

pkg/sentry/fsimpl/tmpfs/tar.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,10 @@ func (fs *filesystem) readFromTar(ctx context.Context, tr *tar.Reader) error {
7777
if n != header.Size {
7878
return fmt.Errorf("failed to read all file content, got %d bytes, want %d", n, header.Size)
7979
}
80+
if header.Size > 0 {
81+
fileToContent[header.Name] = &buffer
82+
}
8083
fileToHeader[header.Name] = header
81-
fileToContent[header.Name] = &buffer
8284
case tar.TypeFifo, tar.TypeBlock, tar.TypeChar:
8385
fileToHeader[header.Name] = header
8486
case tar.TypeSymlink:

runsc/container/container_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4035,11 +4035,10 @@ func TestTarRootfsUpperLayer(t *testing.T) {
40354035
if err := cont.Start(conf); err != nil {
40364036
t.Fatalf("error starting container: %v", err)
40374037
}
4038-
40394038
// Exec the command in the container.
40404039
execArgs := &control.ExecArgs{
40414040
Filename: app,
4042-
Argv: []string{app, "fsTreeCreate", "--depth=3", "--file-per-level=2", "--file-size=1470", "--create-symlink"},
4041+
Argv: []string{app, "fsTreeCreate", "--depth=3", "--file-per-level=2", "--file-size=1470", "--create-symlink", "--add-empty-files"},
40434042
}
40444043
if ws, err := cont.executeSync(conf, execArgs); err != nil {
40454044
t.Fatalf("error exec'ing: %v", err)

test/cmd/test_app/main.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ type fsTreeCreator struct {
6767
fileSize uint
6868
targetDir string
6969
createSymlink bool
70+
addEmptyFiles bool
7071
}
7172

7273
// Name implements subcommands.Command.Name.
@@ -91,6 +92,7 @@ func (c *fsTreeCreator) SetFlags(f *flag.FlagSet) {
9192
f.UintVar(&c.fileSize, "file-size", 4096, "size of each file")
9293
f.StringVar(&c.targetDir, "target-dir", "/", "directory under which to create the filesystem tree")
9394
f.BoolVar(&c.createSymlink, "create-symlink", false, "create symlinks other than the first file per level")
95+
f.BoolVar(&c.addEmptyFiles, "add-empty-files", false, "add empty file to each level")
9496
}
9597

9698
// Execute implements subcommands.Command.Execute.
@@ -117,6 +119,12 @@ func (c *fsTreeCreator) Execute(ctx context.Context, f *flag.FlagSet, args ...an
117119
}
118120
}
119121
}
122+
if c.addEmptyFiles {
123+
emptyPath := filepath.Join(curDir, fmt.Sprintf("empty%d", i))
124+
if err := os.WriteFile(emptyPath, nil, 0666); err != nil {
125+
log.Fatalf("error writing empty file %q: %v", emptyPath, err)
126+
}
127+
}
120128
nextDir := filepath.Join(curDir, "dir")
121129
if err := os.Mkdir(nextDir, 0777); err != nil {
122130
log.Fatalf("error creating directory %q: %v", nextDir, err)

0 commit comments

Comments
 (0)