@@ -79,7 +79,7 @@ typedef struct {
79
79
/* Buffer allocated by us: TYPE_READ and TYPE_ACCEPT */
80
80
PyObject * allocated_buffer ;
81
81
/* Buffer passed by the user: TYPE_WRITE, TYPE_WRITE_TO, and TYPE_READINTO */
82
- Py_buffer * user_buffer ;
82
+ Py_buffer user_buffer ;
83
83
84
84
/* Data used for reading from a connectionless socket:
85
85
TYPE_READ_FROM */
@@ -98,7 +98,7 @@ typedef struct {
98
98
// A (number of bytes read, (host, port)) tuple
99
99
PyObject * result ;
100
100
/* Buffer passed by the user */
101
- Py_buffer * user_buffer ;
101
+ Py_buffer user_buffer ;
102
102
struct sockaddr_in6 address ;
103
103
int address_length ;
104
104
} read_from_into ;
@@ -118,6 +118,13 @@ overlapped_get_state(PyObject *module)
118
118
}
119
119
120
120
121
+ static inline void
122
+ steal_buffer (Py_buffer * dst , Py_buffer * src )
123
+ {
124
+ memcpy (dst , src , sizeof (Py_buffer ));
125
+ memset (src , 0 , sizeof (Py_buffer ));
126
+ }
127
+
121
128
/*
122
129
* Map Windows error codes to subclasses of OSError
123
130
*/
@@ -644,7 +651,7 @@ _overlapped_Overlapped_impl(PyTypeObject *type, HANDLE event)
644
651
self -> type = TYPE_NONE ;
645
652
self -> allocated_buffer = NULL ;
646
653
memset (& self -> overlapped , 0 , sizeof (OVERLAPPED ));
647
- memset (self -> user_buffer , 0 , sizeof (Py_buffer ));
654
+ memset (& self -> user_buffer , 0 , sizeof (Py_buffer ));
648
655
if (event )
649
656
self -> overlapped .hEvent = event ;
650
657
return (PyObject * )self ;
@@ -680,13 +687,16 @@ Overlapped_clear(OverlappedObject *self)
680
687
// We've received a message, free the result tuple.
681
688
Py_CLEAR (self -> read_from_into .result );
682
689
}
690
+ if (self -> read_from_into -> user_buffer .obj ) {
691
+ PyBuffer_Release (& self -> read_from_into -> user_buffer );
692
+ }
683
693
break ;
684
694
}
685
695
case TYPE_WRITE :
686
696
case TYPE_WRITE_TO :
687
697
case TYPE_READINTO : {
688
- if (self -> user_buffer -> obj ) {
689
- PyBuffer_Release (self -> user_buffer );
698
+ if (self -> user_buffer . obj ) {
699
+ PyBuffer_Release (& self -> user_buffer );
690
700
}
691
701
break ;
692
702
}
@@ -1055,13 +1065,13 @@ _overlapped_Overlapped_ReadFileInto_impl(OverlappedObject *self,
1055
1065
return NULL ;
1056
1066
}
1057
1067
#endif
1058
- self -> user_buffer = bufobj ;
1068
+ steal_buffer ( & self -> user_buffer , bufobj ) ;
1059
1069
1060
1070
self -> type = TYPE_READINTO ;
1061
1071
self -> handle = handle ;
1062
1072
1063
- return do_ReadFile (self , handle , self -> user_buffer -> buf ,
1064
- (DWORD )self -> user_buffer -> len );
1073
+ return do_ReadFile (self , handle , self -> user_buffer . buf ,
1074
+ (DWORD )self -> user_buffer . len );
1065
1075
}
1066
1076
1067
1077
static PyObject *
@@ -1162,13 +1172,13 @@ _overlapped_Overlapped_WSARecvInto_impl(OverlappedObject *self,
1162
1172
return NULL ;
1163
1173
}
1164
1174
#endif
1165
- self -> user_buffer = bufobj ;
1175
+ steal_buffer ( & self -> user_buffer , bufobj ) ;
1166
1176
1167
1177
self -> type = TYPE_READINTO ;
1168
1178
self -> handle = handle ;
1169
1179
1170
- return do_WSARecv (self , handle , self -> user_buffer -> buf ,
1171
- (DWORD )self -> user_buffer -> len , flags );
1180
+ return do_WSARecv (self , handle , self -> user_buffer . buf ,
1181
+ (DWORD )self -> user_buffer . len , flags );
1172
1182
}
1173
1183
1174
1184
/*[clinic input]
@@ -1201,14 +1211,14 @@ _overlapped_Overlapped_WriteFile_impl(OverlappedObject *self, HANDLE handle,
1201
1211
return NULL ;
1202
1212
}
1203
1213
#endif
1204
- self -> user_buffer = bufobj ;
1214
+ steal_buffer ( & self -> user_buffer , bufobj ) ;
1205
1215
1206
1216
self -> type = TYPE_WRITE ;
1207
1217
self -> handle = handle ;
1208
1218
1209
1219
Py_BEGIN_ALLOW_THREADS
1210
- ret = WriteFile (handle , self -> user_buffer -> buf ,
1211
- (DWORD )self -> user_buffer -> len ,
1220
+ ret = WriteFile (handle , self -> user_buffer . buf ,
1221
+ (DWORD )self -> user_buffer . len ,
1212
1222
& written , & self -> overlapped );
1213
1223
Py_END_ALLOW_THREADS
1214
1224
@@ -1255,12 +1265,12 @@ _overlapped_Overlapped_WSASend_impl(OverlappedObject *self, HANDLE handle,
1255
1265
return NULL ;
1256
1266
}
1257
1267
#endif
1258
- self -> user_buffer = bufobj ;
1268
+ steal_buffer ( & self -> user_buffer , bufobj ) ;
1259
1269
1260
1270
self -> type = TYPE_WRITE ;
1261
1271
self -> handle = handle ;
1262
- wsabuf .len = (DWORD )self -> user_buffer -> len ;
1263
- wsabuf .buf = self -> user_buffer -> buf ;
1272
+ wsabuf .len = (DWORD )self -> user_buffer . len ;
1273
+ wsabuf .buf = self -> user_buffer . buf ;
1264
1274
1265
1275
Py_BEGIN_ALLOW_THREADS
1266
1276
ret = WSASend ((SOCKET )handle , & wsabuf , 1 , & written , flags ,
@@ -1645,8 +1655,8 @@ Overlapped_traverse(OverlappedObject *self, visitproc visit, void *arg)
1645
1655
case TYPE_WRITE :
1646
1656
case TYPE_WRITE_TO :
1647
1657
case TYPE_READINTO :
1648
- if (self -> user_buffer -> obj ) {
1649
- Py_VISIT (& self -> user_buffer -> obj );
1658
+ if (self -> user_buffer . obj ) {
1659
+ Py_VISIT (& self -> user_buffer . obj );
1650
1660
}
1651
1661
break ;
1652
1662
case TYPE_READ_FROM :
@@ -1655,8 +1665,8 @@ Overlapped_traverse(OverlappedObject *self, visitproc visit, void *arg)
1655
1665
break ;
1656
1666
case TYPE_READ_FROM_INTO :
1657
1667
Py_VISIT (self -> read_from_into .result );
1658
- if (self -> read_from_into .user_buffer -> obj ) {
1659
- Py_VISIT (& self -> read_from_into .user_buffer -> obj );
1668
+ if (self -> read_from_into .user_buffer . obj ) {
1669
+ Py_VISIT (& self -> read_from_into .user_buffer . obj );
1660
1670
}
1661
1671
break ;
1662
1672
}
@@ -1755,12 +1765,12 @@ _overlapped_Overlapped_WSASendTo_impl(OverlappedObject *self, HANDLE handle,
1755
1765
return NULL ;
1756
1766
}
1757
1767
#endif
1758
- self -> user_buffer = bufobj ;
1768
+ steal_buffer ( & self -> user_buffer , bufobj ) ;
1759
1769
1760
1770
self -> type = TYPE_WRITE_TO ;
1761
1771
self -> handle = handle ;
1762
- wsabuf .len = (DWORD )self -> user_buffer -> len ;
1763
- wsabuf .buf = self -> user_buffer -> buf ;
1772
+ wsabuf .len = (DWORD )self -> user_buffer . len ;
1773
+ wsabuf .buf = self -> user_buffer . buf ;
1764
1774
1765
1775
Py_BEGIN_ALLOW_THREADS
1766
1776
ret = WSASendTo ((SOCKET )handle , & wsabuf , 1 , & written , flags ,
@@ -1895,7 +1905,7 @@ _overlapped_Overlapped_WSARecvFromInto_impl(OverlappedObject *self,
1895
1905
1896
1906
self -> type = TYPE_READ_FROM_INTO ;
1897
1907
self -> handle = handle ;
1898
- self -> read_from_into .user_buffer = bufobj ;
1908
+ steal_buffer ( & self -> read_from_into .user_buffer , bufobj ) ;
1899
1909
memset (& self -> read_from_into .address , 0 , sizeof (self -> read_from_into .address ));
1900
1910
self -> read_from_into .address_length = sizeof (self -> read_from_into .address );
1901
1911
0 commit comments