Fix error when loading irregular files

Signed-off-by: 's avatarMatt Farina <matt@mattfarina.com>
parent 3e4c19b3
...@@ -355,6 +355,13 @@ func LoadDir(dir string) (*chart.Chart, error) { ...@@ -355,6 +355,13 @@ func LoadDir(dir string) (*chart.Chart, error) {
return nil 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) data, err := ioutil.ReadFile(name)
if err != nil { if err != nil {
return fmt.Errorf("error reading %s: %s", n, err) return fmt.Errorf("error reading %s: %s", n, err)
......
...@@ -23,6 +23,7 @@ import ( ...@@ -23,6 +23,7 @@ import (
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
"runtime"
"strings" "strings"
"testing" "testing"
"time" "time"
...@@ -51,6 +52,40 @@ func TestLoadNonV1Chart(t *testing.T) { ...@@ -51,6 +52,40 @@ func TestLoadNonV1Chart(t *testing.T) {
t.Fatalf("chart with v2 apiVersion should not load") t.Fatalf("chart with v2 apiVersion should not load")
} }
func TestLoadDirWithSymlinks(t *testing.T) {
sym := filepath.Join("..", "frobnitz", "README.md")
link := filepath.Join("testdata", "frobnitz_symlinks", "README.md")
if err := os.Symlink(sym, link); err != nil {
t.Fatal(err)
}
defer os.Remove(link)
c, err := Load("testdata/frobnitz_symlinks")
if err != nil {
t.Fatalf("Failed to load testdata: %s", err)
}
verifyFrobnitz(t, c)
verifyChart(t, c)
verifyRequirements(t, c)
}
func TestLoadDirWithBadSymlinks(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("test only works on unix systems with /dev/null present")
}
_, err := Load("testdata/bad_symlink")
if err == nil {
t.Fatal("Failed to detect bad symlink")
}
if !strings.HasPrefix(err.Error(), "cannot load irregular file") {
t.Errorf("Expected bad symlink error got %q", err)
}
}
func TestLoadFile(t *testing.T) { func TestLoadFile(t *testing.T) {
c, err := Load("testdata/frobnitz-1.2.3.tgz") c, err := Load("testdata/frobnitz-1.2.3.tgz")
if err != nil { if err != nil {
......
apiVersion: v1
name: badsymlink
description: A bad symlink is in here
version: "1.0.0"
# Frobnitz
This is an example chart.
## Usage
This is an example. It has no usage.
## Development
For developer info, see the top-level repository.
/dev/null
\ No newline at end of file
# A values file contains configuration.
name: "Some Name"
section:
name: "Name in a section"
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
This is an install document. The client may display this.
This should be ignored by the loader, but may be included in a chart.
apiVersion: v1
name: alpine
description: Deploy a basic Alpine Linux pod
version: 0.1.0
home: https://helm.sh/helm
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`.
apiVersion: v1
name: mast1
description: A Helm chart for Kubernetes
version: 0.1.0
home: ""
# Default values for mast1.
# This is a YAML-formatted file.
# Declare name/value pairs to be passed into your templates.
# name = "value"
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"]
This is a placeholder for documentation.
<?xml version="1.0"?>
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0" width="256" height="256" id="test">
<desc>Example icon</desc>
<rect id="first" x="2" y="2" width="40" height="60" fill="navy"/>
<rect id="second" x="15" y="4" width="40" height="60" fill="red"/>
</svg>
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
dependencies:
- name: alpine
version: "0.1.0"
repository: https://example.com/charts
- name: mariner
version: "4.3.2"
repository: https://example.com/charts
# A values file contains configuration.
name: "Some Name"
section:
name: "Name in a section"
...@@ -22,6 +22,7 @@ package sympath ...@@ -22,6 +22,7 @@ package sympath
import ( import (
"fmt" "fmt"
"log"
"os" "os"
"path/filepath" "path/filepath"
"sort" "sort"
...@@ -69,6 +70,7 @@ func symwalk(path string, info os.FileInfo, walkFn filepath.WalkFunc) error { ...@@ -69,6 +70,7 @@ func symwalk(path string, info os.FileInfo, walkFn filepath.WalkFunc) error {
if err != nil { if err != nil {
return fmt.Errorf("error evaluating symlink %s: %s", path, err) return fmt.Errorf("error evaluating symlink %s: %s", path, err)
} }
log.Printf("found symbolic link in path: %s resolves to %s", path, resolved)
if info, err = os.Lstat(resolved); err != nil { if info, err = os.Lstat(resolved); err != nil {
return err return err
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment