[LyX features/biginset] Prevent iconv exception in previews (#13042)

Juergen Spitzmueller spitz at lyx.org
Fri Apr 5 13:41:43 UTC 2024


commit b3fe9cb7049daaacbcf357ba5e4ece479f7b1be4
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Sat Mar 16 04:52:51 2024 +0100

    Prevent iconv exception in previews (#13042)
    
    The preview loader assumes all content is in the main document encoding.
    
    As soon as content was not encodable, LyX crashed. We now check for that
    and if non-encodable glyphs are found, we do not produce a preview snippet
    and warn.
    
    Ideally, the preview loader should be made aware of encoding changes, or
    we should generally use utf8 for previews.
---
 src/graphics/PreviewLoader.cpp | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/graphics/PreviewLoader.cpp b/src/graphics/PreviewLoader.cpp
index a350a4939b..dc944b1929 100644
--- a/src/graphics/PreviewLoader.cpp
+++ b/src/graphics/PreviewLoader.cpp
@@ -849,11 +849,30 @@ void PreviewLoader::Impl::dumpData(odocstream & os,
 	BitmapFile::const_iterator it  = vec.begin();
 	BitmapFile::const_iterator end = vec.end();
 
+	Encoding const & enc = buffer_.params().encoding();
+
 	for (; it != end; ++it) {
+		docstring res;
+		bool uncodable_content = false;
+		// check whether the content is encodable
+		// FIXME: the preview loader should be able
+		//        to handle multiple encodings
+		//        or we should generally use utf8
+		for (char_type n : from_utf8(it->first)) {
+			if (!enc.encodable(n)) {
+				LYXERR0("Uncodable character '"
+					<< docstring(1, n)
+					<< "' in preview snippet!");
+				uncodable_content = true;
+			} else
+				res += n;
+		}
 		// FIXME UNICODE
-		os << "\\begin{preview}\n"
-		   << from_utf8(it->first)
-		   << "\n\\end{preview}\n\n";
+		os << "\\begin{preview}\n";
+		// do not show incomplete preview
+		if (!uncodable_content)
+			os << res;
+		os << "\n\\end{preview}\n\n";
 	}
 }
 


More information about the lyx-cvs mailing list