1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-02 11:44:50 +03:00

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.
This commit is contained in:
Bruce Momjian 2013-04-04 12:56:21 -04:00
parent c99e0d382f
commit 39d4c764da
3 changed files with 10 additions and 9 deletions

View File

@ -1617,11 +1617,11 @@ session_username(void)
* substitute '~' with HOME or '~username' with username's home dir * substitute '~' with HOME or '~username' with username's home dir
* *
*/ */
char * void
expand_tilde(char **filename) expand_tilde(char **filename)
{ {
if (!filename || !(*filename)) if (!filename || !(*filename))
return NULL; return;
/* /*
* WIN32 doesn't use tilde expansion for file names. Also, it uses tilde * WIN32 doesn't use tilde expansion for file names. Also, it uses tilde
@ -1669,5 +1669,5 @@ expand_tilde(char **filename)
} }
#endif #endif
return *filename; return;
} }

View File

@ -61,6 +61,6 @@ extern bool is_superuser(void);
extern bool standard_strings(void); extern bool standard_strings(void);
extern const char *session_username(void); extern const char *session_username(void);
extern char *expand_tilde(char **filename); extern void expand_tilde(char **filename);
#endif /* COMMON_H */ #endif /* COMMON_H */

View File

@ -591,7 +591,7 @@ process_psqlrc(char *argv0)
char rc_file[MAXPGPATH]; char rc_file[MAXPGPATH];
char my_exec_path[MAXPGPATH]; char my_exec_path[MAXPGPATH];
char etc_path[MAXPGPATH]; char etc_path[MAXPGPATH];
char *envrc; char *envrc = getenv("PSQLRC");
find_my_exec(argv0, my_exec_path); find_my_exec(argv0, my_exec_path);
get_etc_path(my_exec_path, etc_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); snprintf(rc_file, MAXPGPATH, "%s/%s", etc_path, SYSPSQLRC);
process_psqlrc_file(rc_file); process_psqlrc_file(rc_file);
envrc = getenv("PSQLRC");
if (envrc != NULL && strlen(envrc) > 0) if (envrc != NULL && strlen(envrc) > 0)
{ {
expand_tilde(&envrc); /* might need to free() this */
process_psqlrc_file(envrc); char *envrc_alloc = pg_strdup(envrc);
expand_tilde(&envrc_alloc);
process_psqlrc_file(envrc_alloc);
} }
else if (get_home_path(home)) else if (get_home_path(home))
{ {