Fix symlink() errno on Windows.
authorThomas Munro <tmunro@postgresql.org>
Tue, 25 Oct 2022 02:10:49 +0000 (15:10 +1300)
committerThomas Munro <tmunro@postgresql.org>
Tue, 25 Oct 2022 02:10:49 +0000 (15:10 +1300)
Ancient bug noticed while working on a test suite for these functions.

https://postgr.es/m/CA%2BhUKG%2BajSQ_8eu2AogTncOnZ5me2D-Cn66iN_-wZnRjLN%2Bicg%40mail.gmail.com

src/port/dirmod.c

index ae6301dd6cc7b6544f95a47a522016ca6a40168f..51c9bded8fb2a749c2ff41da3d6f75524731dcf7 100644 (file)
@@ -197,7 +197,10 @@ pgsymlink(const char *oldpath, const char *newpath)
                                                   FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, 0);
 
        if (dirhandle == INVALID_HANDLE_VALUE)
+       {
+               _dosmaperr(GetLastError());
                return -1;
+       }
 
        /* make sure we have an unparsed native win32 path */
        if (memcmp("\\??\\", oldpath, 4) != 0)
@@ -230,8 +233,11 @@ pgsymlink(const char *oldpath, const char *newpath)
                                                 0, 0, &len, 0))
        {
                LPSTR           msg;
+               int                     save_errno;
+
+               _dosmaperr(GetLastError());
+               save_errno = errno;
 
-               errno = 0;
                FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                                          FORMAT_MESSAGE_IGNORE_INSERTS |
                                          FORMAT_MESSAGE_FROM_SYSTEM,
@@ -251,6 +257,9 @@ pgsymlink(const char *oldpath, const char *newpath)
 
                CloseHandle(dirhandle);
                RemoveDirectory(newpath);
+
+               errno = save_errno;
+
                return -1;
        }