Fix chartutils/errors.go stack overflow

- Changes to use a struct with string property
- Changes references in chartutil/values.go

Signed-off-by: Ken Perkins <ken.perkins@rackspace.com>
pull/6672/head
Ken Perkins 5 years ago
parent 01ea487582
commit 060def3b88

@ -21,11 +21,15 @@ import (
) )
// ErrNoTable indicates that a chart does not have a matching table. // ErrNoTable indicates that a chart does not have a matching table.
type ErrNoTable string type ErrNoTable struct {
Key string
}
func (e ErrNoTable) Error() string { return fmt.Sprintf("%q is not a table", e) } func (e ErrNoTable) Error() string { return fmt.Sprintf("%q is not a table", e.Key) }
// ErrNoValue indicates that Values does not contain a key with a value // ErrNoValue indicates that Values does not contain a key with a value
type ErrNoValue string type ErrNoValue struct {
Key string
}
func (e ErrNoValue) Error() string { return fmt.Sprintf("%q is not a value", e) } func (e ErrNoValue) Error() string { return fmt.Sprintf("%q is not a value", e.Key) }

@ -1,5 +1,3 @@
package chartutil
/* /*
Copyright The Helm Authors. Copyright The Helm Authors.
@ -16,28 +14,24 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package chartutil
import ( import (
"testing" "testing"
) )
func TestErrorNoTableDoesntPanic(t *testing.T) { func TestErrorNoTableDoesntPanic(t *testing.T) {
defer recover()
x := "empty" x := "empty"
y := ErrNoTable(x) y := ErrNoTable{x}
t.Logf("error is: %s", y) t.Logf("error is: %s", y)
} }
func TestErrorNoValueDoesntPanic(t *testing.T) { func TestErrorNoValueDoesntPanic(t *testing.T) {
defer recover()
x := "empty" x := "empty"
y := ErrNoValue(x) y := ErrNoValue{x}
t.Logf("error is: %s", y) t.Logf("error is: %s", y)
} }

@ -88,7 +88,7 @@ func (v Values) Encode(w io.Writer) error {
func tableLookup(v Values, simple string) (Values, error) { func tableLookup(v Values, simple string) (Values, error) {
v2, ok := v[simple] v2, ok := v[simple]
if !ok { if !ok {
return v, ErrNoTable(simple) return v, ErrNoTable{simple}
} }
if vv, ok := v2.(map[string]interface{}); ok { if vv, ok := v2.(map[string]interface{}); ok {
return vv, nil return vv, nil
@ -101,7 +101,7 @@ func tableLookup(v Values, simple string) (Values, error) {
return vv, nil return vv, nil
} }
return Values{}, ErrNoTable(simple) return Values{}, ErrNoTable{simple}
} }
// ReadValues will parse YAML byte data into a Values. // ReadValues will parse YAML byte data into a Values.
@ -193,20 +193,20 @@ func (v Values) pathValue(path []string) (interface{}, error) {
if _, ok := v[path[0]]; ok && !istable(v[path[0]]) { if _, ok := v[path[0]]; ok && !istable(v[path[0]]) {
return v[path[0]], nil return v[path[0]], nil
} }
return nil, ErrNoValue(path[0]) return nil, ErrNoValue{path[0]}
} }
key, path := path[len(path)-1], path[:len(path)-1] key, path := path[len(path)-1], path[:len(path)-1]
// get our table for table path // get our table for table path
t, err := v.Table(joinPath(path...)) t, err := v.Table(joinPath(path...))
if err != nil { if err != nil {
return nil, ErrNoValue(key) return nil, ErrNoValue{key}
} }
// check table for key and ensure value is not a table // check table for key and ensure value is not a table
if k, ok := t[key]; ok && !istable(k) { if k, ok := t[key]; ok && !istable(k) {
return k, nil return k, nil
} }
return nil, ErrNoValue(key) return nil, ErrNoValue{key}
} }
func parsePath(key string) []string { return strings.Split(key, ".") } func parsePath(key string) []string { return strings.Split(key, ".") }

Loading…
Cancel
Save