aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>1999-11-05 06:43:45 +0000
committerTom Lane <tgl@sss.pgh.pa.us>1999-11-05 06:43:45 +0000
commit3b004b8e2e55ab8f4f28d4a9536d94e102a28503 (patch)
tree3394e4d8e450eb8f20010e148c22c953cfce01d7 /src
parent3d1db6ddc6c8f964918728a66767d8e31e5ec993 (diff)
downloadpostgresql-3b004b8e2e55ab8f4f28d4a9536d94e102a28503.tar.gz
postgresql-3b004b8e2e55ab8f4f28d4a9536d94e102a28503.zip
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...
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/libpq/fe-connect.c53
1 files 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