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:
parent
c99e0d382f
commit
39d4c764da
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user