diff options
author | Bruce Momjian <bruce@momjian.us> | 2013-04-04 12:56:21 -0400 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2013-04-04 12:56:25 -0400 |
commit | 39d4c764da3d4dd74238d82b0e5ccd1030ebf9f7 (patch) | |
tree | 51c7a50f41c79c905fef0c001632765e4e160b0b | |
parent | c99e0d382f811cf0fbad50e912183ed4eb7b8de8 (diff) |
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.c | 6 | ||||
-rw-r--r-- | src/bin/psql/common.h | 2 | ||||
-rw-r--r-- | src/bin/psql/startup.c | 11 |
3 files changed, 10 insertions, 9 deletions
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index c804148cd57..df8c80a1b26 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1617,11 +1617,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 @@ -1669,5 +1669,5 @@ expand_tilde(char **filename) } #endif - return *filename; + return; } diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h index 8037cbc0a0d..cfe0dadfd66 100644 --- a/src/bin/psql/common.h +++ b/src/bin/psql/common.h @@ -61,6 +61,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 9a6306b8cf2..b30639395ec 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -591,7 +591,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); @@ -599,12 +599,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 = pg_strdup(envrc); + + expand_tilde(&envrc_alloc); + process_psqlrc_file(envrc_alloc); } else if (get_home_path(home)) { |