Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite9da20a

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 adangling-pointer crash waiting to happen, though, not to mentionbeing far less than sane from a localization standpoint).
1 parentc957c0b commite9da20a

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
#ifdefUSE_LIBXML
4343

4444
#definePG_XML_DEFAULT_URI "dummy.xml"
45-
#defineXML_ERRBUF_SIZE 200
4645

4746

4847
staticvoidxml_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+
staticchar*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
staticvoid
606603
xml_errorHandler(void*ctxt,constchar*msg,...)
607604
{
605+
charxml_errbuf[256];
608606
va_listargs;
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
int32xsize=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
staticpg_wchar
821823
sqlchar_to_unicode(char*s)
822824
{
823-
intsave_enc;
824-
pg_wcharret;
825825
char*utf8string;
826+
pg_wcharret[2];/* need space for trailing zero */
826827

827828
utf8string= (char*)pg_do_encoding_conversion((unsignedchar*)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-
returnret;
835+
returnret[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) ((constunsignedchar*)from,to,len);
484484
}
485485

486+
/* same, with any encoding */
487+
int
488+
pg_encoding_mb2wchar_with_len(intencoding,
489+
constchar*from,pg_wchar*to,intlen)
490+
{
491+
return (*pg_wchar_table[encoding].mb2wchar_with_len) ((constunsignedchar*)from,to,len);
492+
}
493+
486494
/* returns the byte length of a multibyte word */
487495
int
488496
pg_mblen(constchar*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
#ifndefPG_WCHAR_H
44
#definePG_WCHAR_H
@@ -293,6 +293,8 @@ typedef struct
293293

294294
externintpg_mb2wchar(constchar*from,pg_wchar*to);
295295
externintpg_mb2wchar_with_len(constchar*from,pg_wchar*to,intlen);
296+
externintpg_encoding_mb2wchar_with_len(intencoding,
297+
constchar*from,pg_wchar*to,intlen);
296298
externintpg_char_and_wchar_strcmp(constchar*s1,constpg_wchar*s2);
297299
externintpg_wchar_strncmp(constpg_wchar*s1,constpg_wchar*s2,size_tn);
298300
externintpg_char_and_wchar_strncmp(constchar*s1,constpg_wchar*s2,size_tn);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp