[HarfBuzz] language-code issues

Jonathan Kew jonathan at jfkew.plus.com
Wed Apr 28 17:13:51 PDT 2010


I've run across a couple of things that seem wrong in the language code support (harfbuzz-ng).

(1) hb_language_from_string() fails to increment num_langs when it allocates a new language code, so it never actually remembers what it has allocated!

diff --git a/gfx/harfbuzz/src/hb-language.c b/gfx/harfbuzz/src/hb-language.c
--- a/gfx/harfbuzz/src/hb-language.c
+++ b/gfx/harfbuzz/src/hb-language.c
@@ -96,16 +96,17 @@ hb_language_from_string (const char *str
       return NULL;
     num_alloced = new_alloced;
     langs = new_langs;
   }
 
   langs[i] = strdup (str);
   for (p = (unsigned char *) langs[i]; *p; p++)
     *p = canon_map[*p];
+  ++num_langs;
 
   return (hb_language_t) langs[i];
 }
 
 const char *
 hb_language_to_string (hb_language_t language)
 {
   return (const char *) language;


(2) In hb_ot_tag_to_language(), I'm wondering whether the temporary string that is created is guaranteed to be correctly null-terminated? I'm a bit hazy on the precise array initialization rules, so I added an explicit zero to be safe:

diff --git a/gfx/harfbuzz/src/hb-ot-tag.c b/gfx/harfbuzz/src/hb-ot-tag.c
--- a/gfx/harfbuzz/src/hb-ot-tag.c
+++ b/gfx/harfbuzz/src/hb-ot-tag.c
@@ -653,10 +653,11 @@ hb_ot_tag_to_language (hb_tag_t tag)
   for (i = 0; i < ARRAY_LENGTH (ot_languages); i++)
     if (ot_languages[i].tag == tag)
       return hb_language_from_string (ot_languages[i].language);
 
   buf[3] = tag >> 24;
   buf[4] = (tag >> 16) & 0xFF;
   buf[5] = (tag >> 8) & 0xFF;
   buf[6] = tag & 0xFF;
+  buf[7] = 0;
   return hb_language_from_string ((char *) buf);
 }


More seriously, I'm confused by the "ot:TAG" string that potentially gets constructed here and passed to hb_language_from_string. It looks to me as though the use of canon_map there will in effect map the ":" to a null byte, and so the string will be treated as if it were simply "ot". This seems broken, AFAICS.





More information about the HarfBuzz mailing list