Fix another giant batch of resource leaks. (Mostly memory, but there's
[u/mdw/putty] / unix / gtkfont.c
index 0f2dc58..d241db0 100644 (file)
  *    I haven't the energy.
  */
 
+#if !GLIB_CHECK_VERSION(1,3,7)
+#define g_ascii_strcasecmp g_strcasecmp
+#define g_ascii_strncasecmp g_strncasecmp
+#endif
+
 /*
  * Ad-hoc vtable mechanism to allow font structures to be
  * polymorphic.
@@ -186,8 +191,10 @@ static char *x11_guess_derived_font_name(XFontStruct *xfs, int bold, int wide)
                p++;
            }
 
-           if (nstr < lenof(strings))
+           if (nstr < lenof(strings)) {
+                sfree(dupname);
                return NULL;           /* XLFD was malformed */
+            }
 
            if (bold)
                strings[2] = "bold";
@@ -425,7 +432,7 @@ static int x11font_has_glyph(unifont *font, wchar_t glyph)
         char sbstring[2];
         int sblen = wc_to_mb(xfont->real_charset, 0, &glyph, 1,
                              sbstring, 2, "", NULL, NULL);
-        if (!sbstring[0])
+        if (sblen == 0 || !sbstring[0])
             return FALSE;              /* not even in the charset */
 
         return x11_font_has_glyph(xfont->fonts[0], 0,
@@ -661,21 +668,21 @@ static void x11font_enum_fonts(GtkWidget *widget,
            style = p;
            p += sprintf(p, "%s", components[2][0] ? components[2] :
                         "regular");
-           if (!g_strcasecmp(components[3], "i"))
+           if (!g_ascii_strcasecmp(components[3], "i"))
                p += sprintf(p, " italic");
-           else if (!g_strcasecmp(components[3], "o"))
+           else if (!g_ascii_strcasecmp(components[3], "o"))
                p += sprintf(p, " oblique");
-           else if (!g_strcasecmp(components[3], "ri"))
+           else if (!g_ascii_strcasecmp(components[3], "ri"))
                p += sprintf(p, " reverse italic");
-           else if (!g_strcasecmp(components[3], "ro"))
+           else if (!g_ascii_strcasecmp(components[3], "ro"))
                p += sprintf(p, " reverse oblique");
-           else if (!g_strcasecmp(components[3], "ot"))
+           else if (!g_ascii_strcasecmp(components[3], "ot"))
                p += sprintf(p, " other-slant");
-           if (components[4][0] && g_strcasecmp(components[4], "normal"))
+           if (components[4][0] && g_ascii_strcasecmp(components[4], "normal"))
                p += sprintf(p, " %s", components[4]);
-           if (!g_strcasecmp(components[10], "m"))
+           if (!g_ascii_strcasecmp(components[10], "m"))
                p += sprintf(p, " [M]");
-           if (!g_strcasecmp(components[10], "c"))
+           if (!g_ascii_strcasecmp(components[10], "c"))
                p += sprintf(p, " [C]");
            if (components[5][0])
                p += sprintf(p, " %s", components[5]);
@@ -687,23 +694,23 @@ static void x11font_enum_fonts(GtkWidget *widget,
             */
            p++;
            stylekey = p;
-           if (!g_strcasecmp(components[2], "medium") ||
-               !g_strcasecmp(components[2], "regular") ||
-               !g_strcasecmp(components[2], "normal") ||
-               !g_strcasecmp(components[2], "book"))
+           if (!g_ascii_strcasecmp(components[2], "medium") ||
+               !g_ascii_strcasecmp(components[2], "regular") ||
+               !g_ascii_strcasecmp(components[2], "normal") ||
+               !g_ascii_strcasecmp(components[2], "book"))
                weightkey = 0;
-           else if (!g_strncasecmp(components[2], "demi", 4) ||
-                    !g_strncasecmp(components[2], "semi", 4))
+           else if (!g_ascii_strncasecmp(components[2], "demi", 4) ||
+                    !g_ascii_strncasecmp(components[2], "semi", 4))
                weightkey = 1;
            else
                weightkey = 2;
-           if (!g_strcasecmp(components[3], "r"))
+           if (!g_ascii_strcasecmp(components[3], "r"))
                slantkey = 0;
-           else if (!g_strncasecmp(components[3], "r", 1))
+           else if (!g_ascii_strncasecmp(components[3], "r", 1))
                slantkey = 2;
            else
                slantkey = 1;
-           if (!g_strcasecmp(components[4], "normal"))
+           if (!g_ascii_strcasecmp(components[4], "normal"))
                setwidthkey = 0;
            else
                setwidthkey = 1;
@@ -915,8 +922,8 @@ static int pangofont_check_desc_makes_sense(PangoContext *ctx,
 
     matched = FALSE;
     for (i = 0; i < nfamilies; i++) {
-       if (!g_strcasecmp(pango_font_family_get_name(families[i]),
-                         pango_font_description_get_family(desc))) {
+       if (!g_ascii_strcasecmp(pango_font_family_get_name(families[i]),
+                               pango_font_description_get_family(desc))) {
            matched = TRUE;
            break;
        }
@@ -1567,6 +1574,7 @@ unifont *multifont_create(GtkWidget *widget, const char *name,
     if (!font)
         return NULL;
 
+    fallback = NULL;
     if (font->want_fallback) {
        for (i = 0; i < lenof(unifont_types); i++) {
             if (unifont_types[i]->create_fallback) {
@@ -1712,7 +1720,7 @@ static int strnullcasecmp(const char *a, const char *b)
     /*
      * Otherwise, ordinary strcasecmp.
      */
-    return g_strcasecmp(a, b);
+    return g_ascii_strcasecmp(a, b);
 }
 
 static int fontinfo_realname_compare(void *av, void *bv)
@@ -2282,6 +2290,8 @@ static fontinfo *update_for_intended_size(unifontsel_internal *fs,
      */
     below = findrelpos234(fs->fonts_by_selorder, &info2, NULL,
                          REL234_LE, &pos);
+    if (!below)
+        pos = -1;
     above = index234(fs->fonts_by_selorder, pos+1);
 
     /*
@@ -2289,7 +2299,7 @@ static fontinfo *update_for_intended_size(unifontsel_internal *fs,
      * case. If we have, it'll be in `below' and not `above',
      * because we did a REL234_LE rather than REL234_LT search.
      */
-    if (!fontinfo_selorder_compare(&info2, below))
+    if (below && !fontinfo_selorder_compare(&info2, below))
        return below;
 
     /*