@@ -135,18 +135,13 @@ impl Http1Transaction for Server {
135
135
let len;
136
136
let headers_len;
137
137
138
- // Unsafe: both headers_indices and headers are using uninitialized memory,
138
+ // Both headers_indices and headers are using uninitialized memory,
139
139
// but we *never* read any of it until after httparse has assigned
140
140
// values into it. By not zeroing out the stack memory, this saves
141
141
// a good ~5% on pipeline benchmarks.
142
- let mut headers_indices: [ MaybeUninit < HeaderIndices > ; MAX_HEADERS ] = unsafe {
143
- // SAFETY: We can go safely from MaybeUninit array to array of MaybeUninit
144
- MaybeUninit :: uninit ( ) . assume_init ( )
145
- } ;
142
+ let mut headers_indices = [ MaybeUninit :: < HeaderIndices > :: uninit ( ) ; MAX_HEADERS ] ;
146
143
{
147
- /* SAFETY: it is safe to go from MaybeUninit array to array of MaybeUninit */
148
- let mut headers: [ MaybeUninit < httparse:: Header < ' _ > > ; MAX_HEADERS ] =
149
- unsafe { MaybeUninit :: uninit ( ) . assume_init ( ) } ;
144
+ let mut headers = [ MaybeUninit :: < httparse:: Header < ' _ > > :: uninit ( ) ; MAX_HEADERS ] ;
150
145
trace ! ( bytes = buf. len( ) , "Request.parse" ) ;
151
146
let mut req = httparse:: Request :: new ( & mut [ ] ) ;
152
147
let bytes = buf. as_ref ( ) ;
@@ -230,7 +225,7 @@ impl Http1Transaction for Server {
230
225
231
226
for header in & headers_indices[ ..headers_len] {
232
227
// SAFETY: array is valid up to `headers_len`
233
- let header = unsafe { & * header. as_ptr ( ) } ;
228
+ let header = unsafe { header. assume_init_ref ( ) } ;
234
229
let name = header_name ! ( & slice[ header. name. 0 ..header. name. 1 ] ) ;
235
230
let value = header_value ! ( slice. slice( header. value. 0 ..header. value. 1 ) ) ;
236
231
@@ -936,15 +931,9 @@ impl Http1Transaction for Client {
936
931
937
932
// Loop to skip information status code headers (100 Continue, etc).
938
933
loop {
939
- // Unsafe: see comment in Server Http1Transaction, above.
940
- let mut headers_indices: [ MaybeUninit < HeaderIndices > ; MAX_HEADERS ] = unsafe {
941
- // SAFETY: We can go safely from MaybeUninit array to array of MaybeUninit
942
- MaybeUninit :: uninit ( ) . assume_init ( )
943
- } ;
934
+ let mut headers_indices = [ MaybeUninit :: < HeaderIndices > :: uninit ( ) ; MAX_HEADERS ] ;
944
935
let ( len, status, reason, version, headers_len) = {
945
- // SAFETY: We can go safely from MaybeUninit array to array of MaybeUninit
946
- let mut headers: [ MaybeUninit < httparse:: Header < ' _ > > ; MAX_HEADERS ] =
947
- unsafe { MaybeUninit :: uninit ( ) . assume_init ( ) } ;
936
+ let mut headers = [ MaybeUninit :: < httparse:: Header < ' _ > > :: uninit ( ) ; MAX_HEADERS ] ;
948
937
trace ! ( bytes = buf. len( ) , "Response.parse" ) ;
949
938
let mut res = httparse:: Response :: new ( & mut [ ] ) ;
950
939
let bytes = buf. as_ref ( ) ;
@@ -994,7 +983,7 @@ impl Http1Transaction for Client {
994
983
{
995
984
for header in & mut headers_indices[ ..headers_len] {
996
985
// SAFETY: array is valid up to `headers_len`
997
- let header = unsafe { & mut * header. as_mut_ptr ( ) } ;
986
+ let header = unsafe { header. assume_init_mut ( ) } ;
998
987
Client :: obs_fold_line ( & mut slice, header) ;
999
988
}
1000
989
}
@@ -1021,7 +1010,7 @@ impl Http1Transaction for Client {
1021
1010
headers. reserve ( headers_len) ;
1022
1011
for header in & headers_indices[ ..headers_len] {
1023
1012
// SAFETY: array is valid up to `headers_len`
1024
- let header = unsafe { & * header. as_ptr ( ) } ;
1013
+ let header = unsafe { header. assume_init_ref ( ) } ;
1025
1014
let name = header_name ! ( & slice[ header. name. 0 ..header. name. 1 ] ) ;
1026
1015
let value = header_value ! ( slice. slice( header. value. 0 ..header. value. 1 ) ) ;
1027
1016
@@ -1455,16 +1444,10 @@ fn record_header_indices(
1455
1444
let value_start = header. value . as_ptr ( ) as usize - bytes_ptr;
1456
1445
let value_end = value_start + header. value . len ( ) ;
1457
1446
1458
- // FIXME(maybe_uninit_extra)
1459
- // FIXME(addr_of)
1460
- // Currently we don't have `ptr::addr_of_mut` in stable rust or
1461
- // MaybeUninit::write, so this is some way of assigning into a MaybeUninit
1462
- // safely
1463
- let new_header_indices = HeaderIndices {
1447
+ indices. write ( HeaderIndices {
1464
1448
name : ( name_start, name_end) ,
1465
1449
value : ( value_start, value_end) ,
1466
- } ;
1467
- * indices = MaybeUninit :: new ( new_header_indices) ;
1450
+ } ) ;
1468
1451
}
1469
1452
1470
1453
Ok ( ( ) )
0 commit comments