@@ -168,7 +168,7 @@ var wsaMsgPool = sync.Pool{
168
168
169
169
// newWSAMsg creates a new WSAMsg with the provided parameters.
170
170
// Use [freeWSAMsg] to free it.
171
- func newWSAMsg (p []byte , oob []byte , flags int , rsa * syscall. RawSockaddrAny ) * windows.WSAMsg {
171
+ func newWSAMsg (p []byte , oob []byte , flags int , unconnected bool ) * windows.WSAMsg {
172
172
// The returned object can't be allocated in the stack because it is accessed asynchronously
173
173
// by Windows in between several system calls. If the stack frame is moved while that happens,
174
174
// then Windows may access invalid memory.
@@ -183,11 +183,9 @@ func newWSAMsg(p []byte, oob []byte, flags int, rsa *syscall.RawSockaddrAny) *wi
183
183
Buf : unsafe .SliceData (oob ),
184
184
}
185
185
msg .Flags = uint32 (flags )
186
- msg .Name = syscall .Pointer (unsafe .Pointer (rsa ))
187
- if rsa != nil {
188
- msg .Namelen = int32 (unsafe .Sizeof (* rsa ))
189
- } else {
190
- msg .Namelen = 0
186
+ if unconnected {
187
+ msg .Name = wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
188
+ msg .Namelen = int32 (unsafe .Sizeof (syscall.RawSockaddrAny {}))
191
189
}
192
190
return msg
193
191
}
@@ -198,6 +196,12 @@ func freeWSAMsg(msg *windows.WSAMsg) {
198
196
msg .Buffers .Buf = nil
199
197
msg .Control .Len = 0
200
198
msg .Control .Buf = nil
199
+ if msg .Name != nil {
200
+ * msg .Name = syscall.RawSockaddrAny {}
201
+ wsaRsaPool .Put (msg .Name )
202
+ msg .Name = nil
203
+ msg .Namelen = 0
204
+ }
201
205
wsaMsgPool .Put (msg )
202
206
}
203
207
@@ -1355,9 +1359,7 @@ func (fd *FD) ReadMsg(p []byte, oob []byte, flags int) (int, int, int, syscall.S
1355
1359
p = p [:maxRW ]
1356
1360
}
1357
1361
1358
- rsa := wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
1359
- defer wsaRsaPool .Put (rsa )
1360
- msg := newWSAMsg (p , oob , flags , rsa )
1362
+ msg := newWSAMsg (p , oob , flags , true )
1361
1363
defer freeWSAMsg (msg )
1362
1364
n , err := fd .execIO (& fd .rop , func (o * operation ) (qty uint32 , err error ) {
1363
1365
err = windows .WSARecvMsg (fd .Sysfd , msg , & qty , & o .o , nil )
@@ -1366,7 +1368,7 @@ func (fd *FD) ReadMsg(p []byte, oob []byte, flags int) (int, int, int, syscall.S
1366
1368
err = fd .eofError (n , err )
1367
1369
var sa syscall.Sockaddr
1368
1370
if err == nil {
1369
- sa , err = rsa .Sockaddr ()
1371
+ sa , err = msg . Name .Sockaddr ()
1370
1372
}
1371
1373
return n , int (msg .Control .Len ), int (msg .Flags ), sa , err
1372
1374
}
@@ -1382,17 +1384,15 @@ func (fd *FD) ReadMsgInet4(p []byte, oob []byte, flags int, sa4 *syscall.Sockadd
1382
1384
p = p [:maxRW ]
1383
1385
}
1384
1386
1385
- rsa := wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
1386
- defer wsaRsaPool .Put (rsa )
1387
- msg := newWSAMsg (p , oob , flags , rsa )
1387
+ msg := newWSAMsg (p , oob , flags , true )
1388
1388
defer freeWSAMsg (msg )
1389
1389
n , err := fd .execIO (& fd .rop , func (o * operation ) (qty uint32 , err error ) {
1390
1390
err = windows .WSARecvMsg (fd .Sysfd , msg , & qty , & o .o , nil )
1391
1391
return qty , err
1392
1392
})
1393
1393
err = fd .eofError (n , err )
1394
1394
if err == nil {
1395
- rawToSockaddrInet4 (rsa , sa4 )
1395
+ rawToSockaddrInet4 (msg . Name , sa4 )
1396
1396
}
1397
1397
return n , int (msg .Control .Len ), int (msg .Flags ), err
1398
1398
}
@@ -1408,17 +1408,15 @@ func (fd *FD) ReadMsgInet6(p []byte, oob []byte, flags int, sa6 *syscall.Sockadd
1408
1408
p = p [:maxRW ]
1409
1409
}
1410
1410
1411
- rsa := wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
1412
- defer wsaRsaPool .Put (rsa )
1413
- msg := newWSAMsg (p , oob , flags , rsa )
1411
+ msg := newWSAMsg (p , oob , flags , true )
1414
1412
defer freeWSAMsg (msg )
1415
1413
n , err := fd .execIO (& fd .rop , func (o * operation ) (qty uint32 , err error ) {
1416
1414
err = windows .WSARecvMsg (fd .Sysfd , msg , & qty , & o .o , nil )
1417
1415
return qty , err
1418
1416
})
1419
1417
err = fd .eofError (n , err )
1420
1418
if err == nil {
1421
- rawToSockaddrInet6 (rsa , sa6 )
1419
+ rawToSockaddrInet6 (msg . Name , sa6 )
1422
1420
}
1423
1421
return n , int (msg .Control .Len ), int (msg .Flags ), err
1424
1422
}
@@ -1434,16 +1432,11 @@ func (fd *FD) WriteMsg(p []byte, oob []byte, sa syscall.Sockaddr) (int, int, err
1434
1432
}
1435
1433
defer fd .writeUnlock ()
1436
1434
1437
- var rsa * syscall.RawSockaddrAny
1438
- if sa != nil {
1439
- rsa = wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
1440
- defer wsaRsaPool .Put (rsa )
1441
- }
1442
- msg := newWSAMsg (p , oob , 0 , rsa )
1435
+ msg := newWSAMsg (p , oob , 0 , sa != nil )
1443
1436
defer freeWSAMsg (msg )
1444
1437
if sa != nil {
1445
1438
var err error
1446
- msg .Namelen , err = sockaddrToRaw (rsa , sa )
1439
+ msg .Namelen , err = sockaddrToRaw (msg . Name , sa )
1447
1440
if err != nil {
1448
1441
return 0 , 0 , err
1449
1442
}
@@ -1466,15 +1459,10 @@ func (fd *FD) WriteMsgInet4(p []byte, oob []byte, sa *syscall.SockaddrInet4) (in
1466
1459
}
1467
1460
defer fd .writeUnlock ()
1468
1461
1469
- var rsa * syscall.RawSockaddrAny
1470
- if sa != nil {
1471
- rsa = wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
1472
- defer wsaRsaPool .Put (rsa )
1473
- }
1474
- msg := newWSAMsg (p , oob , 0 , rsa )
1462
+ msg := newWSAMsg (p , oob , 0 , sa != nil )
1475
1463
defer freeWSAMsg (msg )
1476
1464
if sa != nil {
1477
- msg .Namelen = sockaddrInet4ToRaw (rsa , sa )
1465
+ msg .Namelen = sockaddrInet4ToRaw (msg . Name , sa )
1478
1466
}
1479
1467
n , err := fd .execIO (& fd .wop , func (o * operation ) (qty uint32 , err error ) {
1480
1468
err = windows .WSASendMsg (fd .Sysfd , msg , 0 , nil , & o .o , nil )
@@ -1494,15 +1482,10 @@ func (fd *FD) WriteMsgInet6(p []byte, oob []byte, sa *syscall.SockaddrInet6) (in
1494
1482
}
1495
1483
defer fd .writeUnlock ()
1496
1484
1497
- var rsa * syscall.RawSockaddrAny
1498
- if sa != nil {
1499
- rsa = wsaRsaPool .Get ().(* syscall.RawSockaddrAny )
1500
- defer wsaRsaPool .Put (rsa )
1501
- }
1502
- msg := newWSAMsg (p , oob , 0 , rsa )
1485
+ msg := newWSAMsg (p , oob , 0 , sa != nil )
1503
1486
defer freeWSAMsg (msg )
1504
1487
if sa != nil {
1505
- msg .Namelen = sockaddrInet6ToRaw (rsa , sa )
1488
+ msg .Namelen = sockaddrInet6ToRaw (msg . Name , sa )
1506
1489
}
1507
1490
n , err := fd .execIO (& fd .wop , func (o * operation ) (qty uint32 , err error ) {
1508
1491
err = windows .WSASendMsg (fd .Sysfd , msg , 0 , nil , & o .o , nil )
0 commit comments