mporsch / sockpuppet

C++ socket and address library

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Issues with TLS under write load

mporsch opened this issue · comments

See test failure in MSVC [1] and test failure in OSX [2].

  12: Test command: D:\a\sockpuppet\sockpuppet\build\Debug\sockpuppet_tls_buffered_test.exe
  12: Working Directory: D:/a/sockpuppet/sockpuppet/build
  12: Test timeout computed to be: 10000000
  12: generating random reference data
  12: test case #1: unlimited send timeout
  12: server listening at [::1]:8554
  12: client [::1]:61089 connected to server [::1]:8554
  12: sending reference data from [::1]:61089 to [::1]:8554
  12: verifying received against reference data
  12: test case #2: limited send timeout
  12: server listening at [::1]:8554
  12: client [::1]:61092 connected to server [::1]:8554
  12: sending reference data from [::1]:61092 to [::1]:8554
  12: failed to wait for TLS socket readable/writable: 6956:error:1409E10F:SSL routines:ssl3_write_bytes:bad length:ssl\record\rec_layer_s3.c:377:
  12: 
  12: verifying received against reference data
  12: received only 8166 of 1000000 bytes
  12: test case #3: non-blocking send
  12: server listening at [::1]:8554
  12: client [::1]:61093 connected to server [::1]:8554
  12: sending reference data from [::1]:61093 to [::1]:8554
  12: failed to wait for TLS socket readable/writable: 4156:error:1409E10F:SSL routines:ssl3_write_bytes:bad length:ssl\record\rec_layer_s3.c:377:
  12: 
  12: verifying received against reference data
  12: received only 9602 of 1000000 bytes
  12/14 Test #12: sockpuppet_tls_buffered_test ............***Failed    5.00 sec
14/14 Test #14: sockpuppet_tls_async_performance_test ...Subprocess aborted***Exception:  62.37 sec
generating random reference data
server listening at [::1]:8554
client [::1]:49191 connected to server
client [::1]:49191 connecting to server
sending reference data from [::1]:49191 to [::1]:8554
client [::1]:49192 connecting to server
sending reference data from [::1]:49192 to [::1]:8554
client [::1]:49193 connecting to server
sending reference data from [::1]:49193 to [::1]:8554
client [::1]:49192 connected to server
client [::1]:49193 connected to server
verifying received against reference data
client [::1]:49191 closing connection to server
client [::1]:49191 closed connection to server
verifying received against reference data
client [::1]:49192 closing connection to server
client [::1]:49192 closed connection to server
clients did not receive echoed reference data on time
Assertion failed: (i < handshakeStepsMax), function Shutdown, file socket_tls_impl.cpp, line 240.
client [::1]:49193 closed connection to server

Another one in OSX

12/14 Test #12: sockpuppet_tls_buffered_test ............***Failed    3.57 sec
generating random reference data
test case #1: unlimited send timeout
server listening at [::1]:8554
client [::1]:49184 connected to server [::1]:8554
sending reference data from [::1]:49184 to [::1]:8554
verifying received against reference data
test case #2: limited send timeout
server listening at [::1]:8554
client [::1]:49185 connected to server [::1]:8554
sending reference data from [::1]:49185 to [::1]:8554
failed to wait for TLS socket readable/writable: 0050E80300700000:error:0A00010F:SSL routines:ssl3_write_bytes:bad length:ssl/record/rec_layer_s3.c:370:

verifying received against reference data
received only 661894 of 1000000 bytes
test case #3: non-blocking send
server listening at [::1]:8554
client [::1]:49186 connected to server [::1]:8554
sending reference data from [::1]:49186 to [::1]:8554
failed to wait for TLS socket readable/writable: 0050E80300700000:error:0A00010F:SSL routines:ssl3_write_bytes:bad length:ssl/record/rec_layer_s3.c:370:

verifying received against reference data
received only 661062 of 1000000 bytes

More insights in verbose test failure in MSVC [1] and verbose test failure in OSX.

2023-07-23T10:28:33.5840040Z       Start 12: sockpuppet_tls_buffered_test
2023-07-23T10:28:37.1898040Z 12/14 Test #12: sockpuppet_tls_buffered_test ............***Failed    3.61 sec
...
2023-07-23T10:28:37.2056520Z 0x600000a38270 SSL_write(0x7f9e2f0c0d46) -> OK
2023-07-23T10:28:37.2056900Z 0x600000a38270 SSL_write(0x7f9e2f0c2946) -> 3 (init finished)
...
2023-07-23T10:28:37.2105260Z 0x600000a38270 SSL_write(0x7f9e2f0c2946) -> OK
...
2023-07-23T10:28:37.2362380Z 0x600000a382a0 SSL_write(0x7f9e2f0c66d5) -> 3 (init finished)
...

2023-07-23T10:28:37.2366770Z 0x600000a382a0 SSL_write(0x7f9e2f0c66d5) -> 1
...
2023-07-23T10:28:37.2367240Z 0x600000a382a0 SSL_shutdown -> 1
...

2023-07-23T10:28:37.2367770Z failed to wait for TLS socket readable/writable: 0010C80000700000:error:0A00010F:SSL routines:ssl3_write_bytes:bad length:ssl/record/rec_layer_s3.c:370:

SSL_ERROR_SSL (-> 1) failures occur after hitting SSL_ERROR_WANT_WRITE ( -> 3) from SSL_write even though the passed write buffer seems to the the same. Maybe the socket is still not writable (enough)?

After figuring out that the github actions used the host system's OpenSSL all the time, I got it to work with the self-build LibreSSL, which fails much less often.

Yet still: Test failure in OSX [1] and Test failure in MSVC [2]

[1]

11/14 Test #11: sockpuppet_tls_test .....................***Failed    2.18 sec
server listening at [::1]:8554
client client [::1]:49186client  connected to server [::1]:49187 connected to server [::1]:8554[::1]:8554

0x600000afc3900x600000af4090 SSL_read ->  SSL_read -> 2
[::1]:49188 connected to server [::1]:8554
0x600000af81b0 SSL_read -> 2
2
0x600000af4090 SSL_read -> 2
0x600000afc390 SSL_read -> 2
0x600000af81b0 SSL_read -> 2
0x600000afc6600x600000afc5d0 SSL_read ->  SSL_read -> 22

0x600000afc540 SSL_read -> 2
0x600000af4090 SSL_read -> 2
0x600000afc390 SSL_read -> 2
0x600000af81b0 SSL_read -> 2
server sending to client [::1]:49188
server sending to client 0x600000afc5d0 SSL_read -> [::1]:49186
0x600000afc660 SSL_write(0x10b3cfe30) -> 23

0x600000afc540 SSL_write(0x10b3cfe30) -> 3
server sending to client [::1]:49187
0x600000afc660 SSL_write(0x10b3cfe30) -> OK
0x600000afc540 SSL_write(0x10b3cfe30) -> OK
0x600000afc540 SSL_shutdown -> 2
0x600000afc660 SSL_shutdown -> 2
0x600000af81b0 SSL_read -> OK
0x600000af4090 SSL_read -> OK
client [::1]:49188 received from server
client [::1]:49186 received from server
0x600000af81b0 SSL_read -> 0x600000af4090 SSL_read -> TLS connection closed
TLS connection closed
0x600000afc540 SSL_shutdown -> OK
0x600000afc660 SSL_shutdown -> OK
0x600000afc390 SSL_shutdown -> 2
0x600000afc5d0 SSL_write(0x10b3cfe30) -> OK
0x600000afc5d0 SSL_shutdown -> OK
0x600000afc390 SSL_shutdown -> 0x600000afc390 SSL_shutdown -> OK
client failed to receive

[2]

        Start 11: sockpuppet_tls_test
  
  11: Test command: D:\a\sockpuppet\sockpuppet\build\Release\sockpuppet_tls_test.exe
  11: Working Directory: D:/a/sockpuppet/sockpuppet/build
  11: Test timeout computed to be: 10000000
  11: server listening at [::1]:8554
  11: client [::1]:60183 connected to server [::1]:8554
  11: client [::1]:60184 connected to server [::1]:8554
  11: 000002E9C780D110 SSL_read -> 2
  11: 000002E9C780CD10 SSL_read -> 2
  11: client [::1]:60185 connected to server [::1]:8554
  11: 000002E9C780C550 SSL_read -> 2
  11: 000002E9C780D110 SSL_read -> 2
  11: 000002E9C780CD10 SSL_read -> 2
  11: 000002E9C780CD10 SSL_read -> 2
  11: 000002E9C780CD10 SSL_read -> 2
  11: 000002E9C780D110 SSL_read -> 2
  11: 000002E9C780CD10 SSL_read -> 2
  11: 000002E9C780D110 SSL_read -> 2
  11: 000002E9C780D110 SSL_read -> 2
  11: 000002E9C780C550 SSL_read -> 2
  11: 000002E9C780C550 SSL_read -> 2
  11: 000002E9C780D110 SSL_read -> 2
  11: 000002E9C780D110 SSL_read -> 2
  11: 000002E9C780C650 SSL_read -> 2
  11: server sending to client [::1]:60183
  11: 000002E9C780C810 SSL_read -> 2
  11: server sending to client [::1]:60184
  11: 000002E9C780C810 SSL_write(00007FF738D9445C) -> 2
  000002E9C780CD10 SSL_read -> 2
  000002E9C780C810 SSL_write(00007FF738D9445C) -> 3
  000002E9C780C810 SSL_write(00007FF738D9445C) -> OK
  000002E9C780CD10 SSL_read -> OK
  client [::1]:60184 received from server
  000002E9C780C810 SSL_shutdown -> 2
  000002E9C780CD10 SSL_read -> TLS connection closed
  000002E9C780C810 SSL_shutdown -> OK
  000002E9C780CBD0 SSL_read -> 2
  server sending to client [::1]:60185
  000002E9C780CBD0 SSL_write(00007FF738D9445C) -> 2
  000002E9C780C550 SSL_read -> 2
  000002E9C780CBD0 SSL_write(00007FF738D9445C) -> 3
  000002E9C780CBD0 SSL_write(00007FF738D9445C) -> OK
  000002E9C780CBD0 SSL_shutdown -> 2
  000002E9C780C550 SSL_read -> OK
  client [::1]:60185 received from server
  000002E9C780C550 SSL_read -> TLS connection closed
  000002E9C780CBD0 SSL_shutdown -> OK
  000002E9C780D110 SSL_shutdown -> 2
  000002E9C780C650 SSL_write(00007FF738D9445C) -> OK
  000002E9C780D110 SSL_shutdown -> 000002E9C780D110 SSL_shutdown -> 2
  000002E9C780C650 SSL_shutdown -> OK
  000002E9C780D110 SSL_shutdown -> OK
  client failed to receive

The issue

clients did not receive echoed reference data on time
Assertion failed: (i < handshakeStepsMax), function Shutdown, file socket_tls_impl.cpp, line 262.

seen in OSX remains unsolved by #4 and will be tracked in #5.

Also generally, OpenSSL remains a big stretch on the general library interface (e.g. non-zero receive).