I found that psql will crash if given a PSQLRC value containing a tilde:
$ PSQLRC="~/x" psql test
*** glibc detected *** psql: free(): invalid pointer:
0x00007fffb7c933ec ***
This is on Debian Squeeze 6.0.7. The fix is to pstrdup() the value
returned by getenv(), so it can be free()'ed later --- you can't free
getenv()-returned values:
As typically implemented, getenv() returns a pointer to a string
within the environment list. The caller must take care not to
modify this string, since that would change the environment of
the process.
This bug exists in 9.2 and git head. I also removed the return value
from expand_tilde() as no caller was using it.
--
Bruce Momjian <[email protected]> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ It's impossible for everything to be true. +
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
new file mode 100644
index be5e34a..3dea92c
*** a/src/bin/psql/common.c
--- b/src/bin/psql/common.c
*************** session_username(void)
*** 1645,1655 ****
* substitute '~' with HOME or '~username' with username's home dir
*
*/
! char *
expand_tilde(char **filename)
{
if (!filename || !(*filename))
! return NULL;
/*
* WIN32 doesn't use tilde expansion for file names. Also, it uses tilde
--- 1645,1655 ----
* substitute '~' with HOME or '~username' with username's home dir
*
*/
! void
expand_tilde(char **filename)
{
if (!filename || !(*filename))
! return;
/*
* WIN32 doesn't use tilde expansion for file names. Also, it uses tilde
*************** expand_tilde(char **filename)
*** 1697,1701 ****
}
#endif
! return *filename;
}
--- 1697,1701 ----
}
#endif
! return;
}
diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h
new file mode 100644
index d8bb093..db645da
*** a/src/bin/psql/common.h
--- b/src/bin/psql/common.h
*************** extern bool is_superuser(void);
*** 44,49 ****
extern bool standard_strings(void);
extern const char *session_username(void);
! extern char *expand_tilde(char **filename);
#endif /* COMMON_H */
--- 44,49 ----
extern bool standard_strings(void);
extern const char *session_username(void);
! extern void expand_tilde(char **filename);
#endif /* COMMON_H */
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
new file mode 100644
index 5cb6b5f..5d7fe6e
*** a/src/bin/psql/startup.c
--- b/src/bin/psql/startup.c
*************** process_psqlrc(char *argv0)
*** 610,616 ****
char rc_file[MAXPGPATH];
char my_exec_path[MAXPGPATH];
char etc_path[MAXPGPATH];
! char *envrc;
find_my_exec(argv0, my_exec_path);
get_etc_path(my_exec_path, etc_path);
--- 610,616 ----
char rc_file[MAXPGPATH];
char my_exec_path[MAXPGPATH];
char etc_path[MAXPGPATH];
! char *envrc = getenv("PSQLRC");
find_my_exec(argv0, my_exec_path);
get_etc_path(my_exec_path, etc_path);
*************** process_psqlrc(char *argv0)
*** 618,629 ****
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);
}
else if (get_home_path(home))
{
--- 618,630 ----
snprintf(rc_file, MAXPGPATH, "%s/%s", etc_path, SYSPSQLRC);
process_psqlrc_file(rc_file);
if (envrc != NULL && strlen(envrc) > 0)
{
! /* 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))
{
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers