Don't putenv() a string that is allocated in a context that will go away
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 Jan 2008 04:11:19 +0000 (04:11 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 30 Jan 2008 04:11:19 +0000 (04:11 +0000)
soon.  I suspect this explains bug #3902, though I'm still not able to
reproduce that.

src/backend/libpq/auth.c

index aaf36d743204c5961ef383da05ef340e4cf5810d..4fb3635d24f1dfcf033de8bdef8687fcc9a56415 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.162 2008/01/01 19:45:49 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/libpq/auth.c,v 1.163 2008/01/30 04:11:19 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -384,7 +384,6 @@ pg_GSS_recvauth(Port *port)
                                min_stat,
                                lmin_s,
                                gflags;
-       char       *kt_path;
        int                     mtype;
        int                     ret;
        StringInfoData buf;
@@ -398,11 +397,19 @@ pg_GSS_recvauth(Port *port)
                 * setenv("KRB5_KTNAME", pg_krb_server_keyfile, 0); except setenv()
                 * not always available.
                 */
-               if (!getenv("KRB5_KTNAME"))
+               if (getenv("KRB5_KTNAME") == NULL)
                {
-                       kt_path = palloc(MAXPGPATH + 13);
-                       snprintf(kt_path, MAXPGPATH + 13,
-                                        "KRB5_KTNAME=%s", pg_krb_server_keyfile);
+                       size_t  kt_len = strlen(pg_krb_server_keyfile) + 14;
+                       char   *kt_path = malloc(kt_len);
+
+                       if (!kt_path)
+                       {
+                               ereport(LOG,
+                                               (errcode(ERRCODE_OUT_OF_MEMORY),
+                                                errmsg("out of memory")));
+                               return STATUS_ERROR;
+                       }
+                       snprintf(kt_path, kt_len, "KRB5_KTNAME=%s", pg_krb_server_keyfile);
                        putenv(kt_path);
                }
        }