]> granicus.if.org Git - postgresql/commitdiff
Use FLEXIBLE_ARRAY_MEMBER in Windows-specific code.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 21 Feb 2015 21:49:28 +0000 (16:49 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 21 Feb 2015 21:49:35 +0000 (16:49 -0500)
Be a tad more paranoid about overlength input, too.

src/port/dirmod.c

index 6187a0a36ddca2f4dfe5baeed6df5695b8aee0d5..0d8b8a806996a5fcdc65aef949a6fa2dbf1eefde 100644 (file)
@@ -143,7 +143,7 @@ typedef struct
        WORD            SubstituteNameLength;
        WORD            PrintNameOffset;
        WORD            PrintNameLength;
-       WCHAR           PathBuffer[1];
+       WCHAR           PathBuffer[FLEXIBLE_ARRAY_MEMBER];
 } REPARSE_JUNCTION_DATA_BUFFER;
 
 #define REPARSE_JUNCTION_DATA_BUFFER_HEADER_SIZE   \
@@ -160,7 +160,7 @@ pgsymlink(const char *oldpath, const char *newpath)
 {
        HANDLE          dirhandle;
        DWORD           len;
-       char            buffer[MAX_PATH * sizeof(WCHAR) + sizeof(REPARSE_JUNCTION_DATA_BUFFER)];
+       char            buffer[MAX_PATH * sizeof(WCHAR) + offsetof(REPARSE_JUNCTION_DATA_BUFFER, PathBuffer)];
        char            nativeTarget[MAX_PATH];
        char       *p = nativeTarget;
        REPARSE_JUNCTION_DATA_BUFFER *reparseBuf = (REPARSE_JUNCTION_DATA_BUFFER *) buffer;
@@ -174,10 +174,10 @@ pgsymlink(const char *oldpath, const char *newpath)
                return -1;
 
        /* make sure we have an unparsed native win32 path */
-       if (memcmp("\\??\\", oldpath, 4))
-               sprintf(nativeTarget, "\\??\\%s", oldpath);
+       if (memcmp("\\??\\", oldpath, 4) != 0)
+               snprintf(nativeTarget, sizeof(nativeTarget), "\\??\\%s", oldpath);
        else
-               strcpy(nativeTarget, oldpath);
+               strlcpy(nativeTarget, oldpath, sizeof(nativeTarget));
 
        while ((p = strchr(p, '/')) != NULL)
                *p++ = '\\';
@@ -239,7 +239,7 @@ pgreadlink(const char *path, char *buf, size_t size)
 {
        DWORD           attr;
        HANDLE          h;
-       char            buffer[MAX_PATH * sizeof(WCHAR) + sizeof(REPARSE_JUNCTION_DATA_BUFFER)];
+       char            buffer[MAX_PATH * sizeof(WCHAR) + offsetof(REPARSE_JUNCTION_DATA_BUFFER, PathBuffer)];
        REPARSE_JUNCTION_DATA_BUFFER *reparseBuf = (REPARSE_JUNCTION_DATA_BUFFER *) buffer;
        DWORD           len;
        int                     r;