From 76a5eaaad901de3b11b9650ae5c3949bb5fdfad9 Mon Sep 17 00:00:00 2001 From: zerosaturation Date: Wed, 8 Apr 2026 00:01:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A7=A3=E5=8E=8B?= =?UTF-8?q?=E7=82=B8=E5=BC=B9=E6=BC=8F=E6=B4=9E=E5=92=8Cgoroutine=E6=B3=84?= =?UTF-8?q?=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- .../assetService/service/minimax_service.go | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/backend/services/assetService/service/minimax_service.go b/backend/services/assetService/service/minimax_service.go index 6906827..2daf5a0 100644 --- a/backend/services/assetService/service/minimax_service.go +++ b/backend/services/assetService/service/minimax_service.go @@ -62,6 +62,7 @@ type minimaxService struct { jobs map[string]*ImageGenerationJob jobsLock sync.RWMutex client *http.Client + stopCh chan struct{} } // NewMinimaxService 创建 MiniMax 服务 @@ -70,6 +71,7 @@ func NewMinimaxService(cfg *config.AssetConfig) MinimaxService { config: cfg, jobs: make(map[string]*ImageGenerationJob), client: &http.Client{Timeout: 120 * time.Second}, + stopCh: make(chan struct{}), } go svc.cleanupExpiredJobs() return svc @@ -246,10 +248,21 @@ func (s *minimaxService) compressImageIfNeeded(imageURL string) (string, error) return "", err } - img, format, err := image.Decode(bytes.NewReader(imgData)) + // First decode config to check dimensions (prevents decompression bomb) + cfg, format, err := image.DecodeConfig(bytes.NewReader(imgData)) if err != nil { return "", err } + // Limit decoded image to reasonable size (e.g., 4096x4096 = 64M pixels) + if int64(cfg.Width)*int64(cfg.Height) > 4096*4096 { + return "", fmt.Errorf("image too large: %dx%d", cfg.Width, cfg.Height) + } + // Full decode (already limited by size) + img, _, err := image.Decode(bytes.NewReader(imgData)) + if err != nil { + return "", err + } + _ = format // suppress unused warning bounds := img.Bounds() maxDim := uint(1024) @@ -332,17 +345,28 @@ func validateURL(rawURL string) error { // cleanupExpiredJobs 清理过期任务 func (s *minimaxService) cleanupExpiredJobs() { ticker := time.NewTicker(1 * time.Hour) - for range ticker.C { - s.jobsLock.Lock() - now := time.Now().UnixMilli() - expiredThreshold := int64(24 * 60 * 60 * 1000) // 24h - for jobID, job := range s.jobs { - if job.Status == StatusCompleted || job.Status == StatusFailed { - if now-job.UpdatedAt > expiredThreshold { - delete(s.jobs, jobID) + defer ticker.Stop() + for { + select { + case <-s.stopCh: + return + case <-ticker.C: + s.jobsLock.Lock() + now := time.Now().UnixMilli() + expiredThreshold := int64(24 * 60 * 60 * 1000) // 24h + for jobID, job := range s.jobs { + if job.Status == StatusCompleted || job.Status == StatusFailed { + if now-job.UpdatedAt > expiredThreshold { + delete(s.jobs, jobID) + } } } + s.jobsLock.Unlock() } - s.jobsLock.Unlock() } +} + +// Close 关闭服务 +func (s *minimaxService) Close() { + close(s.stopCh) } \ No newline at end of file