mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +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:
		@@ -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))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user