[Fontconfig] Re: Finding font filename

Mike FABIAN mfabian at suse.de
Sat Dec 24 01:30:45 PST 2005

Patrick Lam <plam at MIT.EDU> さんは書きました:

> On Fri, 23 Dec 2005, Mike FABIAN wrote:
>> Was that an intentional change or is this a bug?
> That would be a bug.  I'll try to take a look at it, but it might take
> a while.
> There aren't duplicate fonts by any chance?

No, it seems to happen with any font I try. I certainly have
only one copy of CODE2000.TTF for example:

mfabian at magellan:~$ fc-match -v 'code2000'-16  | grep file
	file: "CODE2000.TTF"(s)
mfabian at magellan:~$ fc-list code2000 file 
mfabian at magellan:~$

By the way, what is the reason for the "__DUMMY__" in

    /* Please do not revoke any of these bindings. */
    static const FcObjectType _FcBaseObjectTypes[] = {
        { "__DUMMY__",      FcTypeVoid, },
        { FC_FAMILY,	FcTypeString, },

in fcname.c?

I'm trying to find the reason for a crash in fontconfig triggered
by rxvt-unicode. I couldn't yet understand it but I have the suspicion
that it is related to the introduction of "__DUMMY__". I found
that this "__DUMMY__" is inserted into the pattern by fontconfig
when the pattern is expanded:

(gdb) p FcNameUnparse(new)
$11 = (
    FcChar8 *) 0x69a080 "Courier:maxglyphmemory=1048576:\\_\\_DUMMY\\_\\_=1048576:style=Regular:slant=0:weight=80:width=100:pixelsize=13:spacing=100:foundry=ibm:antialias=True:hintstyle=3:hinting=True:verticallayout=False:autohint=False:globaladvance=True:index=0:outline=True:scalable=True:dpi=112.059:rgba=5:scale=1:minspace=True:charset=  |>^1!|>^1!P0oWQ |>]![|>^1!|>^1!!!!%#|75TI|>[LD|>V<gOq6Yc!!K?&  !%J<G!!!)$      9;*f! !!!.%    !C3c.!(CUL!!!#& !!#0GML3F5B^T5s!!!!5tUGTV    !!#3H !!!!nMW<gJ !%A5F!%J<G  !!#6Ih~y(E(1+k7!!!%#!!!!Z    !!#AL(P9Wa(2oHj|>T)!!!#0F !!!!#  !!#DM  !!!!(!!!LG    !!+fv       !!!%(!!+u{!!!!F       :lang=aa|ast|ay|bi|br|ca|ch|cs|da|et|eu|fj|fo|fur|fy|gd|gl|gv|ho|hu|ia|id|ie|io|is|kl|lb|mg|mt|nb|nds|nn|no|oc|om|pl|rm|sk|sma|smj|so|sq|sv|sw|tn|tr|ts|vo|wa|wen|wo|xh|yap|zu:fontversion=0:fontformat=Type 1:embolden=False:embeddedbitmap=False"

This looks a bit weird already and I found that I could easily
trigger a crash like by inserting __DUMMY__ into the pattern from
the start:

mfabian at magellan:~$ fc-match "foo:\\_\\_DUMMY\\_\\_=1"
Segmentation fault (core dumped)
mfabian at magellan:~$

I tentatively "fixed" this crash triggered by "fc-match" with
the following patch:

diff -ru fontconfig- fontconfig-
--- fontconfig-	2005-12-21 16:47:42.000000000 +0100
+++ fontconfig-	2005-12-23 17:55:04.000000000 +0100
@@ -703,7 +703,7 @@
 		for (;;)
 		    name = FcNameFindNext (name, ":,", save, &delim);
-		    if (t)
+		    if (t && strcmp(t->object, "__DUMMY__"))
 			v = FcNameConvert (t->type, save, &m);
 			if (!FcPatternAdd (pat, t->object, v, FcTrue))

but this didn't help for rxvt-unicode.

When debugging rxvt-unicode, I found that shortly before crash the function

    const char *
    FcObjectPtrU (FcObjectPtr si)
        const FcObjectTypeList  *l;
        int i, j;

        if (si > 0)
            if (si < biggest_known_ntypes)
                return biggest_known_types[si].object;

            j = 0;
            for (l = _FcObjectTypes; l; l = l->next)
                for (i = 0; i < l->ntypes; i++, j++)
                    if (j == si)
                        return l->types[i].object;

        return _FcUserObjectNames[-si].object;

is called with si=45, then nothing can be found in
the for loops within "if (si > 0)" and finally 

        return _FcUserObjectNames[-si].object;

is reached. An array index of -45 looks weird and it is not surprising
that junk is returned and fontconfig crashes soon later.

Maybe si=45 is already bigger than it should ever get?

Could this be related to introducing the extra object __DUMMY__?

Mike FABIAN   <mfabian at suse.de>   http://www.suse.de/~mfabian

More information about the Fontconfig mailing list