From 3b004b8e2e55ab8f4f28d4a9536d94e102a28503 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 5 Nov 1999 06:43:45 +0000
Subject: [PATCH] environment variable set by MULTIBYTE startup code should be
 stored in malloc'd space, not in a static variable.  Otherwise environment
 variable list is corrupted if libpq is dynamically unlinked...

---
 src/interfaces/libpq/fe-connect.c | 53 +++++++++++++------------------
 1 file changed, 22 insertions(+), 31 deletions(-)

diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index a5c42ad8149..5057beaa4da 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.104 1999/10/26 04:49:00 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.105 1999/11/05 06:43:45 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -854,50 +854,41 @@ void
 PQsetenv(PGconn *conn)
 {
 	struct EnvironmentOptions *eo;
-	char		setQuery[80];	/* mjl: size okay? XXX */
-
+	char		setQuery[100];	/* note length limits in sprintf's below */
+	const char *val;
+	PGresult   *res;
 #ifdef MULTIBYTE
 	char	   *envname = "PGCLIENTENCODING";
-	static char envbuf[64];		/* big enough? */
-	char	   *env;
-	char	   *encoding = 0;
-	PGresult   *rtn;
-
-#endif
 
-#ifdef MULTIBYTE
-	/* query server encoding */
-	env = getenv(envname);
-	if (!env || *env == '\0')
+	/* Set env. variable PGCLIENTENCODING if it's not set already */
+	val = getenv(envname);
+	if (!val || *val == '\0')
 	{
-		rtn = PQexec(conn, "select getdatabaseencoding()");
-		if (rtn && PQresultStatus(rtn) == PGRES_TUPLES_OK)
+		const char *encoding = NULL;
+
+		/* query server encoding */
+		res = PQexec(conn, "select getdatabaseencoding()");
+		if (res && PQresultStatus(res) == PGRES_TUPLES_OK)
+			encoding = PQgetvalue(res, 0, 0);
+		if (!encoding)			/* this should not happen */
+			encoding = pg_encoding_to_char(MULTIBYTE);
+		if (encoding)
 		{
-			encoding = PQgetvalue(rtn, 0, 0);
-			if (encoding)
-			{
-				/* set client encoding */
-				sprintf(envbuf, "%s=%s", envname, encoding);
-				putenv(envbuf);
-			}
-		}
-		PQclear(rtn);
-		if (!encoding)
-		{						/* this should not happen */
-			sprintf(envbuf, "%s=%s", envname, pg_encoding_to_char(MULTIBYTE));
+			/* set client encoding via environment variable */
+			char	   *envbuf;
+
+			envbuf = (char *) malloc(strlen(envname) + strlen(encoding) + 2);
+			sprintf(envbuf, "%s=%s", envname, encoding);
 			putenv(envbuf);
 		}
+		PQclear(res);
 	}
 #endif
 
 	for (eo = EnvironmentOptions; eo->envName; eo++)
 	{
-		const char *val;
-
 		if ((val = getenv(eo->envName)))
 		{
-			PGresult   *res;
-
 			if (strcasecmp(val, "default") == 0)
 				sprintf(setQuery, "SET %s = %.60s", eo->pgName, val);
 			else
-- 
GitLab