]> granicus.if.org Git - postgresql/commitdiff
xmlGetUTF8Char()'s second argument is both input and output. Fix
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 10 Nov 2007 18:51:20 +0000 (18:51 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 10 Nov 2007 18:51:20 +0000 (18:51 +0000)
uninitialized value, and avoid invoking the function nine separate
times in the pg_xmlIsNameChar macro.  Should resolve buildfarm failures.
Per report from Ben Leslie.

src/backend/utils/adt/xml.c

index 1747d9e4bdefad298a051c91b98891b0ea20c426..1e96555a7b56142236ec1bc695b81ab13ba5b1a6 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.54 2007/11/09 15:52:51 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.55 2007/11/10 18:51:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -998,7 +998,8 @@ xml_init(void)
        while (xmlIsBlank_ch(*(p))) (p)++
 
 /* Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender */
-#define pg_xmlIsNameChar(c) \
+/* Beware of multiple evaluations of argument! */
+#define PG_XMLISNAMECHAR(c) \
        (xmlIsBaseChar_ch(c) || xmlIsIdeographicQ(c) \
                        || xmlIsDigit_ch(c) \
                        || c == '.' || c == '-' || c == '_' || c == ':' \
@@ -1006,12 +1007,13 @@ xml_init(void)
                        || xmlIsExtender_ch(c))
 
 static int
-parse_xml_decl(const xmlChar *str,size_t *lenp,
+parse_xml_decl(const xmlChar *str, size_t *lenp,
                           xmlChar **version, xmlChar **encoding, int *standalone)
 {
        const xmlChar *p;
        const xmlChar *save_p;
        size_t          len;
+       int                     utf8char;
        int                     utf8len;
 
        xml_init();
@@ -1028,8 +1030,10 @@ parse_xml_decl(const xmlChar *str,size_t *lenp,
        if (xmlStrncmp(p, (xmlChar *)"<?xml", 5) != 0)
                goto finished;
 
-       /* This means it's a PI like <?xml-stylesheet ...?>. */
-       if (pg_xmlIsNameChar(xmlGetUTF8Char(&p[5], &utf8len)))
+       /* if next char is name char, it's a PI like <?xml-stylesheet ...?> */
+       utf8len = strlen((const char *) (p+5));
+       utf8char = xmlGetUTF8Char(p+5, &utf8len);
+       if (PG_XMLISNAMECHAR(utf8char))
                goto finished;
 
        p += 5;