From 04f2403820344cc27da85d8c0e250933dbecf6b9 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 3 May 2009 20:09:54 +0000 Subject: [PATCH] Fix assign_pgstat_temp_directory() to ensure the directory path is canonicalized. Avoid the need to elog(FATAL) on out-of-memory. --- src/backend/utils/misc/guc.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 23fb43647d..41368bf1e9 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut . * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.503 2009/04/23 00:23:45 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.504 2009/05/03 20:09:54 tgl Exp $ * *-------------------------------------------------------------------- */ @@ -7618,19 +7618,28 @@ assign_pgstat_temp_directory(const char *newval, bool doit, GucSource source) { if (doit) { + char *canon_val = guc_strdup(ERROR, newval); + char *tname; + char *fname; + + canonicalize_path(canon_val); + + tname = guc_malloc(ERROR, strlen(canon_val) + 12); /* /pgstat.tmp */ + sprintf(tname, "%s/pgstat.tmp", canon_val); + fname = guc_malloc(ERROR, strlen(canon_val) + 13); /* /pgstat.stat */ + sprintf(fname, "%s/pgstat.stat", canon_val); + if (pgstat_stat_tmpname) free(pgstat_stat_tmpname); + pgstat_stat_tmpname = tname; if (pgstat_stat_filename) free(pgstat_stat_filename); + pgstat_stat_filename = fname; - pgstat_stat_tmpname = guc_malloc(FATAL, strlen(newval) + 12); /* /pgstat.tmp */ - pgstat_stat_filename = guc_malloc(FATAL, strlen(newval) + 13); /* /pgstat.stat */ - - sprintf(pgstat_stat_tmpname, "%s/pgstat.tmp", newval); - sprintf(pgstat_stat_filename, "%s/pgstat.stat", newval); + return canon_val; } - - return newval; + else + return newval; } #include "guc-file.c"