]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcxml.c
Stop trampling the directory name when writing out caches. (with Mike
[fontconfig.git] / src / fcxml.c
index b3777b9bb43247f3329a69551cc21ea3eb8551e0..e65ccbfdfce589a763350526cf4d5d75606e1424 100644 (file)
@@ -22,6 +22,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <fcntl.h>
 #include <stdarg.h>
 #include "fcint.h"
 #include <dirent.h>
@@ -933,7 +934,7 @@ FcConfigSaveAttr (const XML_Char **attr)
        return 0;
     slen = 0;
     for (i = 0; attr[i]; i++)
-       slen += strlen (attr[i]) + 1;
+       slen += strlen ((char *) attr[i]) + 1;
     n = i;
     new = malloc ((i + 1) * sizeof (FcChar8 *) + slen);
     if (!new)
@@ -1024,6 +1025,9 @@ FcConfigGetAttribute (FcConfigParse *parse, const char *attr)
        return 0;
 
     attrs = parse->pstack->attr;
+    if (!attrs)
+        return 0;
+
     while (*attrs)
     {
        if (!strcmp ((char *) *attrs, attr))
@@ -2046,7 +2050,7 @@ FcEndElement(void *userData, const XML_Char *name)
        if (!FcStrUsesHome (data) || FcConfigHome ())
        {
            if (!FcConfigAddDir (parse->config, data))
-               FcConfigMessage (parse, FcSevereError, "out of memory");
+               FcConfigMessage (parse, FcSevereError, "out of memory; cannot add directory %s", data);
        }
        FcStrFree (data);
        break;
@@ -2352,7 +2356,7 @@ FcConfigParseAndLoad (FcConfig        *config,
 
     XML_Parser     p;
     FcChar8        *filename;
-    FILE           *f;
+    int                    fd;
     int                    len;
     FcConfigParse   parse;
     FcBool         error = FcTrue;
@@ -2368,6 +2372,12 @@ FcConfigParseAndLoad (FcConfig       *config,
     if (!filename)
        goto bail0;
     
+    if (FcStrSetMember (config->configFiles, filename))
+    {
+        FcStrFree (filename);
+        return FcTrue;
+    }
+
     if (!FcStrSetAdd (config->configFiles, filename))
     {
        FcStrFree (filename);
@@ -2384,10 +2394,11 @@ FcConfigParseAndLoad (FcConfig      *config,
     if (FcDebug () & FC_DBG_CONFIG)
        printf ("\tLoading config file %s\n", filename);
 
-    f = fopen ((char *) filename, "r");
-    FcStrFree (filename);
-    if (!f)
+    fd = open ((char *) filename, O_RDONLY);
+    if (fd == -1) { 
+       FcStrFree (filename);
        goto bail0;
+    }
     
 #if ENABLE_LIBXML2
     memset(&sax, 0, sizeof(sax));
@@ -2398,10 +2409,11 @@ FcConfigParseAndLoad (FcConfig      *config,
     sax.endElement = FcEndElement;
     sax.characters = FcCharacterData;
 
-    p = xmlCreatePushParserCtxt (&sax, &parse, NULL, 0, filename);
+    p = xmlCreatePushParserCtxt (&sax, &parse, NULL, 0, (const char *) filename);
 #else
     p = XML_ParserCreate ("UTF-8");
 #endif
+    FcStrFree (filename);
 
     if (!p)
        goto bail1;
@@ -2428,7 +2440,7 @@ FcConfigParseAndLoad (FcConfig        *config,
            goto bail3;
        }
 #endif
-       len = fread (buf, 1, BUFSIZ, f);
+       len = read (fd, buf, BUFSIZ);
        if (len < 0)
        {
            FcConfigMessage (&parse, FcSevereError, "failed reading config file");
@@ -2452,8 +2464,8 @@ bail3:
 bail2:
     XML_ParserFree (p);
 bail1:
-    fclose (f);
-    f = NULL;
+    close (fd);
+    fd = -1;
 bail0:
     if (error && complain)
     {