From b0efb696f05c4b03610eb35f99e420524c629849 Mon Sep 17 00:00:00 2001 From: John Whitington Date: Wed, 8 May 2024 10:48:10 +0800 Subject: [PATCH] harded against attempts to build empty truetype fonts --- cpdfaddtext.ml | 1 + cpdfembed.ml | 7 ++++--- cpdftruetype.ml | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cpdfaddtext.ml b/cpdfaddtext.ml index d0fdf38..41816eb 100644 --- a/cpdfaddtext.ml +++ b/cpdfaddtext.ml @@ -437,6 +437,7 @@ let iter (iter (fun x -> Hashtbl.replace used x ())) codepoints) pages (map (fun x -> List.nth ps (x - 1)) pages); + if Hashtbl.length used = 0 then pdf else (* Avoid trying to build truetype font with no used set. *) let realfontname = ref fontname in let font, fontpack = match cpdffont with diff --git a/cpdfembed.ml b/cpdfembed.ml index c9a2d44..8cddbbb 100644 --- a/cpdfembed.ml +++ b/cpdfembed.ml @@ -89,9 +89,10 @@ let make_fontpack_hashtable fs = table let embed_truetype pdf ~fontfile ~fontname ~codepoints ~encoding = - let fs = Cpdftruetype.parse ~subset:codepoints fontfile encoding in - let subsets_and_their_fonts = map (make_single_font ~fontname ~encoding pdf) fs in - (map snd subsets_and_their_fonts, make_fontpack_hashtable subsets_and_their_fonts) + if codepoints = [] then ([], null_hash ()) else (* Can't call Cpdftruetype.parse with empty codepoint set. *) + let fs = Cpdftruetype.parse ~subset:codepoints fontfile encoding in + let subsets_and_their_fonts = map (make_single_font ~fontname ~encoding pdf) fs in + (map snd subsets_and_their_fonts, make_fontpack_hashtable subsets_and_their_fonts) let rec collate_runs cfn a = function | [] -> rev (map rev a) diff --git a/cpdftruetype.ml b/cpdftruetype.ml index 7b42a78..4781524 100644 --- a/cpdftruetype.ml +++ b/cpdftruetype.ml @@ -605,6 +605,7 @@ let parse ~subset data encoding = let subset_1, subsets_2 = find_main encoding subset in let flags_1 = calculate_flags false italicangle in let flags_2 = calculate_flags true italicangle in + if subset_1 = [] then raise (Pdf.PDFError "Cpdftruetype: Refusing to create font with no characters") else let firstchar_1, lastchar_1 = extremes (sort compare subset_1) in let firstchars_2, lastchars_2 = split (map (fun subset -> (33, length subset + 33 - 1)) subsets_2) in let numOfLongHorMetrics =