Skip to content

Commit e9da20a

Browse files
committed
Fix machine-dependent crash in sqlchar_to_unicode(). Get rid of
bletcherous and unsafe manipulation of global encoding setting. Clean up libxml reporting mechanism a bit (it still looks like a dangling-pointer crash waiting to happen, though, not to mention being far less than sane from a localization standpoint).
1 parent c957c0b commit e9da20a

File tree

3 files changed

+30
-22
lines changed

3 files changed

+30
-22
lines changed

src/backend/utils/adt/xml.c

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.3 2006/12/24 00:29:19 tgl Exp $
10+
* $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.4 2006/12/24 00:57:48 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -42,7 +42,6 @@
4242
#ifdef USE_LIBXML
4343

4444
#define PG_XML_DEFAULT_URI "dummy.xml"
45-
#define XML_ERRBUF_SIZE 200
4645

4746

4847
static void xml_init(void);
@@ -60,8 +59,7 @@ static xmlDocPtr xml_parse(text *data, int opts, bool is_document);
6059
/* Global variables */
6160
/* taken from contrib/xml2 */
6261
/* FIXME: DO NOT USE global vars !!! */
63-
char *xml_errbuf; /* per line error buffer */
64-
char *xml_errmsg = NULL; /* overall error message */
62+
static char *xml_errmsg = NULL; /* overall error message */
6563

6664
#endif /* USE_LIBXML */
6765

@@ -376,8 +374,6 @@ xml_init(void)
376374
/* do not flood PG's logfile with libxml error messages - reset error handler*/
377375
xmlSetGenericErrorFunc(NULL, xml_errorHandler);
378376
xml_errmsg = NULL;
379-
xml_errbuf = palloc(XML_ERRBUF_SIZE);
380-
memset(xml_errbuf, 0, XML_ERRBUF_SIZE);
381377
}
382378

383379

@@ -563,6 +559,7 @@ xml_ereport(int level, char *msg, void *ctxt)
563559
{
564560
ereport(DEBUG1, (errmsg("%s", xml_errmsg)));
565561
pfree(xml_errmsg);
562+
xml_errmsg = NULL;
566563
}
567564

568565
if (ctxt != NULL)
@@ -605,23 +602,26 @@ xml_ereport(int level, char *msg, void *ctxt)
605602
static void
606603
xml_errorHandler(void *ctxt, const char *msg,...)
607604
{
605+
char xml_errbuf[256];
608606
va_list args;
609607

608+
/* Format this message ... */
610609
va_start(args, msg);
611-
vsnprintf(xml_errbuf, XML_ERRBUF_SIZE, msg, args);
610+
vsnprintf(xml_errbuf, sizeof(xml_errbuf)-1, msg, args);
612611
va_end(args);
613-
/* Now copy the argument across */
612+
xml_errbuf[sizeof(xml_errbuf)-1] = '\0';
613+
614+
/* ... and append to xml_errbuf */
614615
if (xml_errmsg == NULL)
615616
xml_errmsg = pstrdup(xml_errbuf);
616617
else
617618
{
618619
int32 xsize = strlen(xml_errmsg);
619620

620-
xml_errmsg = repalloc(xml_errmsg, (size_t) (xsize + strlen(xml_errbuf) + 1));
621-
strncpy(&xml_errmsg[xsize - 1], xml_errbuf, strlen(xml_errbuf));
622-
xml_errmsg[xsize + strlen(xml_errbuf) - 1] = '\0';
621+
xml_errmsg = repalloc(xml_errmsg,
622+
(size_t) (xsize + strlen(xml_errbuf) + 1));
623+
strcpy(&xml_errmsg[xsize - 1], xml_errbuf);
623624
}
624-
memset(xml_errbuf, 0, XML_ERRBUF_SIZE);
625625
}
626626

627627

@@ -800,13 +800,15 @@ xml_ereport_by_code(int level, char *msg, int code)
800800
break;
801801
default:
802802
det = "Unregistered error (libxml error code: %d)";
803-
ereport(DEBUG1, (errmsg("Check out \"libxml/xmlerror.h\" and bring errcode \"%d\" processing to \"xml.c\".", code)));
803+
ereport(DEBUG1,
804+
(errmsg_internal("Check out \"libxml/xmlerror.h\" and bring errcode \"%d\" processing to \"xml.c\".", code)));
804805
}
805806

806807
if (xml_errmsg != NULL)
807808
{
808809
ereport(DEBUG1, (errmsg("%s", xml_errmsg)));
809810
pfree(xml_errmsg);
811+
xml_errmsg = NULL;
810812
}
811813

812814
ereport(level, (errmsg(msg), errdetail(det, code)));
@@ -820,21 +822,17 @@ xml_ereport_by_code(int level, char *msg, int code)
820822
static pg_wchar
821823
sqlchar_to_unicode(char *s)
822824
{
823-
int save_enc;
824-
pg_wchar ret;
825825
char *utf8string;
826+
pg_wchar ret[2]; /* need space for trailing zero */
826827

827828
utf8string = (char *) pg_do_encoding_conversion((unsigned char *) s,
828829
pg_mblen(s),
829830
GetDatabaseEncoding(),
830831
PG_UTF8);
831832

832-
save_enc = GetDatabaseEncoding();
833-
SetDatabaseEncoding(PG_UTF8);
834-
pg_mb2wchar_with_len(utf8string, &ret, pg_mblen(s));
835-
SetDatabaseEncoding(save_enc);
833+
pg_encoding_mb2wchar_with_len(PG_UTF8, utf8string, ret, pg_mblen(s));
836834

837-
return ret;
835+
return ret[0];
838836
}
839837

840838

src/backend/utils/mb/mbutils.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* (currently mule internal code (mic) is used)
55
* Tatsuo Ishii
66
*
7-
* $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.60 2006/12/21 16:05:15 petere Exp $
7+
* $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.61 2006/12/24 00:57:48 tgl Exp $
88
*/
99
#include "postgres.h"
1010

@@ -483,6 +483,14 @@ pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len)
483483
return (*pg_wchar_table[DatabaseEncoding->encoding].mb2wchar_with_len) ((const unsigned char *) from, to, len);
484484
}
485485

486+
/* same, with any encoding */
487+
int
488+
pg_encoding_mb2wchar_with_len(int encoding,
489+
const char *from, pg_wchar *to, int len)
490+
{
491+
return (*pg_wchar_table[encoding].mb2wchar_with_len) ((const unsigned char *) from, to, len);
492+
}
493+
486494
/* returns the byte length of a multibyte word */
487495
int
488496
pg_mblen(const char *mbstr)

src/include/mb/pg_wchar.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/include/mb/pg_wchar.h,v 1.69 2006/10/04 00:30:09 momjian Exp $ */
1+
/* $PostgreSQL: pgsql/src/include/mb/pg_wchar.h,v 1.70 2006/12/24 00:57:48 tgl Exp $ */
22

33
#ifndef PG_WCHAR_H
44
#define PG_WCHAR_H
@@ -293,6 +293,8 @@ typedef struct
293293

294294
extern int pg_mb2wchar(const char *from, pg_wchar *to);
295295
extern int pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len);
296+
extern int pg_encoding_mb2wchar_with_len(int encoding,
297+
const char *from, pg_wchar *to, int len);
296298
extern int pg_char_and_wchar_strcmp(const char *s1, const pg_wchar *s2);
297299
extern int pg_wchar_strncmp(const pg_wchar *s1, const pg_wchar *s2, size_t n);
298300
extern int pg_char_and_wchar_strncmp(const char *s1, const pg_wchar *s2, size_t n);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy