diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2007-11-10 18:51:20 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2007-11-10 18:51:20 +0000 |
commit | d2d52bbb55fbb14dc2e1ed96b03b7e4addfbb2ba (patch) | |
tree | 6025aacb9dbfb4080e9cd3c8652fba9c1c610eb1 /src/backend/utils/adt/xml.c | |
parent | 58ac0f92c0b34fc67b66be81cbf752e6cd27374c (diff) | |
download | postgresql-d2d52bbb55fbb14dc2e1ed96b03b7e4addfbb2ba.tar.gz postgresql-d2d52bbb55fbb14dc2e1ed96b03b7e4addfbb2ba.zip |
xmlGetUTF8Char()'s second argument is both input and output. Fix
uninitialized value, and avoid invoking the function nine separate
times in the pg_xmlIsNameChar macro. Should resolve buildfarm failures.
Per report from Ben Leslie.
Diffstat (limited to 'src/backend/utils/adt/xml.c')
-rw-r--r-- | src/backend/utils/adt/xml.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 1747d9e4bde..1e96555a7b5 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -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; |