From 9c651af32d2edf96dd484a11434220a3890f0137 Mon Sep 17 00:00:00 2001 From: Florian Schade Date: Wed, 31 Dec 2025 12:04:02 +0100 Subject: [PATCH] fix(thumbnailer): missing font panic --- services/thumbnails/pkg/preprocessor/preprocessor.go | 6 +++++- .../thumbnails/pkg/preprocessor/preprocessor_test.go | 11 +++++++++++ services/thumbnails/pkg/service/grpc/v0/service.go | 11 ++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/services/thumbnails/pkg/preprocessor/preprocessor.go b/services/thumbnails/pkg/preprocessor/preprocessor.go index 81c6bee6ae..694e386981 100644 --- a/services/thumbnails/pkg/preprocessor/preprocessor.go +++ b/services/thumbnails/pkg/preprocessor/preprocessor.go @@ -143,7 +143,11 @@ Scan: // Label for the scanner loop, so we can break it easily textResult.MergeCommon(DefaultMergeMap) for _, sRange := range textResult.ScriptRanges { - targetFontFace, _ := t.fontLoader.LoadFaceForScript(sRange.TargetScript) + targetFontFace, err := t.fontLoader.LoadFaceForScript(sRange.TargetScript) + if err != nil { + return nil, err + } + // if the target script is "_unknown" it's expected that the loaded face // uses the default font faceHeight := targetFontFace.Face.Metrics().Height diff --git a/services/thumbnails/pkg/preprocessor/preprocessor_test.go b/services/thumbnails/pkg/preprocessor/preprocessor_test.go index 531fe6a51e..a76a0512c0 100644 --- a/services/thumbnails/pkg/preprocessor/preprocessor_test.go +++ b/services/thumbnails/pkg/preprocessor/preprocessor_test.go @@ -149,6 +149,17 @@ var _ = Describe("ImageDecoder", func() { Expect(err).ToNot(HaveOccurred()) Expect(img).ToNot(BeNil()) }) + + It("fails if the font is missing", func() { + decoder.fontLoader.fontMapData = &FontMapData{ + FMap: &FontMap{ + DefaultFont: "/some/unknown/font.otf", + }, + } + img, err := decoder.Convert(bytes.NewReader([]byte("This is a test text"))) + Expect(err).To(HaveOccurred()) + Expect(img).To(BeNil()) + }) }) Describe("test ForType", func() { diff --git a/services/thumbnails/pkg/service/grpc/v0/service.go b/services/thumbnails/pkg/service/grpc/v0/service.go index 92e93e6f9a..45cd960372 100644 --- a/services/thumbnails/pkg/service/grpc/v0/service.go +++ b/services/thumbnails/pkg/service/grpc/v0/service.go @@ -12,13 +12,14 @@ import ( rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/golang-jwt/jwt/v5" + "github.com/pkg/errors" + merrors "go-micro.dev/v4/errors" + "google.golang.org/grpc/metadata" + revactx "github.com/opencloud-eu/reva/v2/pkg/ctx" "github.com/opencloud-eu/reva/v2/pkg/rgrpc/todo/pool" "github.com/opencloud-eu/reva/v2/pkg/storagespace" "github.com/opencloud-eu/reva/v2/pkg/utils" - "github.com/pkg/errors" - merrors "go-micro.dev/v4/errors" - "google.golang.org/grpc/metadata" "github.com/opencloud-eu/opencloud/pkg/log" thumbnailssvc "github.com/opencloud-eu/opencloud/protogen/gen/opencloud/services/thumbnails/v0" @@ -169,6 +170,10 @@ func (g Thumbnail) handleCS3Source(ctx context.Context, req *thumbnailssvc.GetTh } pp := preprocessor.ForType(sRes.GetInfo().GetMimeType(), ppOpts) img, err := pp.Convert(r) + if err != nil { + g.logger.Error().Err(err).Msg("failed to convert image") + } + if img == nil || err != nil { return "", merrors.NotFound(g.serviceID, "could not get image") }