From a9ceb6db7a8532f2aa8990e33a9228859f1d4902 Mon Sep 17 00:00:00 2001 From: Liang Chang Date: Sat, 22 May 2021 00:10:48 +0800 Subject: [PATCH] DtHelp: Apply graceful degradation for font loading to avoid a segmentation fault. --- cde/include/DtI/FontI.h | 1 + cde/lib/DtHelp/Font.c | 25 +++++++++++++++++++++++++ cde/lib/DtHelp/XInterface.c | 11 +++++++++-- cde/lib/DtHelp/libDtHelp.elist | 1 + 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/cde/include/DtI/FontI.h b/cde/include/DtI/FontI.h index e1477f1ee..e635baa63 100644 --- a/cde/include/DtI/FontI.h +++ b/cde/include/DtI/FontI.h @@ -78,6 +78,7 @@ extern "C" { * Semi Public Routines ****************************************************************************/ extern void _DtHelpCopyDefaultList(XrmName *xrm_list); +extern void _DtHelpCopyCasualList(XrmName *xrm_list); extern long __DtHelpDefaultFontIndexGet ( DtHelpDispAreaStruct *pDAS); extern void _DtHelpGetStringQuarks(XrmName *xrm_list); diff --git a/cde/lib/DtHelp/Font.c b/cde/lib/DtHelp/Font.c index 78bbfd978..eafeb8cd3 100644 --- a/cde/lib/DtHelp/Font.c +++ b/cde/lib/DtHelp/Font.c @@ -266,6 +266,7 @@ static const char *FontResources[] = static Boolean QuarksInited = FALSE; static XrmQuark StringFontQuark = 0; static XrmName DefaultFontQuarks[_DtHelpFontQuarkNumber]; +static XrmName CasualFontQuarks[_DtHelpFontQuarkNumber]; static XrmBinding FontBindings[_DtHelpFontQuarkNumber] = { XrmBindLoosely, XrmBindLoosely, XrmBindLoosely, XrmBindLoosely, XrmBindLoosely, XrmBindLoosely, XrmBindLoosely }; @@ -673,6 +674,25 @@ _DtHelpCopyDefaultList ( xrm_list[n] = DefaultFontQuarks[n]; } +/****************************************************************************** + * Function: void _DtHelpCopyCasualList (xrm_name) + * + * Parameters: xrm_name The quark list to fill out. + * + * Return Value: void + * + * Purpose: + *****************************************************************************/ +void +_DtHelpCopyCasualList ( + XrmName *xrm_list) +{ + int n; + + for (n = 0; n < _DT_HELP_FONT_END + 1; n++) + xrm_list[n] = CasualFontQuarks[n]; +} + /****************************************************************************** * Function: void _DtHelpGetStringQuarks (xrm_name) * @@ -744,6 +764,11 @@ __DtHelpFontDatabaseInit ( DefaultFontQuarks[_DT_HELP_FONT_CHAR_SET] = XrmStringToQuark ("ISO-8859-1"); DefaultFontQuarks[_DT_HELP_FONT_END] = 0; + + for (n = 0; n < _DT_HELP_FONT_END; ++n) + CasualFontQuarks[n] = XrmStringToQuark("*"); + CasualFontQuarks[_DT_HELP_FONT_END] = 0; + QuarksInited = True; } _DtHelpProcessUnlock(); diff --git a/cde/lib/DtHelp/XInterface.c b/cde/lib/DtHelp/XInterface.c index 4f8346c27..20f9e6335 100644 --- a/cde/lib/DtHelp/XInterface.c +++ b/cde/lib/DtHelp/XInterface.c @@ -849,10 +849,17 @@ ResolveFont ( if (charset != NULL) xrmList[_DT_HELP_FONT_CHAR_SET] = XrmStringToQuark(charset); - if (NULL == xlfdSpec || - _DtHelpGetExactFontIndex(pDAS,lang,charset,xlfdSpec,ret_idx)!=0) + if (NULL != xlfdSpec) + result = _DtHelpGetExactFontIndex(pDAS,lang,charset,xlfdSpec,ret_idx); + + if (result) result = __DtHelpFontIndexGet (pDAS, xrmList, ret_idx); + if (result) { + _DtHelpCopyCasualList(xrmList); + result = __DtHelpFontIndexGet(pDAS, xrmList, ret_idx); + } + return result; } diff --git a/cde/lib/DtHelp/libDtHelp.elist b/cde/lib/DtHelp/libDtHelp.elist index 05e6621d0..c1cc930df 100644 --- a/cde/lib/DtHelp/libDtHelp.elist +++ b/cde/lib/DtHelp/libDtHelp.elist @@ -353,6 +353,7 @@ internal _DtHelpCloseVolume internal _DtHelpCommonHelpClean internal _DtHelpCommonHelpInit internal _DtHelpCopyDefaultList +internal _DtHelpCopyCasualList internal _DtHelpDABuildSelection internal _DtHelpDADestroyGraphic internal _DtHelpDADestroyRegion