]> granicus.if.org Git - python/commitdiff
Issue #17599: Use unique _Py_REPARSE_DATA_BUFFER etc names to avoid conflict
authorMartin Panter <vadmium+py@gmail.com>
Thu, 4 Aug 2016 02:38:59 +0000 (02:38 +0000)
committerMartin Panter <vadmium+py@gmail.com>
Thu, 4 Aug 2016 02:38:59 +0000 (02:38 +0000)
The conflict occurs with Min GW, which already defines REPARSE_DATA_BUFFER.
Also, Min GW uses a lowercase <windows.h> filename.

Misc/NEWS
Modules/_winapi.c
Modules/posixmodule.c
Modules/winreparse.h

index 155d3550a5d3c2c333c6914f6536e36acdb4c5a9..3ad1cd5f40aef9d33cc8cf96be0a0feed6c3f220 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -14,6 +14,9 @@ Core and Builtins
 
 - Issue #17596: Include <wincrypt.h> to help with Min GW building.
 
+- Issue #17599: On Windows, rename the privately defined REPARSE_DATA_BUFFER
+  structure to avoid conflicting with the definition from Min GW.
+
 - Issue #27507: Add integer overflow check in bytearray.extend().  Patch by
   Xiang Zhang.
 
index f4da8aaffe862d1b41775bb8a7df9f23a73dc0be..91d4f0172c3c5078058c90611e348cabeb04ddf1 100644 (file)
@@ -486,7 +486,7 @@ _winapi_CreateJunction_impl(PyObject *module, LPWSTR src_path,
     const USHORT prefix_len = 4;
     USHORT print_len = 0;
     USHORT rdb_size = 0;
-    PREPARSE_DATA_BUFFER rdb = NULL;
+    _Py_PREPARSE_DATA_BUFFER rdb = NULL;
 
     /* Junction point creation */
     HANDLE junction = NULL;
@@ -542,18 +542,18 @@ _winapi_CreateJunction_impl(PyObject *module, LPWSTR src_path,
          - the size of the print name in bytes
          - the size of the substitute name in bytes
          - the size of two NUL terminators in bytes */
-    rdb_size = REPARSE_DATA_BUFFER_HEADER_SIZE +
+    rdb_size = _Py_REPARSE_DATA_BUFFER_HEADER_SIZE +
         sizeof(rdb->MountPointReparseBuffer) -
         sizeof(rdb->MountPointReparseBuffer.PathBuffer) +
         /* Two +1's for NUL terminators. */
         (prefix_len + print_len + 1 + print_len + 1) * sizeof(WCHAR);
-    rdb = (PREPARSE_DATA_BUFFER)PyMem_RawMalloc(rdb_size);
+    rdb = (_Py_PREPARSE_DATA_BUFFER)PyMem_RawMalloc(rdb_size);
     if (rdb == NULL)
         goto cleanup;
 
     memset(rdb, 0, rdb_size);
     rdb->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
-    rdb->ReparseDataLength = rdb_size - REPARSE_DATA_BUFFER_HEADER_SIZE;
+    rdb->ReparseDataLength = rdb_size - _Py_REPARSE_DATA_BUFFER_HEADER_SIZE;
     rdb->MountPointReparseBuffer.SubstituteNameOffset = 0;
     rdb->MountPointReparseBuffer.SubstituteNameLength =
         (prefix_len + print_len) * sizeof(WCHAR);
index 54685ae7f0a7ba5c38c3160c8253d4a19b3ab73a..6adc7f44dbf42654976f52407b3578c6e5ed26e7 100644 (file)
@@ -1106,8 +1106,8 @@ _PyVerify_fd_dup2(int fd1, int fd2)
 static int
 win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag)
 {
-    char target_buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
-    REPARSE_DATA_BUFFER *rdb = (REPARSE_DATA_BUFFER *)target_buffer;
+    char target_buffer[_Py_MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
+    _Py_REPARSE_DATA_BUFFER *rdb = (_Py_REPARSE_DATA_BUFFER *)target_buffer;
     DWORD n_bytes_returned;
 
     if (0 == DeviceIoControl(
@@ -7149,8 +7149,8 @@ win_readlink(PyObject *self, PyObject *args, PyObject *kwargs)
     int dir_fd;
     HANDLE reparse_point_handle;
 
-    char target_buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
-    REPARSE_DATA_BUFFER *rdb = (REPARSE_DATA_BUFFER *)target_buffer;
+    char target_buffer[_Py_MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
+    _Py_REPARSE_DATA_BUFFER *rdb = (_Py_REPARSE_DATA_BUFFER *)target_buffer;
     const wchar_t *print_name;
 
     static char *keywords[] = {"path", "dir_fd", NULL};
index 66f7775dd2e81433e1595eee184bc9df5295c37d..28049c9af906642235e9009da8590fea6d2f88a4 100644 (file)
@@ -2,7 +2,7 @@
 #define Py_WINREPARSE_H
 
 #ifdef MS_WINDOWS
-#include <Windows.h>
+#include <windows.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,9 +10,10 @@ extern "C" {
 
 /* The following structure was copied from
    http://msdn.microsoft.com/en-us/library/ff552012.aspx as the required
-   include doesn't seem to be present in the Windows SDK (at least as included
-   with Visual Studio Express). */
-typedef struct _REPARSE_DATA_BUFFER {
+   include km\ntifs.h isn't present in the Windows SDK (at least as included
+   with Visual Studio Express). Use unique names to avoid conflicting with
+   the structure as defined by Min GW. */
+typedef struct {
     ULONG ReparseTag;
     USHORT ReparseDataLength;
     USHORT Reserved;
@@ -38,11 +39,11 @@ typedef struct _REPARSE_DATA_BUFFER {
             UCHAR  DataBuffer[1];
         } GenericReparseBuffer;
     };
-} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+} _Py_REPARSE_DATA_BUFFER, *_Py_PREPARSE_DATA_BUFFER;
 
-#define REPARSE_DATA_BUFFER_HEADER_SIZE  FIELD_OFFSET(REPARSE_DATA_BUFFER,\
-                                                      GenericReparseBuffer)
-#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE  ( 16 * 1024 )
+#define _Py_REPARSE_DATA_BUFFER_HEADER_SIZE \
+    FIELD_OFFSET(_Py_REPARSE_DATA_BUFFER, GenericReparseBuffer)
+#define _Py_MAXIMUM_REPARSE_DATA_BUFFER_SIZE  ( 16 * 1024 )
 
 #ifdef __cplusplus
 }