aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/tablespace.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2014-01-29 20:04:05 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2014-01-29 20:04:05 -0500
commit3e71ce1e9ab73a829ae3ddbcd9b03e6673e39c3e (patch)
tree9ff4521cff9c44fe3693d03477765e4d82986435 /src/backend/commands/tablespace.c
parentea311bfdfdfc9aeae4c7ba18cfa875f4ad2e2345 (diff)
downloadpostgresql-3e71ce1e9ab73a829ae3ddbcd9b03e6673e39c3e.tar.gz
postgresql-3e71ce1e9ab73a829ae3ddbcd9b03e6673e39c3e.zip
Fix unsafe references to errno within error messaging logic.
Various places were supposing that errno could be expected to hold still within an ereport() nest or similar contexts. This isn't true necessarily, though in some cases it accidentally failed to fail depending on how the compiler chanced to order the subexpressions. This class of thinko explains recent reports of odd failures on clang-built versions, typically missing or inappropriate HINT fields in messages. Problem identified by Christian Kruse, who also submitted the patch this commit is based on. (I fixed a few issues in his patch and found a couple of additional places with the same disease.) Back-patch as appropriate to all supported branches.
Diffstat (limited to 'src/backend/commands/tablespace.c')
-rw-r--r--src/backend/commands/tablespace.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c
index da9cb2f30e9..5fca59b28f2 100644
--- a/src/backend/commands/tablespace.c
+++ b/src/backend/commands/tablespace.c
@@ -774,10 +774,14 @@ remove_symlink:
else
{
if (unlink(linkloc) < 0)
- ereport(redo ? LOG : (errno == ENOENT ? WARNING : ERROR),
+ {
+ int saved_errno = errno;
+
+ ereport(redo ? LOG : (saved_errno == ENOENT ? WARNING : ERROR),
(errcode_for_file_access(),
errmsg("could not remove symbolic link \"%s\": %m",
linkloc)));
+ }
}
pfree(linkloc_with_version_dir);