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;