From d7b2eee08f3994ed135af499ac6bb11015bf6d64 Mon Sep 17 00:00:00 2001 From: lif <1835304752@qq.com> Date: Tue, 30 Dec 2025 16:51:45 +0800 Subject: [PATCH] fix: add nil checks before mergo.Merge to prevent panic in gallery model installation (#7785) Fixes #7420 Added nil checks before calling mergo.Merge in InstallModelFromGallery and InstallModel functions to prevent panic when req.Overrides or configOverrides are nil. The panic was occurring at models.go:248 during Qwen-Image-Edit gallery model download. Changes: - Added nil check for req.Overrides before merging in InstallModelFromGallery (line 126) - Added nil check for configOverrides before merging in InstallModel (line 248) - Added test case to verify nil configOverrides are handled without panic Signed-off-by: majiayu000 <1835304752@qq.com> --- core/gallery/models.go | 12 ++++++++---- core/gallery/models_test.go | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/core/gallery/models.go b/core/gallery/models.go index 41a6e5b25..133d0d0e6 100644 --- a/core/gallery/models.go +++ b/core/gallery/models.go @@ -123,8 +123,10 @@ func InstallModelFromGallery( config.Files = append(config.Files, model.AdditionalFiles...) // TODO model.Overrides could be merged with user overrides (not defined yet) - if err := mergo.Merge(&model.Overrides, req.Overrides, mergo.WithOverride); err != nil { - return err + if req.Overrides != nil { + if err := mergo.Merge(&model.Overrides, req.Overrides, mergo.WithOverride); err != nil { + return err + } } installedModel, err := InstallModel(ctx, systemState, installName, &config, model.Overrides, downloadStatus, enforceScan) @@ -245,8 +247,10 @@ func InstallModel(ctx context.Context, systemState *system.SystemState, nameOver configMap["name"] = name - if err := mergo.Merge(&configMap, configOverrides, mergo.WithOverride); err != nil { - return nil, err + if configOverrides != nil { + if err := mergo.Merge(&configMap, configOverrides, mergo.WithOverride); err != nil { + return nil, err + } } // Write updated config file diff --git a/core/gallery/models_test.go b/core/gallery/models_test.go index 39b8a8427..c67243599 100644 --- a/core/gallery/models_test.go +++ b/core/gallery/models_test.go @@ -184,6 +184,26 @@ var _ = Describe("Model test", func() { Expect(err).To(HaveOccurred()) }) + It("handles nil configOverrides without panic", func() { + tempdir, err := os.MkdirTemp("", "test") + Expect(err).ToNot(HaveOccurred()) + defer os.RemoveAll(tempdir) + c, err := ReadConfigFile[ModelConfig](filepath.Join(os.Getenv("FIXTURES"), "gallery_simple.yaml")) + Expect(err).ToNot(HaveOccurred()) + + systemState, err := system.GetSystemState( + system.WithModelPath(tempdir), + ) + Expect(err).ToNot(HaveOccurred()) + _, err = InstallModel(context.TODO(), systemState, "test-model", c, nil, func(string, string, string, float64) {}, true) + Expect(err).ToNot(HaveOccurred()) + + for _, f := range []string{"cerebras", "cerebras-completion.tmpl", "cerebras-chat.tmpl", "test-model.yaml"} { + _, err = os.Stat(filepath.Join(tempdir, f)) + Expect(err).ToNot(HaveOccurred()) + } + }) + It("does not delete shared model files when one config is deleted", func() { tempdir, err := os.MkdirTemp("", "test") Expect(err).ToNot(HaveOccurred())