aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2013-04-04 12:56:21 -0400
committerBruce Momjian <bruce@momjian.us>2013-04-04 12:56:24 -0400
commit48a2cd370e2610f0a196240aed9f5abd82d3dada (patch)
tree91ef2b8624c09cc8086c5ccd5e85c036c111bcbe
parentbf2b0a147857f63daa2e5c17eed0169861371af8 (diff)
downloadpostgresql-48a2cd370e2610f0a196240aed9f5abd82d3dada.tar.gz
postgresql-48a2cd370e2610f0a196240aed9f5abd82d3dada.zip
psql: fix startup crash caused by PSQLRC containing a tilde
'strdup' the PSQLRC environment variable value before calling a routine that might free() it. Backpatch to 9.2, where the bug first appeared.
-rw-r--r--src/bin/psql/common.c6
-rw-r--r--src/bin/psql/common.h2
-rw-r--r--src/bin/psql/startup.c11
3 files changed, 10 insertions, 9 deletions
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index be5e34a369a..3dea92c7d8f 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -1645,11 +1645,11 @@ session_username(void)
* substitute '~' with HOME or '~username' with username's home dir
*
*/
-char *
+void
expand_tilde(char **filename)
{
if (!filename || !(*filename))
- return NULL;
+ return;
/*
* WIN32 doesn't use tilde expansion for file names. Also, it uses tilde
@@ -1697,5 +1697,5 @@ expand_tilde(char **filename)
}
#endif
- return *filename;
+ return;
}
diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h
index d8bb0930b41..db645dafabb 100644
--- a/src/bin/psql/common.h
+++ b/src/bin/psql/common.h
@@ -44,6 +44,6 @@ extern bool is_superuser(void);
extern bool standard_strings(void);
extern const char *session_username(void);
-extern char *expand_tilde(char **filename);
+extern void expand_tilde(char **filename);
#endif /* COMMON_H */
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 5cb6b5f3648..5d7fe6ea27f 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -610,7 +610,7 @@ process_psqlrc(char *argv0)
char rc_file[MAXPGPATH];
char my_exec_path[MAXPGPATH];
char etc_path[MAXPGPATH];
- char *envrc;
+ char *envrc = getenv("PSQLRC");
find_my_exec(argv0, my_exec_path);
get_etc_path(my_exec_path, etc_path);
@@ -618,12 +618,13 @@ process_psqlrc(char *argv0)
snprintf(rc_file, MAXPGPATH, "%s/%s", etc_path, SYSPSQLRC);
process_psqlrc_file(rc_file);
- envrc = getenv("PSQLRC");
-
if (envrc != NULL && strlen(envrc) > 0)
{
- expand_tilde(&envrc);
- process_psqlrc_file(envrc);
+ /* might need to free() this */
+ char *envrc_alloc = pstrdup(envrc);
+
+ expand_tilde(&envrc_alloc);
+ process_psqlrc_file(envrc_alloc);
}
else if (get_home_path(home))
{