From d2074fcdb84bd1aef3d7919bfa67da75daa3c0fe Mon Sep 17 00:00:00 2001 From: Brendan Chang Date: Mon, 21 Oct 2019 18:54:28 -0400 Subject: [PATCH] Add fuzz targets for Duration, MicroTime, and Time --- test/fuzz/yaml/BUILD | 1 + test/fuzz/yaml/yaml.go | 60 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/test/fuzz/yaml/BUILD b/test/fuzz/yaml/BUILD index 3e47be63dd7..2e151687dd7 100644 --- a/test/fuzz/yaml/BUILD +++ b/test/fuzz/yaml/BUILD @@ -6,6 +6,7 @@ go_library( importpath = "k8s.io/kubernetes/test/fuzz/yaml", visibility = ["//visibility:private"], deps = [ + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/gopkg.in/yaml.v2:go_default_library", "//vendor/sigs.k8s.io/yaml:go_default_library", ], diff --git a/test/fuzz/yaml/yaml.go b/test/fuzz/yaml/yaml.go index 634e120655a..8661286c687 100644 --- a/test/fuzz/yaml/yaml.go +++ b/test/fuzz/yaml/yaml.go @@ -20,10 +20,51 @@ limitations under the License. package yaml import ( + "bytes" + "gopkg.in/yaml.v2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" sigyaml "sigs.k8s.io/yaml" ) +// FuzzDuration is a fuzz target for unmarshaling Duration defined in "k8s.io/apimachinery/pkg/apis/meta/v1". +// This target also checks that the unmarshaled result can be marshaled back to the input. +func FuzzDuration(b []byte) int { + var unmarshalResult struct { + D metav1.Duration `json:"d"` + } + if err := yaml.Unmarshal(b, &unmarshalResult); err != nil { + return 0 + } + marshalResult, err := yaml.Marshal(&unmarshalResult) + if err != nil { + panic(err) + } + if !bytes.Equal(marshalResult, b) { + panic("marshalResult != input") + } + return 1 +} + +// FuzzMicroTime is a fuzz target for unmarshaling MicroTime defined in "k8s.io/apimachinery/pkg/apis/meta/v1". +// This target also checks that the unmarshaled result can be marshaled back to the input. +func FuzzMicroTime(b []byte) int { + var unmarshalResult struct { + T metav1.MicroTime `json:"t"` + } + if err := yaml.Unmarshal(b, &unmarshalResult); err != nil { + return 0 + } + marshalResult, err := yaml.Marshal(&unmarshalResult) + if err != nil { + panic(err) + } + if !bytes.Equal(marshalResult, b) { + panic("marshalResult != input") + } + return 1 +} + // FuzzSigYaml is a fuzz target for "sigs.k8s.io/yaml" unmarshaling. func FuzzSigYaml(b []byte) int { t := struct{}{} @@ -38,6 +79,25 @@ func FuzzSigYaml(b []byte) int { return out } +// FuzzTime is a fuzz target for unmarshaling Time defined in "k8s.io/apimachinery/pkg/apis/meta/v1". +// This target also checks that the unmarshaled result can be marshaled back to the input. +func FuzzTime(b []byte) int { + var unmarshalResult struct { + T metav1.Time `json:"t"` + } + if err := yaml.Unmarshal(b, &unmarshalResult); err != nil { + return 0 + } + marshalResult, err := yaml.Marshal(&unmarshalResult) + if err != nil { + panic(err) + } + if !bytes.Equal(marshalResult, b) { + panic("marshalResult != input") + } + return 1 +} + // FuzzYamlV2 is a fuzz target for "gopkg.in/yaml.v2" unmarshaling. func FuzzYamlV2(b []byte) int { t := struct{}{}