summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2013-11-23 18:24:26 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2013-11-23 18:24:54 -0500
commitec6a6a268a634a3eae3add9088392c77627dfb26 (patch)
treef0ba79bdc950c90c7c1e1d5b659a5c207e491ad4 /src
parent44032290dd23ccc0c227ee2af4f9e8c0e58077e8 (diff)
Ensure _dosmaperr() actually sets errno correctly.
If logging is enabled, either ereport() or fprintf() might stomp on errno internally, causing this function to return the wrong result. That might only end in a misleading error report, but in any code that's examining errno to decide what to do next, the consequences could be far graver. This has been broken since the very first version of this file in 2006 ... it's a bit astonishing that we didn't identify this long ago. Reported by Amit Kapila, though this isn't his proposed fix.
Diffstat (limited to 'src')
-rw-r--r--src/port/win32error.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/port/win32error.c b/src/port/win32error.c
index f3e4f9227da..2ab5e8ace4c 100644
--- a/src/port/win32error.c
+++ b/src/port/win32error.c
@@ -175,14 +175,16 @@ _dosmaperr(unsigned long e)
{
if (doserrors[i].winerr == e)
{
- errno = doserrors[i].doserr;
+ int doserr = doserrors[i].doserr;
+
#ifndef FRONTEND
ereport(DEBUG5,
(errmsg_internal("mapped win32 error code %lu to %d",
- e, errno)));
+ e, doserr)));
#elif FRONTEND_DEBUG
- fprintf(stderr, _("mapped win32 error code %lu to %d"), e, errno);
+ fprintf(stderr, _("mapped win32 error code %lu to %d"), e, doserr);
#endif
+ errno = doserr;
return;
}
}