]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Ensure _dosmaperr() actually sets errno correctly.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 23 Nov 2013 23:24:26 +0000 (18:24 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 23 Nov 2013 23:24:50 +0000 (18:24 -0500)
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.

src/port/win32error.c

index 4b3b1ea7d6ea189277b9d4945b97b5e9fc3bd5da..32a9aec61e63ea26d5c508f344bc1619eafc7b55 100644 (file)
@@ -179,14 +179,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;
                }
        }