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.
This commit is contained in:
Tom Lane 2007-11-10 18:51:20 +00:00
parent 58ac0f92c0
commit d2d52bbb55
1 changed files with 9 additions and 5 deletions

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * 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)++ while (xmlIsBlank_ch(*(p))) (p)++
/* Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender */ /* Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender */
#define pg_xmlIsNameChar(c) \ /* Beware of multiple evaluations of argument! */
#define PG_XMLISNAMECHAR(c) \
(xmlIsBaseChar_ch(c) || xmlIsIdeographicQ(c) \ (xmlIsBaseChar_ch(c) || xmlIsIdeographicQ(c) \
|| xmlIsDigit_ch(c) \ || xmlIsDigit_ch(c) \
|| c == '.' || c == '-' || c == '_' || c == ':' \ || c == '.' || c == '-' || c == '_' || c == ':' \
@ -1006,12 +1007,13 @@ xml_init(void)
|| xmlIsExtender_ch(c)) || xmlIsExtender_ch(c))
static int 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) xmlChar **version, xmlChar **encoding, int *standalone)
{ {
const xmlChar *p; const xmlChar *p;
const xmlChar *save_p; const xmlChar *save_p;
size_t len; size_t len;
int utf8char;
int utf8len; int utf8len;
xml_init(); xml_init();
@ -1028,8 +1030,10 @@ parse_xml_decl(const xmlChar *str,size_t *lenp,
if (xmlStrncmp(p, (xmlChar *)"<?xml", 5) != 0) if (xmlStrncmp(p, (xmlChar *)"<?xml", 5) != 0)
goto finished; goto finished;
/* This means it's a PI like <?xml-stylesheet ...?>. */ /* if next char is name char, it's a PI like <?xml-stylesheet ...?> */
if (pg_xmlIsNameChar(xmlGetUTF8Char(&p[5], &utf8len))) utf8len = strlen((const char *) (p+5));
utf8char = xmlGetUTF8Char(p+5, &utf8len);
if (PG_XMLISNAMECHAR(utf8char))
goto finished; goto finished;
p += 5; p += 5;