Patch for an encoding bug in the derive_locale_encoding function

Mario De Frutos <[email protected]>
Newsgroups gmane.comp.db.postgresql.odbc
Message-ID <CADc-R5gZ6feQCzh+BKy6KXO-ymx3Y1APY2x=w+bL8Fk2CdaOeQ@mail.gmail.com>
Hello!

I've found a bug while I was working with the driver. It seems that
when the drive gets the encoding from the local environment it takes
everything, for example:

LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=en_US.UTF-8;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=en_US.UTF-8;LC_NAME=en_US.UTF-8;LC_ADDRESS=en_US.UTF-8;LC_TELEPHONE=en_US.UTF-8;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=en_US.UTF-8

then it clears until the first dot and uses the rest as encoding:

UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=en_US.UTF-8;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=en_US.UTF-8;LC_NAME=en_US.UTF-8;LC_ADDRESS=en_US.UTF-8;LC_TELEPHONE=en_US.UTF-8;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=en_US.UTF-8

and this gets an error in the following code because is not a right
encoding string:

https://github.com/postgres/postgres/blob/master/src/backend/utils/mb/encnames.c#L570

There are two problems there:

1. First, you get the error because of the encoding
2. It hangs the connection because Postgres uses ereport instead of
returning -1 so it gets stuck

At first, I thought it was an error in the ifdef clause of the
postgres function but it seems correct although I don't know how to
catch that kind of errors to avoid this kind of behavior in cases like
this

In this mail, I've attached a patch to solve the bug. Hope it helps :)
multibyte_encoding_fix.patch (text/x-patch, 375 B)
diff --git a/multibyte.c b/multibyte.c
index e97e0b0..5c9a13c 100644
--- a/multibyte.c
+++ b/multibyte.c
@@ -494,7 +494,7 @@ derive_locale_encoding(const char *dbencoding)
 	/*
 	 *	Derive the encoding from the codeset part of the current locale.
 	 */
-	loc = setlocale(LC_ALL, "");
+	loc = setlocale(LC_CTYPE, "");
 	if (loc && (ptr = strchr(loc, '.')))
 	{
 		int enc_no;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.