Skip to content

Commit

Permalink
fix(loader): error out when loading irregular files
Browse files Browse the repository at this point in the history
Signed-off-by: Matthew Fisher <matt.fisher@microsoft.com>
  • Loading branch information
Matthew Fisher committed Oct 29, 2019
1 parent 82a100b commit 5a7d4f1
Show file tree
Hide file tree
Showing 44 changed files with 261 additions and 0 deletions.
2 changes: 2 additions & 0 deletions internal/sympath/walk.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ limitations under the License.
package sympath

import (
"log"
"os"
"path/filepath"
"sort"
Expand Down Expand Up @@ -70,6 +71,7 @@ func symwalk(path string, info os.FileInfo, walkFn filepath.WalkFunc) error {
if err != nil {
return errors.Wrapf(err, "error evaluating symlink %s", path)
}
log.Printf("found symbolic link in path: %s resolves to %s", path, resolved)
if info, err = os.Lstat(resolved); err != nil {
return err
}
Expand Down
8 changes: 8 additions & 0 deletions pkg/chart/loader/directory.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
package loader

import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
Expand Down Expand Up @@ -91,6 +92,13 @@ func LoadDir(dir string) (*chart.Chart, error) {
return nil
}

// Irregular files include devices, sockets, and other uses of files that
// are not regular files. In Go they have a file mode type bit set.
// See https://golang.org/pkg/os/#FileMode for examples.
if !fi.Mode().IsRegular() {
return fmt.Errorf("cannot load irregular file %s as it has file mode type bits set", name)
}

data, err := ioutil.ReadFile(name)
if err != nil {
return errors.Wrapf(err, "error reading %s", n)
Expand Down
40 changes: 40 additions & 0 deletions pkg/chart/loader/load_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
"runtime"
"strings"
"testing"
"time"
Expand All @@ -45,6 +46,45 @@ func TestLoadDir(t *testing.T) {
verifyDependenciesLock(t, c)
}

func TestLoadDirWithDevNull(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("test only works on unix systems with /dev/null present")
}

l, err := Loader("testdata/frobnitz_with_dev_null")
if err != nil {
t.Fatalf("Failed to load testdata: %s", err)
}
if _, err := l.Load(); err == nil {
t.Errorf("packages with an irregular file (/dev/null) should not load")
}
}

func TestLoadDirWithSymlink(t *testing.T) {
sym := filepath.Join("..", "LICENSE")
link := filepath.Join("testdata", "frobnitz_with_symlink", "LICENSE")

if err := os.Symlink(sym, link); err != nil {
t.Fatal(err)
}

defer os.Remove(link)

l, err := Loader("testdata/frobnitz_with_symlink")
if err != nil {
t.Fatalf("Failed to load testdata: %s", err)
}

c, err := l.Load()
if err != nil {
t.Fatalf("Failed to load testdata: %s", err)
}
verifyFrobnitz(t, c)
verifyChart(t, c)
verifyDependencies(t, c)
verifyDependenciesLock(t, c)
}

func TestLoadV1(t *testing.T) {
l, err := Loader("testdata/frobnitz.v1")
if err != nil {
Expand Down
1 change: 1 addition & 0 deletions pkg/chart/loader/testdata/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
LICENSE placeholder.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ignore/
8 changes: 8 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_dev_null/Chart.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
dependencies:
- name: alpine
version: "0.1.0"
repository: https://example.com/charts
- name: mariner
version: "4.3.2"
repository: https://example.com/charts
digest: invalid
27 changes: 27 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_dev_null/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
apiVersion: v1
name: frobnitz
description: This is a frobnitz.
version: "1.2.3"
keywords:
- frobnitz
- sprocket
- dodad
maintainers:
- name: The Helm Team
email: helm@example.com
- name: Someone Else
email: nobody@example.com
sources:
- https://example.com/foo/bar
home: http://example.com
icon: https://example.com/64x64.png
annotations:
extrakey: extravalue
anotherkey: anothervalue
dependencies:
- name: alpine
version: "0.1.0"
repository: https://example.com/charts
- name: mariner
version: "4.3.2"
repository: https://example.com/charts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is an install document. The client may display this.
1 change: 1 addition & 0 deletions pkg/chart/loader/testdata/frobnitz_with_dev_null/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
LICENSE placeholder.
11 changes: 11 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_dev_null/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Frobnitz

This is an example chart.

## Usage

This is an example. It has no usage.

## Development

For developer info, see the top-level repository.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This should be ignored by the loader, but may be included in a chart.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
apiVersion: v1
name: alpine
description: Deploy a basic Alpine Linux pod
version: 0.1.0
home: https://helm.sh/helm
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
This example was generated using the command `helm create alpine`.

The `templates/` directory contains a very simple pod resource with a
couple of parameters.

The `values.toml` file contains the default values for the
`alpine-pod.yaml` template.

You can install this example using `helm install ./alpine`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
apiVersion: v1
name: mast1
description: A Helm chart for Kubernetes
version: 0.1.0
home: ""
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Default values for mast1.
# This is a YAML-formatted file.
# Declare name/value pairs to be passed into your templates.
# name = "value"
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: v1
kind: Pod
metadata:
name: {{.Release.Name}}-{{.Chart.Name}}
labels:
app.kubernetes.io/managed-by: {{.Release.Service}}
app.kubernetes.io/name: {{.Chart.Name}}
helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
spec:
restartPolicy: {{default "Never" .restart_policy}}
containers:
- name: waiter
image: "alpine:3.9"
command: ["/bin/sleep","9000"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# The pod name
name: "my-alpine"
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is a placeholder for documentation.
8 changes: 8 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_dev_null/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file.
1 change: 1 addition & 0 deletions pkg/chart/loader/testdata/frobnitz_with_dev_null/null
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello {{.Name | default "world"}}
6 changes: 6 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_dev_null/values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# A values file contains configuration.

name: "Some Name"

section:
name: "Name in a section"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ignore/
8 changes: 8 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_symlink/Chart.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
dependencies:
- name: alpine
version: "0.1.0"
repository: https://example.com/charts
- name: mariner
version: "4.3.2"
repository: https://example.com/charts
digest: invalid
27 changes: 27 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_symlink/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
apiVersion: v1
name: frobnitz
description: This is a frobnitz.
version: "1.2.3"
keywords:
- frobnitz
- sprocket
- dodad
maintainers:
- name: The Helm Team
email: helm@example.com
- name: Someone Else
email: nobody@example.com
sources:
- https://example.com/foo/bar
home: http://example.com
icon: https://example.com/64x64.png
annotations:
extrakey: extravalue
anotherkey: anothervalue
dependencies:
- name: alpine
version: "0.1.0"
repository: https://example.com/charts
- name: mariner
version: "4.3.2"
repository: https://example.com/charts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is an install document. The client may display this.
11 changes: 11 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_symlink/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Frobnitz

This is an example chart.

## Usage

This is an example. It has no usage.

## Development

For developer info, see the top-level repository.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This should be ignored by the loader, but may be included in a chart.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
apiVersion: v1
name: alpine
description: Deploy a basic Alpine Linux pod
version: 0.1.0
home: https://helm.sh/helm
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
This example was generated using the command `helm create alpine`.

The `templates/` directory contains a very simple pod resource with a
couple of parameters.

The `values.toml` file contains the default values for the
`alpine-pod.yaml` template.

You can install this example using `helm install ./alpine`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
apiVersion: v1
name: mast1
description: A Helm chart for Kubernetes
version: 0.1.0
home: ""
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Default values for mast1.
# This is a YAML-formatted file.
# Declare name/value pairs to be passed into your templates.
# name = "value"
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: v1
kind: Pod
metadata:
name: {{.Release.Name}}-{{.Chart.Name}}
labels:
app.kubernetes.io/managed-by: {{.Release.Service}}
app.kubernetes.io/name: {{.Chart.Name}}
helm.sh/chart: "{{.Chart.Name}}-{{.Chart.Version}}"
spec:
restartPolicy: {{default "Never" .restart_policy}}
containers:
- name: waiter
image: "alpine:3.9"
command: ["/bin/sleep","9000"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# The pod name
name: "my-alpine"
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is a placeholder for documentation.
8 changes: 8 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_symlink/icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello {{.Name | default "world"}}
6 changes: 6 additions & 0 deletions pkg/chart/loader/testdata/frobnitz_with_symlink/values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# A values file contains configuration.

name: "Some Name"

section:
name: "Name in a section"

0 comments on commit 5a7d4f1

Please sign in to comment.