From a4f5cad03c6508c5e12309c820720729948005a0 Mon Sep 17 00:00:00 2001 From: Fmat34 Date: Mon, 4 May 2026 21:21:18 +0200 Subject: [PATCH] fix: serialize MuPDF metadata reads (fz_context not thread-safe) --- internal/pdf/service.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/internal/pdf/service.go b/internal/pdf/service.go index 2b9f4f4..3293f58 100644 --- a/internal/pdf/service.go +++ b/internal/pdf/service.go @@ -228,9 +228,11 @@ type PageDimensions struct { } // GetPageDimensions returns the width and height of a page in PDF points. +// Holds an exclusive lock because MuPDF's fz_context is not safe for concurrent +// access — see also GetMetadata. func (s *PDFService) GetPageDimensions(pageNum int) (*PageDimensions, error) { - s.mu.RLock() - defer s.mu.RUnlock() + s.mu.Lock() + defer s.mu.Unlock() if s.doc == nil { return nil, fmt.Errorf("no PDF document is open") @@ -252,9 +254,11 @@ func (s *PDFService) GetPageDimensions(pageNum int) (*PageDimensions, error) { } // GetMetadata returns title, author, and other metadata for the open PDF. +// Holds an exclusive lock because MuPDF's fz_context is not safe for concurrent +// access; concurrent fitz.Document.Metadata() calls corrupt internal state. func (s *PDFService) GetMetadata() (*PDFMetadata, error) { - s.mu.RLock() - defer s.mu.RUnlock() + s.mu.Lock() + defer s.mu.Unlock() if s.doc == nil { return nil, fmt.Errorf("no PDF document is open")