From d975066f96a5f9caf8af8d513076480a33943257 Mon Sep 17 00:00:00 2001 From: Skye Gill Date: Thu, 10 Nov 2022 10:22:01 +0000 Subject: [PATCH] fix: nil pointer dereference (#216) Signed-off-by: Skye Gill Signed-off-by: Skye Gill --- webhooks/pod_webhook.go | 13 +++++++++---- webhooks/pod_webhook_test.go | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/webhooks/pod_webhook.go b/webhooks/pod_webhook.go index 5cb7f5e99..97ebab20b 100644 --- a/webhooks/pod_webhook.go +++ b/webhooks/pod_webhook.go @@ -45,6 +45,12 @@ type PodMutator struct { // Handle injects the flagd sidecar (if the prerequisites are all met) func (m *PodMutator) Handle(ctx context.Context, req admission.Request) admission.Response { + defer func() { + if err := recover(); err != nil { + admission.Errored(http.StatusInternalServerError, fmt.Errorf("%v", err)) + } + }() + pod := &corev1.Pod{} err := m.decoder.Decode(req, pod) if err != nil { @@ -249,12 +255,11 @@ func (m *PodMutator) injectSidecar(pod *corev1.Pod, configMap string, featureFla FlagDTag = os.Getenv("FLAGD_VERSION") } - if featureFlag.Spec.FlagDSpec.MetricsPort != 0 { - flagdMetricsPort = featureFlag.Spec.FlagDSpec.MetricsPort - } - var envs []corev1.EnvVar if featureFlag.Spec.FlagDSpec != nil { + if featureFlag.Spec.FlagDSpec.MetricsPort != 0 { + flagdMetricsPort = featureFlag.Spec.FlagDSpec.MetricsPort + } envs = featureFlag.Spec.FlagDSpec.Envs } diff --git a/webhooks/pod_webhook_test.go b/webhooks/pod_webhook_test.go index 9a8743478..cbe6a8be8 100644 --- a/webhooks/pod_webhook_test.go +++ b/webhooks/pod_webhook_test.go @@ -236,4 +236,23 @@ var _ = Describe("pod mutation webhook", func() { err = k8sClient.Update(testCtx, ffConfig) Expect(err).ShouldNot(HaveOccurred()) }) + + It("should not panic if flagDSpec isn't provided", func() { + ffConfigName := "feature-flag-configuration-panic-test" + ffConfig := &corev1alpha1.FeatureFlagConfiguration{} + ffConfig.Namespace = mutatePodNamespace + ffConfig.Name = ffConfigName + ffConfig.Spec.FeatureFlagSpec = featureFlagSpec + err := k8sClient.Create(testCtx, ffConfig) + Expect(err).ShouldNot(HaveOccurred()) + + pod := testPod() + pod.Annotations["openfeature.dev/featureflagconfiguration"] = ffConfigName + err = k8sClient.Create(testCtx, pod) + Expect(err).ShouldNot(HaveOccurred()) + + podMutationWebhookCleanup() + err = k8sClient.Delete(testCtx, ffConfig, client.GracePeriodSeconds(0)) + Expect(err).ShouldNot(HaveOccurred()) + }) })