aws-crt 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/VERSION +1 -1
- data/aws-crt-ffi/CMakeLists.txt +49 -41
- data/aws-crt-ffi/crt/aws-c-auth/CMakeLists.txt +0 -10
- data/aws-crt-ffi/crt/aws-c-auth/include/aws/auth/credentials.h +3 -2
- data/aws-crt-ffi/crt/aws-c-auth/include/aws/auth/private/credentials_utils.h +4 -4
- data/aws-crt-ffi/crt/aws-c-auth/source/auth.c +1 -14
- data/aws-crt-ffi/crt/aws-c-auth/source/aws_imds_client.c +206 -68
- data/aws-crt-ffi/crt/aws-c-auth/source/aws_signing.c +5 -0
- data/aws-crt-ffi/crt/aws-c-auth/source/credentials_provider_cached.c +6 -6
- data/aws-crt-ffi/crt/aws-c-auth/source/credentials_provider_default_chain.c +16 -1
- data/aws-crt-ffi/crt/aws-c-auth/source/credentials_provider_ecs.c +0 -1
- data/aws-crt-ffi/crt/aws-c-auth/source/credentials_provider_process.c +0 -1
- data/aws-crt-ffi/crt/aws-c-auth/source/credentials_provider_sts_web_identity.c +0 -1
- data/aws-crt-ffi/crt/aws-c-auth/source/credentials_provider_x509.c +10 -7
- data/aws-crt-ffi/crt/aws-c-auth/source/credentials_utils.c +35 -26
- data/aws-crt-ffi/crt/aws-c-auth/source/signable_chunk.c +3 -2
- data/aws-crt-ffi/crt/aws-c-auth/tests/CMakeLists.txt +3 -2
- data/aws-crt-ffi/crt/aws-c-auth/tests/aws_imds_client_test.c +1 -0
- data/aws-crt-ffi/crt/aws-c-auth/tests/credentials_provider_ecs_tests.c +3 -0
- data/aws-crt-ffi/crt/aws-c-auth/tests/credentials_provider_process_tests.c +65 -16
- data/aws-crt-ffi/crt/aws-c-auth/tests/credentials_tests.c +125 -0
- data/aws-crt-ffi/crt/aws-c-auth/tests/sigv4_signing_tests.c +68 -46
- data/aws-crt-ffi/crt/aws-c-cal/CMakeLists.txt +8 -3
- data/aws-crt-ffi/crt/aws-c-cal/bin/run_x_platform_fuzz_corpus/main.c +9 -0
- data/aws-crt-ffi/crt/aws-c-cal/builder.json +11 -3
- data/aws-crt-ffi/crt/aws-c-cal/cmake/aws-c-cal-config.cmake +14 -5
- data/aws-crt-ffi/crt/aws-c-cal/source/darwin/securityframework_ecc.c +6 -6
- data/aws-crt-ffi/crt/aws-c-cal/source/windows/bcrypt_ecc.c +12 -12
- data/aws-crt-ffi/crt/aws-c-cal/tests/test_case_helper.h +14 -14
- data/aws-crt-ffi/crt/aws-c-common/CMakeLists.txt +21 -1
- data/aws-crt-ffi/crt/aws-c-common/README.md +8 -0
- data/aws-crt-ffi/crt/aws-c-common/cmake/AwsCFlags.cmake +20 -5
- data/aws-crt-ffi/crt/aws-c-common/cmake/AwsFeatureTests.cmake +7 -1
- data/aws-crt-ffi/crt/aws-c-common/format-check.sh +1 -1
- data/aws-crt-ffi/crt/aws-c-common/include/aws/common/byte_buf.h +14 -0
- data/aws-crt-ffi/crt/aws-c-common/include/aws/common/config.h.in +1 -0
- data/aws-crt-ffi/crt/{aws-c-auth/include/aws/auth → aws-c-common/include/aws/common}/external/cJSON.h +82 -74
- data/aws-crt-ffi/crt/aws-c-common/include/aws/common/json.h +335 -0
- data/aws-crt-ffi/crt/aws-c-common/include/aws/common/logging.h +1 -0
- data/aws-crt-ffi/crt/aws-c-common/include/aws/common/math.inl +2 -2
- data/aws-crt-ffi/crt/aws-c-common/include/aws/common/private/json_impl.h +22 -0
- data/aws-crt-ffi/crt/aws-c-common/include/aws/testing/aws_test_harness.h +2 -0
- data/aws-crt-ffi/crt/aws-c-common/source/byte_buf.c +36 -0
- data/aws-crt-ffi/crt/aws-c-common/source/common.c +5 -2
- data/aws-crt-ffi/crt/aws-c-common/source/external/cJSON.c +3113 -0
- data/aws-crt-ffi/crt/aws-c-common/source/file.c +9 -0
- data/aws-crt-ffi/crt/aws-c-common/source/json.c +348 -0
- data/aws-crt-ffi/crt/aws-c-common/source/logging.c +7 -2
- data/aws-crt-ffi/crt/aws-c-common/source/posix/system_info.c +8 -0
- data/aws-crt-ffi/crt/aws-c-common/source/ref_count.c +3 -1
- data/aws-crt-ffi/crt/aws-c-common/source/windows/file.c +47 -0
- data/aws-crt-ffi/crt/aws-c-common/source/windows/system_info.c +2 -1
- data/aws-crt-ffi/crt/aws-c-common/tests/CMakeLists.txt +5 -0
- data/aws-crt-ffi/crt/aws-c-common/tests/byte_buf_test.c +69 -0
- data/aws-crt-ffi/crt/aws-c-common/tests/json_test.c +134 -0
- data/aws-crt-ffi/crt/aws-c-common/tests/memtrace_test.c +6 -2
- data/aws-crt-ffi/crt/aws-c-event-stream/README.md +18 -35
- data/aws-crt-ffi/crt/aws-c-event-stream/include/aws/event-stream/event_stream.h +21 -2
- data/aws-crt-ffi/crt/aws-c-event-stream/include/aws/event-stream/event_stream_rpc_client.h +14 -2
- data/aws-crt-ffi/crt/aws-c-event-stream/include/aws/event-stream/event_stream_rpc_server.h +13 -0
- data/aws-crt-ffi/crt/aws-c-event-stream/include/aws/event-stream/private/event_stream_rpc_priv.h +7 -7
- data/aws-crt-ffi/crt/aws-c-event-stream/source/event_stream.c +257 -141
- data/aws-crt-ffi/crt/aws-c-event-stream/source/event_stream_channel_handler.c +1 -1
- data/aws-crt-ffi/crt/aws-c-event-stream/source/event_stream_rpc_client.c +31 -8
- data/aws-crt-ffi/crt/aws-c-event-stream/source/event_stream_rpc_server.c +63 -10
- data/aws-crt-ffi/crt/aws-c-event-stream/tests/CMakeLists.txt +2 -0
- data/aws-crt-ffi/crt/aws-c-event-stream/tests/event_stream_rpc_client_connection_test.c +157 -106
- data/aws-crt-ffi/crt/aws-c-event-stream/tests/event_stream_rpc_server_connection_test.c +168 -1
- data/aws-crt-ffi/crt/aws-c-event-stream/tests/message_deserializer_test.c +4 -2
- data/aws-crt-ffi/crt/aws-c-http/CMakeLists.txt +1 -0
- data/aws-crt-ffi/crt/aws-c-http/README.md +8 -0
- data/aws-crt-ffi/crt/aws-c-http/bin/elasticurl/main.c +1 -1
- data/aws-crt-ffi/crt/aws-c-http/builder.json +4 -3
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/connection.h +8 -1
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/connection_manager.h +45 -1
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/http2_stream_manager.h +63 -12
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/connection_impl.h +2 -1
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/h2_connection.h +20 -2
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/h2_frames.h +1 -0
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/h2_stream.h +42 -13
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/http2_stream_manager_impl.h +17 -0
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/http_impl.h +3 -0
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/random_access_set.h +10 -3
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/private/request_response_impl.h +3 -17
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/request_response.h +108 -4
- data/aws-crt-ffi/crt/aws-c-http/include/aws/http/statistics.h +22 -0
- data/aws-crt-ffi/crt/aws-c-http/source/connection.c +8 -3
- data/aws-crt-ffi/crt/aws-c-http/source/connection_manager.c +22 -3
- data/aws-crt-ffi/crt/aws-c-http/source/connection_monitor.c +32 -14
- data/aws-crt-ffi/crt/aws-c-http/source/h1_connection.c +14 -0
- data/aws-crt-ffi/crt/aws-c-http/source/h1_encoder.c +7 -4
- data/aws-crt-ffi/crt/aws-c-http/source/h2_connection.c +161 -45
- data/aws-crt-ffi/crt/aws-c-http/source/h2_decoder.c +37 -8
- data/aws-crt-ffi/crt/aws-c-http/source/h2_frames.c +13 -1
- data/aws-crt-ffi/crt/aws-c-http/source/h2_stream.c +345 -87
- data/aws-crt-ffi/crt/aws-c-http/source/hpack.c +3 -0
- data/aws-crt-ffi/crt/aws-c-http/source/http.c +3 -0
- data/aws-crt-ffi/crt/aws-c-http/source/http2_stream_manager.c +266 -39
- data/aws-crt-ffi/crt/aws-c-http/source/random_access_set.c +9 -3
- data/aws-crt-ffi/crt/aws-c-http/source/request_response.c +80 -20
- data/aws-crt-ffi/crt/aws-c-http/source/statistics.c +11 -0
- data/aws-crt-ffi/crt/aws-c-http/tests/CMakeLists.txt +28 -1
- data/aws-crt-ffi/crt/aws-c-http/tests/fuzz/fuzz_h2_decoder_correct.c +5 -3
- data/aws-crt-ffi/crt/aws-c-http/tests/h2_test_helper.c +133 -29
- data/aws-crt-ffi/crt/aws-c-http/tests/h2_test_helper.h +6 -0
- data/aws-crt-ffi/crt/aws-c-http/tests/py_localhost/README.md +40 -0
- data/aws-crt-ffi/crt/aws-c-http/tests/py_localhost/non_tls_server.py +56 -0
- data/aws-crt-ffi/crt/aws-c-http/tests/py_localhost/server.py +329 -0
- data/aws-crt-ffi/crt/aws-c-http/tests/test_connection_manager.c +1 -1
- data/aws-crt-ffi/crt/aws-c-http/tests/test_connection_monitor.c +2 -2
- data/aws-crt-ffi/crt/aws-c-http/tests/test_h1_client.c +47 -34
- data/aws-crt-ffi/crt/aws-c-http/tests/test_h1_encoder.c +4 -4
- data/aws-crt-ffi/crt/aws-c-http/tests/test_h1_server.c +15 -12
- data/aws-crt-ffi/crt/aws-c-http/tests/test_h2_client.c +582 -25
- data/aws-crt-ffi/crt/aws-c-http/tests/test_h2_encoder.c +3 -3
- data/aws-crt-ffi/crt/aws-c-http/tests/test_localhost_integ.c +530 -0
- data/aws-crt-ffi/crt/aws-c-http/tests/test_stream_manager.c +459 -67
- data/aws-crt-ffi/crt/aws-c-io/CMakeLists.txt +4 -0
- data/aws-crt-ffi/crt/aws-c-io/builder.json +3 -2
- data/aws-crt-ffi/crt/aws-c-io/include/aws/io/channel.h +21 -0
- data/aws-crt-ffi/crt/aws-c-io/include/aws/io/io.h +3 -0
- data/aws-crt-ffi/crt/aws-c-io/include/aws/io/socket.h +6 -0
- data/aws-crt-ffi/crt/aws-c-io/include/aws/io/stream.h +35 -5
- data/aws-crt-ffi/crt/aws-c-io/include/aws/io/tls_channel_handler.h +211 -15
- data/aws-crt-ffi/crt/aws-c-io/source/channel.c +56 -30
- data/aws-crt-ffi/crt/aws-c-io/source/darwin/secure_transport_tls_channel_handler.c +0 -24
- data/aws-crt-ffi/crt/aws-c-io/source/io.c +9 -0
- data/aws-crt-ffi/crt/aws-c-io/source/{pkcs11.c → pkcs11_lib.c} +162 -22
- data/aws-crt-ffi/crt/aws-c-io/source/pkcs11_private.h +18 -20
- data/aws-crt-ffi/crt/aws-c-io/source/pkcs11_tls_op_handler.c +221 -0
- data/aws-crt-ffi/crt/aws-c-io/source/posix/socket.c +135 -81
- data/aws-crt-ffi/crt/aws-c-io/source/retry_strategy.c +12 -8
- data/aws-crt-ffi/crt/aws-c-io/source/s2n/s2n_tls_channel_handler.c +252 -215
- data/aws-crt-ffi/crt/aws-c-io/source/stream.c +65 -82
- data/aws-crt-ffi/crt/aws-c-io/source/tls_channel_handler.c +188 -57
- data/aws-crt-ffi/crt/aws-c-io/source/windows/iocp/socket.c +271 -256
- data/aws-crt-ffi/crt/aws-c-io/tests/CMakeLists.txt +21 -12
- data/aws-crt-ffi/crt/aws-c-io/tests/channel_test.c +32 -4
- data/aws-crt-ffi/crt/aws-c-io/tests/io_lib_test.c +37 -0
- data/aws-crt-ffi/crt/aws-c-io/tests/pkcs11_test.c +412 -93
- data/aws-crt-ffi/crt/aws-c-io/tests/resources/ec_unittests.crt +15 -0
- data/aws-crt-ffi/crt/aws-c-io/tests/resources/ec_unittests.key +5 -0
- data/aws-crt-ffi/crt/aws-c-io/tests/resources/ec_unittests.p12 +0 -0
- data/aws-crt-ffi/crt/aws-c-io/tests/resources/ec_unittests.p8 +5 -0
- data/aws-crt-ffi/crt/aws-c-io/tests/resources/generateCerts.sh +24 -15
- data/aws-crt-ffi/crt/aws-c-io/tests/socket_test.c +72 -1
- data/aws-crt-ffi/crt/s2n/CMakeLists.txt +6 -1
- data/aws-crt-ffi/crt/s2n/bindings/rust/Cargo.toml +1 -0
- data/aws-crt-ffi/crt/s2n/bindings/rust/generate/src/main.rs +105 -82
- data/aws-crt-ffi/crt/s2n/bindings/rust/generate.sh +1 -0
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls/Cargo.toml +2 -2
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls/src/raw/config.rs +1 -1
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-sys/Cargo.toml +1 -1
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-sys/build.rs +84 -30
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-sys/src/lib.rs +4 -0
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-tokio/Cargo.toml +21 -0
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-tokio/examples/certs/cert.pem +14 -0
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-tokio/examples/certs/key.pem +8 -0
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-tokio/examples/client.rs +45 -0
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-tokio/examples/server.rs +60 -0
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-tokio/src/lib.rs +150 -0
- data/aws-crt-ffi/crt/s2n/bindings/rust/s2n-tls-tokio/tests/handshake.rs +51 -0
- data/aws-crt-ffi/crt/s2n/crypto/s2n_drbg.c +98 -77
- data/aws-crt-ffi/crt/s2n/crypto/s2n_drbg.h +10 -7
- data/aws-crt-ffi/crt/s2n/crypto/s2n_openssl.h +2 -0
- data/aws-crt-ffi/crt/s2n/error/s2n_errno.c +1 -1
- data/aws-crt-ffi/crt/s2n/error/s2n_errno.h +1 -0
- data/aws-crt-ffi/crt/s2n/s2n.mk +7 -0
- data/aws-crt-ffi/crt/s2n/tests/cbmc/templates/scripts/repository.py +233 -0
- data/aws-crt-ffi/crt/s2n/tests/cbmc/templates/scripts/setup-proof.py +8 -7
- data/aws-crt-ffi/crt/s2n/tests/cbmc/templates/scripts/setup.py +17 -18
- data/aws-crt-ffi/crt/s2n/tests/cbmc/templates/scripts/util.py +41 -23
- data/aws-crt-ffi/crt/s2n/tests/fuzz/LD_PRELOAD/global_overrides.c +3 -3
- data/aws-crt-ffi/crt/s2n/tests/integration/s2n_client_endpoint_handshake_test.py +2 -2
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/Makefile +13 -42
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/README.md +6 -1
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/common.py +118 -53
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/configuration.py +108 -88
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/conftest.py +6 -3
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/constants.py +6 -4
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/fixtures.py +21 -12
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/global_flags.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/processes.py +62 -19
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/providers.py +304 -48
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_client_authentication.py +20 -11
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_cross_compatibility.py +41 -17
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_dynamic_record_sizes.py +6 -3
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_early_data.py +105 -48
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_external_psk.py +160 -76
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_fragmentation.py +59 -26
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_happy_path.py +42 -28
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_hello_retry_requests.py +33 -13
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_key_update.py +29 -11
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_ocsp.py +138 -0
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_pq_handshake.py +103 -36
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_session_resumption.py +52 -25
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_signature_algorithms.py +47 -21
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_sni_match.py +13 -9
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_sslyze.py +88 -17
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_version_negotiation.py +71 -22
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/test_well_known_endpoints.py +4 -3
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/tox.ini +1 -0
- data/aws-crt-ffi/crt/s2n/tests/integrationv2/utils.py +50 -15
- data/aws-crt-ffi/crt/s2n/tests/litani/CHANGELOG +131 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/CONTRIBUTING.md +16 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/README.md +36 -14
- data/aws-crt-ffi/crt/s2n/tests/litani/THIRD-PARTY +205 -41
- data/aws-crt-ffi/crt/s2n/tests/litani/doc/bin/build-html-doc +7 -7
- data/aws-crt-ffi/crt/s2n/tests/litani/doc/configure +27 -23
- data/aws-crt-ffi/crt/s2n/tests/litani/doc/src/man/litani-add-job.scdoc +7 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/doc/src/man/litani-dump-run.scdoc +7 -5
- data/aws-crt-ffi/crt/s2n/tests/litani/doc/src/man/litani-transform-jobs.scdoc +248 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/doc/src/man/litani.scdoc +2 -2
- data/aws-crt-ffi/crt/s2n/tests/litani/doc/templates/index.jinja.html +4 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/add-root-node/README +12 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/add-root-node/original-run.sh +52 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/add-root-node/run-all.py +71 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/no-standalone-transform/README +13 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/no-standalone-transform/run-1.sh +34 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/no-standalone-transform/run-2.sh +35 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/no-standalone-transform/run-3.sh +34 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/no-standalone-transform/run-all.py +60 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/README.md +10 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/assumptions.html +42 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/file.dat +7 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/histogram.dat +7 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/run-1.sh +41 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/run-2.sh +47 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/run-3.sh +41 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/run-all.py +34 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/scripts/fib-table.py +40 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/scripts/fib.plt +5 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/scripts/fib.py +32 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/scripts/sin-output.py +40 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/scripts/sin.plt +5 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/scripts/sin.py +30 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/templates/fib-table.jinja.html +45 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/examples/rich-output/templates/sin-output.jinja.html +30 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/lib/add_job.py +55 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/lib/graph.py +2 -2
- data/aws-crt-ffi/crt/s2n/tests/litani/lib/litani.py +6 -1
- data/aws-crt-ffi/crt/s2n/tests/litani/lib/litani_report.py +18 -21
- data/aws-crt-ffi/crt/s2n/tests/litani/lib/ninja.py +2 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/lib/run_printer.py +26 -7
- data/aws-crt-ffi/crt/s2n/tests/litani/lib/transform_jobs.py +84 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/litani +28 -33
- data/aws-crt-ffi/crt/s2n/tests/litani/script/release +220 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/templates/dashboard.jinja.html +78 -15
- data/aws-crt-ffi/crt/s2n/tests/litani/templates/pipeline.jinja.html +21 -5
- data/aws-crt-ffi/crt/s2n/tests/litani/test/README +15 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/run +56 -33
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/custom_stages.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/cwd.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/dump_run.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/graph_line_break.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/html_node.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/job_id_env.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/multiproc_dump_run.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/no_pool_serialize.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/no_pool_serialize_graph.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/no_timed_out.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/no_timed_out_timeout_ignored.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/no_timed_out_timeout_ok.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/pipeline_order.py +53 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/pool_serialize.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/pool_serialize_graph.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/single_pool.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/timed_out.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/timed_out_subprocess.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/timed_out_subprocess_multi_shell.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/timed_out_subprocess_shell.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/timed_out_timeout_ignored.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/timed_out_timeout_ok.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/transform_delete_job.py +54 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/transform_modify_job.py +46 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/transform_no_change_job.py +44 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/e2e/tests/zero_pool.py +1 -0
- data/aws-crt-ffi/crt/s2n/tests/litani/test/run +82 -12
- data/aws-crt-ffi/crt/s2n/tests/s2n_test.h +58 -33
- data/aws-crt-ffi/crt/s2n/tests/testlib/s2n_key_schedule_testlib.c +18 -6
- data/aws-crt-ffi/crt/s2n/tests/testlib/s2n_pq_kat_test_utils.c +4 -4
- data/aws-crt-ffi/crt/s2n/tests/testlib/s2n_testlib.h +2 -0
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_client_hello_retry_test.c +66 -2
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_connection_test.c +1 -1
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_drbg_test.c +34 -14
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_fork_generation_number_test.c +28 -5
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_mem_usage_test.c +6 -0
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_override_openssl_random_test.c +1 -1
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_random_test.c +60 -41
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_self_talk_broken_pipe_test.c +2 -2
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_tls13_handshake_early_data_test.c +3 -1
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_tls13_hybrid_shared_secret_test.c +9 -1
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_tls13_key_schedule_rfc8448_test.c +31 -130
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_tls13_key_schedule_test.c +2 -4
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_tls13_pq_handshake_test.c +11 -6
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_tls13_secrets_rfc8448_test.c +19 -21
- data/aws-crt-ffi/crt/s2n/tests/unit/s2n_tls13_secrets_test.c +109 -60
- data/aws-crt-ffi/crt/s2n/tls/s2n_config.c +1 -0
- data/aws-crt-ffi/crt/s2n/tls/s2n_config.h +1 -1
- data/aws-crt-ffi/crt/s2n/tls/s2n_connection.c +29 -24
- data/aws-crt-ffi/crt/s2n/tls/s2n_connection.h +5 -5
- data/aws-crt-ffi/crt/s2n/tls/s2n_handshake_hashes.h +1 -7
- data/aws-crt-ffi/crt/s2n/tls/s2n_handshake_io.c +2 -0
- data/aws-crt-ffi/crt/s2n/tls/s2n_handshake_transcript.c +0 -44
- data/aws-crt-ffi/crt/s2n/tls/s2n_internal.h +0 -1
- data/aws-crt-ffi/crt/s2n/tls/s2n_quic_support.h +1 -1
- data/aws-crt-ffi/crt/s2n/tls/s2n_tls13_key_schedule.c +1 -2
- data/aws-crt-ffi/crt/s2n/tls/s2n_tls13_secrets.c +84 -44
- data/aws-crt-ffi/crt/s2n/tls/s2n_tls13_secrets.h +3 -9
- data/aws-crt-ffi/crt/s2n/utils/s2n_blob.h +15 -8
- data/aws-crt-ffi/crt/s2n/utils/s2n_fork_detection.c +2 -6
- data/aws-crt-ffi/crt/s2n/utils/s2n_random.c +9 -9
- data/aws-crt-ffi/src/input_stream.c +32 -15
- data/ext/compile.rb +13 -5
- data/lib/aws-crt/platforms.rb +14 -5
- data/lib/aws-crt/string_blob.rb +3 -3
- metadata +61 -7
- data/aws-crt-ffi/crt/aws-c-auth/source/external/cJSON.c +0 -2987
- data/aws-crt-ffi/crt/aws-c-auth/tests/external/cJSON.c +0 -2986
- data/aws-crt-ffi/crt/aws-c-io/tests/error_test.c +0 -20
@@ -306,6 +306,12 @@ struct iocp_socket {
|
|
306
306
|
|
307
307
|
static int s_create_socket(struct aws_socket *sock, const struct aws_socket_options *options) {
|
308
308
|
SOCKET handle = socket(s_convert_domain(options->domain), s_convert_type(options->type), 0);
|
309
|
+
if (handle == INVALID_SOCKET) {
|
310
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
311
|
+
AWS_LOGF_ERROR(AWS_LS_IO_SOCKET, "id=static: socket() call failed with WSAError %d", wsa_err);
|
312
|
+
return aws_raise_error(s_determine_socket_error(wsa_err));
|
313
|
+
}
|
314
|
+
|
309
315
|
AWS_LOGF_DEBUG(
|
310
316
|
AWS_LS_IO_SOCKET,
|
311
317
|
"id=%p handle=%p: initializing with domain %d and type %d",
|
@@ -314,20 +320,24 @@ static int s_create_socket(struct aws_socket *sock, const struct aws_socket_opti
|
|
314
320
|
options->domain,
|
315
321
|
options->type);
|
316
322
|
u_long non_blocking = 1;
|
317
|
-
if (
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
sock->io_handle.data.handle = (HANDLE)INVALID_SOCKET;
|
323
|
-
return AWS_OP_ERR;
|
324
|
-
}
|
325
|
-
return AWS_OP_SUCCESS;
|
323
|
+
if (ioctlsocket(handle, FIONBIO, &non_blocking) != 0) {
|
324
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
325
|
+
AWS_LOGF_ERROR(AWS_LS_IO_SOCKET, "id=static: ioctlsocket() call failed with WSAError %d", wsa_err);
|
326
|
+
aws_raise_error(s_determine_socket_error(wsa_err));
|
327
|
+
goto error;
|
326
328
|
}
|
327
329
|
|
328
|
-
|
329
|
-
|
330
|
-
|
330
|
+
sock->io_handle.data.handle = (HANDLE)handle;
|
331
|
+
sock->io_handle.additional_data = NULL;
|
332
|
+
if (aws_socket_set_options(sock, options)) {
|
333
|
+
goto error;
|
334
|
+
}
|
335
|
+
return AWS_OP_SUCCESS;
|
336
|
+
|
337
|
+
error:
|
338
|
+
closesocket(handle);
|
339
|
+
sock->io_handle.data.handle = (HANDLE)INVALID_SOCKET;
|
340
|
+
return AWS_OP_ERR;
|
331
341
|
}
|
332
342
|
|
333
343
|
static int s_socket_init(
|
@@ -449,6 +459,76 @@ int aws_socket_bind(struct aws_socket *socket, const struct aws_socket_endpoint
|
|
449
459
|
return socket_impl->vtable->bind(socket, local_endpoint);
|
450
460
|
}
|
451
461
|
|
462
|
+
int aws_socket_get_bound_address(const struct aws_socket *socket, struct aws_socket_endpoint *out_address) {
|
463
|
+
if (socket->local_endpoint.address[0] == 0) {
|
464
|
+
AWS_LOGF_ERROR(
|
465
|
+
AWS_LS_IO_SOCKET,
|
466
|
+
"id=%p fd=%d: Socket has no local address. Socket must be bound first.",
|
467
|
+
(void *)socket,
|
468
|
+
socket->io_handle.data.fd);
|
469
|
+
return aws_raise_error(AWS_IO_SOCKET_ILLEGAL_OPERATION_FOR_STATE);
|
470
|
+
}
|
471
|
+
*out_address = socket->local_endpoint;
|
472
|
+
return AWS_OP_SUCCESS;
|
473
|
+
}
|
474
|
+
|
475
|
+
/* Update IPV4 or IPV6 socket->local_endpoint based on the results of getsockname() */
|
476
|
+
static int s_update_local_endpoint_ipv4_ipv6(struct aws_socket *socket) {
|
477
|
+
struct aws_socket_endpoint tmp_endpoint;
|
478
|
+
AWS_ZERO_STRUCT(tmp_endpoint);
|
479
|
+
|
480
|
+
struct sockaddr_storage address;
|
481
|
+
AWS_ZERO_STRUCT(address);
|
482
|
+
socklen_t address_size = sizeof(address);
|
483
|
+
if (getsockname((SOCKET)socket->io_handle.data.handle, (struct sockaddr *)&address, &address_size) != 0) {
|
484
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
485
|
+
AWS_LOGF_ERROR(
|
486
|
+
AWS_LS_IO_SOCKET,
|
487
|
+
"id=%p handle=%p: getsockname() failed with error %d",
|
488
|
+
(void *)socket,
|
489
|
+
(void *)socket->io_handle.data.handle,
|
490
|
+
wsa_err);
|
491
|
+
return aws_raise_error(s_determine_socket_error(wsa_err));
|
492
|
+
}
|
493
|
+
|
494
|
+
if (address.ss_family == AF_INET) {
|
495
|
+
struct sockaddr_in *s = (struct sockaddr_in *)&address;
|
496
|
+
tmp_endpoint.port = ntohs(s->sin_port);
|
497
|
+
if (InetNtopA(AF_INET, &s->sin_addr, tmp_endpoint.address, sizeof(tmp_endpoint.address)) == NULL) {
|
498
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
499
|
+
AWS_LOGF_ERROR(
|
500
|
+
AWS_LS_IO_SOCKET,
|
501
|
+
"id=%p handle=%p: determining local endpoint failed",
|
502
|
+
(void *)socket,
|
503
|
+
(void *)socket->io_handle.data.handle);
|
504
|
+
return aws_raise_error(s_determine_socket_error(wsa_err));
|
505
|
+
}
|
506
|
+
} else if (address.ss_family == AF_INET6) {
|
507
|
+
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&address;
|
508
|
+
tmp_endpoint.port = ntohs(s->sin6_port);
|
509
|
+
if (InetNtopA(AF_INET6, &s->sin6_addr, tmp_endpoint.address, sizeof(tmp_endpoint.address)) == NULL) {
|
510
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
511
|
+
AWS_LOGF_ERROR(
|
512
|
+
AWS_LS_IO_SOCKET,
|
513
|
+
"id=%p handle=%p: determining local endpoint failed",
|
514
|
+
(void *)socket,
|
515
|
+
(void *)socket->io_handle.data.handle);
|
516
|
+
return aws_raise_error(s_determine_socket_error(wsa_err));
|
517
|
+
}
|
518
|
+
} else {
|
519
|
+
AWS_LOGF_ERROR(
|
520
|
+
AWS_LS_IO_SOCKET,
|
521
|
+
"id=%p handle=%p: unknown ADDRESS_FAMILY %d",
|
522
|
+
(void *)socket,
|
523
|
+
(void *)socket->io_handle.data.handle,
|
524
|
+
address.ss_family);
|
525
|
+
return aws_raise_error(AWS_IO_SOCKET_UNSUPPORTED_ADDRESS_FAMILY);
|
526
|
+
}
|
527
|
+
|
528
|
+
socket->local_endpoint = tmp_endpoint;
|
529
|
+
return AWS_OP_SUCCESS;
|
530
|
+
}
|
531
|
+
|
452
532
|
int aws_socket_listen(struct aws_socket *socket, int backlog_size) {
|
453
533
|
struct iocp_socket *socket_impl = socket->impl;
|
454
534
|
return socket_impl->vtable->listen(socket, backlog_size);
|
@@ -586,27 +666,25 @@ static inline int s_process_tcp_sock_options(struct aws_socket *socket) {
|
|
586
666
|
|
587
667
|
/* called when an IPV4 tcp socket successfully has connected. */
|
588
668
|
static int s_ipv4_stream_connection_success(struct aws_socket *socket) {
|
669
|
+
struct iocp_socket *socket_impl = socket->impl;
|
589
670
|
|
590
671
|
if (s_process_tcp_sock_options(socket)) {
|
591
|
-
|
672
|
+
goto error;
|
592
673
|
}
|
593
674
|
|
594
675
|
int connect_result = 0;
|
595
676
|
socklen_t result_length = sizeof(connect_result);
|
596
|
-
struct iocp_socket *socket_impl = socket->impl;
|
597
677
|
if (getsockopt(
|
598
678
|
(SOCKET)socket->io_handle.data.handle, SOL_SOCKET, SO_ERROR, (char *)&connect_result, &result_length) < 0) {
|
679
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
599
680
|
AWS_LOGF_ERROR(
|
600
681
|
AWS_LS_IO_SOCKET,
|
601
682
|
"id=%p handle=%p: failed to determine connection error %d",
|
602
683
|
(void *)socket,
|
603
684
|
(void *)socket->io_handle.data.handle,
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
aws_raise_error(error);
|
608
|
-
socket_impl->vtable->connection_error(socket, error);
|
609
|
-
return AWS_OP_ERR;
|
685
|
+
wsa_err);
|
686
|
+
aws_raise_error(s_determine_socket_error(wsa_err));
|
687
|
+
goto error;
|
610
688
|
}
|
611
689
|
|
612
690
|
if (connect_result) {
|
@@ -616,89 +694,58 @@ static int s_ipv4_stream_connection_success(struct aws_socket *socket) {
|
|
616
694
|
(void *)socket,
|
617
695
|
(void *)socket->io_handle.data.handle,
|
618
696
|
connect_result);
|
619
|
-
|
620
|
-
|
621
|
-
aws_raise_error(error);
|
622
|
-
socket_impl->vtable->connection_error(socket, error);
|
623
|
-
return AWS_OP_ERR;
|
697
|
+
aws_raise_error(s_determine_socket_error(connect_result));
|
698
|
+
goto error;
|
624
699
|
}
|
625
700
|
|
626
701
|
AWS_LOGF_DEBUG(
|
627
702
|
AWS_LS_IO_SOCKET, "id=%p handle=%p: connection success", (void *)socket, (void *)socket->io_handle.data.handle);
|
628
703
|
|
629
|
-
|
630
|
-
|
631
|
-
socklen_t address_size = sizeof(address);
|
632
|
-
if (!getsockname((SOCKET)socket->io_handle.data.handle, (struct sockaddr *)&address, &address_size)) {
|
633
|
-
uint16_t port = 0;
|
634
|
-
struct sockaddr_in *s = (struct sockaddr_in *)&address;
|
635
|
-
port = ntohs(s->sin_port);
|
636
|
-
if (!InetNtopA(AF_INET, &s->sin_addr, socket->local_endpoint.address, sizeof(socket->local_endpoint.address))) {
|
637
|
-
AWS_LOGF_ERROR(
|
638
|
-
AWS_LS_IO_SOCKET,
|
639
|
-
"id=%p handle=%p: determining local endpoint failed",
|
640
|
-
(void *)socket,
|
641
|
-
(void *)socket->io_handle.data.handle);
|
642
|
-
socket->state = ERRORED;
|
643
|
-
int error = s_determine_socket_error(WSAGetLastError());
|
644
|
-
aws_raise_error(error);
|
645
|
-
socket_impl->vtable->connection_error(socket, error);
|
646
|
-
return AWS_OP_ERR;
|
647
|
-
}
|
648
|
-
AWS_LOGF_DEBUG(
|
649
|
-
AWS_LS_IO_SOCKET,
|
650
|
-
"id=%p handle=%p: local endpoint %s:%d",
|
651
|
-
(void *)socket,
|
652
|
-
(void *)socket->io_handle.data.handle,
|
653
|
-
socket->local_endpoint.address,
|
654
|
-
(int)port);
|
655
|
-
socket->local_endpoint.port = port;
|
656
|
-
} else {
|
657
|
-
AWS_LOGF_ERROR(
|
658
|
-
AWS_LS_IO_SOCKET,
|
659
|
-
"id=%p handle=%p: getsockname() failed with error %d",
|
660
|
-
(void *)socket,
|
661
|
-
(void *)socket->io_handle.data.handle,
|
662
|
-
(int)WSAGetLastError());
|
663
|
-
socket->state = ERRORED;
|
664
|
-
int error = s_determine_socket_error(WSAGetLastError());
|
665
|
-
aws_raise_error(error);
|
666
|
-
socket_impl->vtable->connection_error(socket, error);
|
667
|
-
return AWS_OP_ERR;
|
704
|
+
if (s_update_local_endpoint_ipv4_ipv6(socket)) {
|
705
|
+
goto error;
|
668
706
|
}
|
669
707
|
|
708
|
+
AWS_LOGF_DEBUG(
|
709
|
+
AWS_LS_IO_SOCKET,
|
710
|
+
"id=%p handle=%p: local endpoint %s:%d",
|
711
|
+
(void *)socket,
|
712
|
+
(void *)socket->io_handle.data.handle,
|
713
|
+
socket->local_endpoint.address,
|
714
|
+
(int)socket->local_endpoint.port);
|
715
|
+
|
670
716
|
setsockopt((SOCKET)socket->io_handle.data.handle, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
|
671
717
|
socket->state = CONNECTED_WRITE | CONNECTED_READ;
|
672
718
|
|
673
719
|
socket->connection_result_fn(socket, AWS_ERROR_SUCCESS, socket->connect_accept_user_data);
|
674
720
|
|
675
721
|
return AWS_OP_SUCCESS;
|
722
|
+
error:
|
723
|
+
socket->state = ERRORED;
|
724
|
+
socket_impl->vtable->connection_error(socket, aws_last_error());
|
725
|
+
return AWS_OP_ERR;
|
676
726
|
}
|
677
727
|
|
678
728
|
/* called upon a successful TCP over IPv6 connection. */
|
679
729
|
static int s_ipv6_stream_connection_success(struct aws_socket *socket) {
|
730
|
+
struct iocp_socket *socket_impl = socket->impl;
|
680
731
|
|
681
732
|
if (s_process_tcp_sock_options(socket)) {
|
682
|
-
|
683
|
-
return AWS_OP_ERR;
|
733
|
+
goto error;
|
684
734
|
}
|
685
735
|
|
686
736
|
int connect_result = 0;
|
687
737
|
socklen_t result_length = sizeof(connect_result);
|
688
|
-
struct iocp_socket *socket_impl = socket->impl;
|
689
738
|
if (getsockopt(
|
690
739
|
(SOCKET)socket->io_handle.data.handle, SOL_SOCKET, SO_ERROR, (char *)&connect_result, &result_length) < 0) {
|
740
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
691
741
|
AWS_LOGF_ERROR(
|
692
742
|
AWS_LS_IO_SOCKET,
|
693
743
|
"id=%p handle=%p: failed to determine connection error %d",
|
694
744
|
(void *)socket,
|
695
745
|
(void *)socket->io_handle.data.handle,
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
aws_raise_error(error);
|
700
|
-
socket_impl->vtable->connection_error(socket, error);
|
701
|
-
return AWS_OP_ERR;
|
746
|
+
wsa_err);
|
747
|
+
aws_raise_error(s_determine_socket_error(wsa_err));
|
748
|
+
goto error;
|
702
749
|
}
|
703
750
|
|
704
751
|
if (connect_result) {
|
@@ -708,57 +755,25 @@ static int s_ipv6_stream_connection_success(struct aws_socket *socket) {
|
|
708
755
|
(void *)socket,
|
709
756
|
(void *)socket->io_handle.data.handle,
|
710
757
|
connect_result);
|
711
|
-
|
712
|
-
|
713
|
-
aws_raise_error(error);
|
714
|
-
socket_impl->vtable->connection_error(socket, error);
|
715
|
-
return AWS_OP_ERR;
|
758
|
+
aws_raise_error(s_determine_socket_error(connect_result));
|
759
|
+
goto error;
|
716
760
|
}
|
717
761
|
|
718
762
|
AWS_LOGF_DEBUG(
|
719
763
|
AWS_LS_IO_SOCKET, "id=%p handle=%p: connection success", (void *)socket, (void *)socket->io_handle.data.handle);
|
720
764
|
|
721
|
-
|
722
|
-
|
723
|
-
socklen_t address_size = sizeof(address);
|
724
|
-
if (!getsockname((SOCKET)socket->io_handle.data.handle, (struct sockaddr *)&address, &address_size)) {
|
725
|
-
uint16_t port = 0;
|
726
|
-
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&address;
|
727
|
-
port = ntohs(s->sin6_port);
|
728
|
-
if (!InetNtopA(
|
729
|
-
AF_INET6, &s->sin6_addr, socket->local_endpoint.address, sizeof(socket->local_endpoint.address))) {
|
730
|
-
AWS_LOGF_ERROR(
|
731
|
-
AWS_LS_IO_SOCKET,
|
732
|
-
"id=%p handle=%p: determining local endpoint failed",
|
733
|
-
(void *)socket,
|
734
|
-
(void *)socket->io_handle.data.handle);
|
735
|
-
socket->state = ERRORED;
|
736
|
-
int error = s_determine_socket_error(WSAGetLastError());
|
737
|
-
aws_raise_error(error);
|
738
|
-
socket_impl->vtable->connection_error(socket, error);
|
739
|
-
return AWS_OP_ERR;
|
740
|
-
}
|
741
|
-
AWS_LOGF_DEBUG(
|
742
|
-
AWS_LS_IO_SOCKET,
|
743
|
-
"id=%p handle=%p: local endpoint %s:%d",
|
744
|
-
(void *)socket,
|
745
|
-
(void *)socket->io_handle.data.handle,
|
746
|
-
socket->local_endpoint.address,
|
747
|
-
(int)port);
|
748
|
-
} else {
|
749
|
-
AWS_LOGF_ERROR(
|
750
|
-
AWS_LS_IO_SOCKET,
|
751
|
-
"id=%p handle=%p: getsockname() failed with error %d",
|
752
|
-
(void *)socket,
|
753
|
-
(void *)socket->io_handle.data.handle,
|
754
|
-
(int)WSAGetLastError());
|
755
|
-
socket->state = ERRORED;
|
756
|
-
int error = s_determine_socket_error(WSAGetLastError());
|
757
|
-
aws_raise_error(error);
|
758
|
-
socket_impl->vtable->connection_error(socket, error);
|
759
|
-
return AWS_OP_ERR;
|
765
|
+
if (s_update_local_endpoint_ipv4_ipv6(socket)) {
|
766
|
+
goto error;
|
760
767
|
}
|
761
768
|
|
769
|
+
AWS_LOGF_DEBUG(
|
770
|
+
AWS_LS_IO_SOCKET,
|
771
|
+
"id=%p handle=%p: local endpoint %s:%d",
|
772
|
+
(void *)socket,
|
773
|
+
(void *)socket->io_handle.data.handle,
|
774
|
+
socket->local_endpoint.address,
|
775
|
+
(int)socket->local_endpoint.port);
|
776
|
+
|
762
777
|
setsockopt((SOCKET)socket->io_handle.data.handle, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
|
763
778
|
|
764
779
|
socket->state = CONNECTED_WRITE | CONNECTED_READ;
|
@@ -766,6 +781,11 @@ static int s_ipv6_stream_connection_success(struct aws_socket *socket) {
|
|
766
781
|
socket->connection_result_fn(socket, AWS_ERROR_SUCCESS, socket->connect_accept_user_data);
|
767
782
|
|
768
783
|
return AWS_OP_SUCCESS;
|
784
|
+
|
785
|
+
error:
|
786
|
+
socket->state = ERRORED;
|
787
|
+
socket_impl->vtable->connection_error(socket, aws_last_error());
|
788
|
+
return AWS_OP_ERR;
|
769
789
|
}
|
770
790
|
|
771
791
|
/* Outgoing UDP and Named pipe connections. */
|
@@ -907,13 +927,14 @@ static inline int s_tcp_connect(
|
|
907
927
|
|
908
928
|
int reuse = 1;
|
909
929
|
if (setsockopt((SOCKET)socket->io_handle.data.handle, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int))) {
|
930
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
910
931
|
AWS_LOGF_WARN(
|
911
932
|
AWS_LS_IO_SOCKET,
|
912
933
|
"id=%p handle=%p: setsockopt() call for enabling SO_REUSEADDR failed with WSAError %d",
|
913
934
|
(void *)socket,
|
914
935
|
(void *)socket->io_handle.data.handle,
|
915
|
-
|
916
|
-
return aws_raise_error(s_determine_socket_error(
|
936
|
+
wsa_err);
|
937
|
+
return aws_raise_error(s_determine_socket_error(wsa_err));
|
917
938
|
}
|
918
939
|
|
919
940
|
struct socket_connect_args *connect_args = aws_mem_calloc(socket->allocator, 1, sizeof(struct socket_connect_args));
|
@@ -994,6 +1015,8 @@ static inline int s_tcp_connect(
|
|
994
1015
|
return AWS_OP_SUCCESS;
|
995
1016
|
}
|
996
1017
|
|
1018
|
+
/* This should be called IMMEDIATELY after failure.
|
1019
|
+
* Otherwise, WSAGetLastError() could get cleared accidentally by a logging call */
|
997
1020
|
static inline int s_convert_pton_error(int pton_err) {
|
998
1021
|
if (pton_err == 0) {
|
999
1022
|
return AWS_IO_SOCKET_INVALID_ADDRESS;
|
@@ -1018,9 +1041,11 @@ static int s_ipv4_stream_connect(
|
|
1018
1041
|
socket->connection_result_fn = on_connection_result;
|
1019
1042
|
socket->connect_accept_user_data = user_data;
|
1020
1043
|
struct sockaddr_in addr_in;
|
1044
|
+
AWS_ZERO_STRUCT(addr_in);
|
1021
1045
|
int err = inet_pton(AF_INET, remote_endpoint->address, &(addr_in.sin_addr));
|
1022
1046
|
|
1023
1047
|
if (err != 1) {
|
1048
|
+
int aws_err = s_convert_pton_error(err); /* call before logging or WSAError may get cleared */
|
1024
1049
|
AWS_LOGF_ERROR(
|
1025
1050
|
AWS_LS_IO_SOCKET,
|
1026
1051
|
"id=%p handle=%p: failed to parse address %s:%d.",
|
@@ -1028,7 +1053,7 @@ static int s_ipv4_stream_connect(
|
|
1028
1053
|
(void *)socket->io_handle.data.handle,
|
1029
1054
|
remote_endpoint->address,
|
1030
1055
|
(int)remote_endpoint->port);
|
1031
|
-
return aws_raise_error(
|
1056
|
+
return aws_raise_error(aws_err);
|
1032
1057
|
}
|
1033
1058
|
|
1034
1059
|
AWS_LOGF_DEBUG(
|
@@ -1084,8 +1109,10 @@ static int s_ipv6_stream_connect(
|
|
1084
1109
|
bind_addr.sin6_port = 0;
|
1085
1110
|
|
1086
1111
|
struct sockaddr_in6 addr_in6;
|
1112
|
+
AWS_ZERO_STRUCT(addr_in6);
|
1087
1113
|
int pton_err = inet_pton(AF_INET6, remote_endpoint->address, &(addr_in6.sin6_addr));
|
1088
1114
|
if (pton_err != 1) {
|
1115
|
+
int aws_err = s_convert_pton_error(pton_err); /* call before logging or WSAError may get cleared */
|
1089
1116
|
AWS_LOGF_ERROR(
|
1090
1117
|
AWS_LS_IO_SOCKET,
|
1091
1118
|
"id=%p handle=%p: failed to parse address %s:%d.",
|
@@ -1093,7 +1120,7 @@ static int s_ipv6_stream_connect(
|
|
1093
1120
|
(void *)socket->io_handle.data.handle,
|
1094
1121
|
remote_endpoint->address,
|
1095
1122
|
(int)remote_endpoint->port);
|
1096
|
-
return aws_raise_error(
|
1123
|
+
return aws_raise_error(aws_err);
|
1097
1124
|
}
|
1098
1125
|
|
1099
1126
|
AWS_LOGF_DEBUG(
|
@@ -1190,6 +1217,7 @@ static int s_local_connect(
|
|
1190
1217
|
}
|
1191
1218
|
|
1192
1219
|
error:
|
1220
|
+
int win_error = GetLastError(); /* logging may reset error, so cache it */
|
1193
1221
|
AWS_LOGF_ERROR(
|
1194
1222
|
AWS_LS_IO_SOCKET,
|
1195
1223
|
"id=%p handle=%p: failed to connect to named pipe %s.",
|
@@ -1197,7 +1225,6 @@ error:
|
|
1197
1225
|
(void *)socket->io_handle.data.handle,
|
1198
1226
|
remote_endpoint->address);
|
1199
1227
|
socket->state = ERRORED;
|
1200
|
-
int win_error = GetLastError();
|
1201
1228
|
int aws_error = s_determine_socket_error(win_error);
|
1202
1229
|
aws_raise_error(aws_error);
|
1203
1230
|
return AWS_OP_ERR;
|
@@ -1223,18 +1250,21 @@ static inline int s_dgram_connect(
|
|
1223
1250
|
|
1224
1251
|
int reuse = 1;
|
1225
1252
|
if (setsockopt((SOCKET)socket->io_handle.data.handle, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int))) {
|
1253
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
1226
1254
|
AWS_LOGF_WARN(
|
1227
1255
|
AWS_LS_IO_SOCKET,
|
1228
1256
|
"id=%p handle=%p: setsockopt() call for enabling SO_REUSEADDR failed with WSAError %d",
|
1229
1257
|
(void *)socket,
|
1230
1258
|
(void *)socket->io_handle.data.handle,
|
1231
|
-
|
1232
|
-
|
1259
|
+
wsa_err);
|
1260
|
+
aws_raise_error(s_determine_socket_error(wsa_err));
|
1261
|
+
goto error;
|
1233
1262
|
}
|
1234
1263
|
|
1235
1264
|
int connect_err = connect((SOCKET)socket->io_handle.data.handle, socket_addr, (int)sock_size);
|
1236
1265
|
|
1237
1266
|
if (connect_err) {
|
1267
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
1238
1268
|
AWS_LOGF_ERROR(
|
1239
1269
|
AWS_LS_IO_SOCKET,
|
1240
1270
|
"id=%p handle=%p: Failed to connect to %s:%d with error %d.",
|
@@ -1242,70 +1272,31 @@ static inline int s_dgram_connect(
|
|
1242
1272
|
(void *)socket->io_handle.data.handle,
|
1243
1273
|
remote_endpoint->address,
|
1244
1274
|
(int)remote_endpoint->port,
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1248
|
-
int aws_error = s_determine_socket_error(error_code);
|
1249
|
-
aws_raise_error(aws_error);
|
1250
|
-
socket_impl->vtable->connection_error(socket, aws_error);
|
1251
|
-
return AWS_OP_ERR;
|
1275
|
+
wsa_err);
|
1276
|
+
aws_raise_error(s_determine_socket_error(wsa_err));
|
1277
|
+
goto error;
|
1252
1278
|
}
|
1253
1279
|
|
1254
|
-
|
1255
|
-
|
1256
|
-
int sock_name_err = getsockname((SOCKET)socket->io_handle.data.handle, socket_addr, &fake_sock_size);
|
1257
|
-
if (!sock_name_err) {
|
1258
|
-
uint16_t port = 0;
|
1259
|
-
if (socket->options.domain == AWS_SOCKET_IPV4) {
|
1260
|
-
struct sockaddr_in *ipv4_addr = (struct sockaddr_in *)socket_addr;
|
1261
|
-
port = ntohs(ipv4_addr->sin_port);
|
1262
|
-
/* these came from the kernel, a.) they won't fail. b.) event if they did it's not a fatal error. Log it
|
1263
|
-
when we make the logging pass.*/
|
1264
|
-
InetNtopA(
|
1265
|
-
AF_INET, &ipv4_addr->sin_addr, socket->local_endpoint.address, sizeof(socket->local_endpoint.address));
|
1266
|
-
} else {
|
1267
|
-
struct sockaddr_in6 *ipv6_addr = (struct sockaddr_in6 *)socket_addr;
|
1268
|
-
port = ntohs(ipv6_addr->sin6_port);
|
1269
|
-
/* these came from the kernel, a.) they won't fail. b.) event if they did it's not a fatal error. Log it
|
1270
|
-
when we make the logging pass.*/
|
1271
|
-
InetNtopA(
|
1272
|
-
AF_INET6,
|
1273
|
-
&ipv6_addr->sin6_addr,
|
1274
|
-
socket->local_endpoint.address,
|
1275
|
-
sizeof(socket->local_endpoint.address));
|
1276
|
-
}
|
1277
|
-
AWS_LOGF_DEBUG(
|
1278
|
-
AWS_LS_IO_SOCKET,
|
1279
|
-
"id=%p handle=%p: local endpoint %s:%d",
|
1280
|
-
(void *)socket,
|
1281
|
-
(void *)socket->io_handle.data.handle,
|
1282
|
-
socket->local_endpoint.address,
|
1283
|
-
(int)socket->local_endpoint.port);
|
1280
|
+
if (s_update_local_endpoint_ipv4_ipv6(socket)) {
|
1281
|
+
goto error;
|
1284
1282
|
}
|
1285
1283
|
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
1293
|
-
socket->state = ERRORED;
|
1294
|
-
int error = s_determine_socket_error(WSAGetLastError());
|
1295
|
-
aws_raise_error(error);
|
1296
|
-
return AWS_OP_ERR;
|
1297
|
-
}
|
1284
|
+
AWS_LOGF_DEBUG(
|
1285
|
+
AWS_LS_IO_SOCKET,
|
1286
|
+
"id=%p handle=%p: local endpoint %s:%d",
|
1287
|
+
(void *)socket,
|
1288
|
+
(void *)socket->io_handle.data.handle,
|
1289
|
+
socket->local_endpoint.address,
|
1290
|
+
(int)socket->local_endpoint.port);
|
1298
1291
|
|
1299
1292
|
if (s_process_tcp_sock_options(socket)) {
|
1300
|
-
|
1301
|
-
return AWS_OP_ERR;
|
1293
|
+
goto error;
|
1302
1294
|
}
|
1303
1295
|
socket->state = CONNECTED_READ | CONNECTED_WRITE;
|
1304
1296
|
|
1305
1297
|
if (connect_loop) {
|
1306
1298
|
if (aws_socket_assign_to_event_loop(socket, connect_loop)) {
|
1307
|
-
|
1308
|
-
return AWS_OP_ERR;
|
1299
|
+
goto error;
|
1309
1300
|
}
|
1310
1301
|
|
1311
1302
|
socket_impl->read_io_data->sequential_task_storage.fn = s_connection_success_task;
|
@@ -1315,6 +1306,10 @@ static inline int s_dgram_connect(
|
|
1315
1306
|
}
|
1316
1307
|
|
1317
1308
|
return AWS_OP_SUCCESS;
|
1309
|
+
|
1310
|
+
error:
|
1311
|
+
socket->state = ERRORED;
|
1312
|
+
return AWS_OP_ERR;
|
1318
1313
|
}
|
1319
1314
|
|
1320
1315
|
static int s_ipv4_dgram_connect(
|
@@ -1329,10 +1324,12 @@ static int s_ipv4_dgram_connect(
|
|
1329
1324
|
socket->connection_result_fn = on_connection_result;
|
1330
1325
|
socket->connect_accept_user_data = user_data;
|
1331
1326
|
struct sockaddr_in addr_in;
|
1327
|
+
AWS_ZERO_STRUCT(addr_in);
|
1332
1328
|
int pton_err = inet_pton(AF_INET, remote_endpoint->address, &(addr_in.sin_addr));
|
1333
1329
|
if (pton_err != 1) {
|
1330
|
+
int aws_err = s_convert_pton_error(pton_err); /* call right after failure, so that WSAError isn't cleared */
|
1334
1331
|
socket->state = ERRORED;
|
1335
|
-
return aws_raise_error(
|
1332
|
+
return aws_raise_error(aws_err);
|
1336
1333
|
}
|
1337
1334
|
|
1338
1335
|
addr_in.sin_port = htons(remote_endpoint->port);
|
@@ -1353,11 +1350,13 @@ static int s_ipv6_dgram_connect(
|
|
1353
1350
|
socket->connection_result_fn = on_connection_result;
|
1354
1351
|
socket->connect_accept_user_data = user_data;
|
1355
1352
|
struct sockaddr_in6 addr_in6;
|
1353
|
+
AWS_ZERO_STRUCT(addr_in6);
|
1356
1354
|
int pton_err = inet_pton(AF_INET6, remote_endpoint->address, &(addr_in6.sin6_addr));
|
1357
1355
|
|
1358
1356
|
if (pton_err != 1) {
|
1357
|
+
int aws_err = s_convert_pton_error(pton_err); /* call right after failure, so that WSAError isn't cleared */
|
1359
1358
|
socket->state = ERRORED;
|
1360
|
-
return aws_raise_error(
|
1359
|
+
return aws_raise_error(aws_err);
|
1361
1360
|
}
|
1362
1361
|
|
1363
1362
|
addr_in6.sin6_port = htons(remote_endpoint->port);
|
@@ -1366,20 +1365,7 @@ static int s_ipv6_dgram_connect(
|
|
1366
1365
|
return s_dgram_connect(socket, remote_endpoint, connect_loop, (struct sockaddr *)&addr_in6, sizeof(addr_in6));
|
1367
1366
|
}
|
1368
1367
|
|
1369
|
-
static inline int s_tcp_bind(
|
1370
|
-
struct aws_socket *socket,
|
1371
|
-
const struct aws_socket_endpoint *local_endpoint,
|
1372
|
-
struct sockaddr *sock_addr,
|
1373
|
-
size_t sock_size) {
|
1374
|
-
socket->local_endpoint = *local_endpoint;
|
1375
|
-
|
1376
|
-
AWS_LOGF_INFO(
|
1377
|
-
AWS_LS_IO_SOCKET,
|
1378
|
-
"id=%p handle=%p: binding to tcp %s:%d",
|
1379
|
-
(void *)socket,
|
1380
|
-
(void *)socket->io_handle.data.handle,
|
1381
|
-
local_endpoint->address,
|
1382
|
-
(int)local_endpoint->port);
|
1368
|
+
static inline int s_tcp_bind(struct aws_socket *socket, struct sockaddr *sock_addr, size_t sock_size) {
|
1383
1369
|
|
1384
1370
|
/* set this option to prevent duplicate bind calls. */
|
1385
1371
|
int exclusive_use_val = 1;
|
@@ -1389,123 +1375,149 @@ static inline int s_tcp_bind(
|
|
1389
1375
|
SO_EXCLUSIVEADDRUSE,
|
1390
1376
|
(char *)&exclusive_use_val,
|
1391
1377
|
sizeof(int))) {
|
1378
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
1392
1379
|
AWS_LOGF_WARN(
|
1393
1380
|
AWS_LS_IO_SOCKET,
|
1394
1381
|
"id=%p handle=%p: setsockopt() call for enabling SO_EXCLUSIVEADDRUSE failed with WSAError %d",
|
1395
1382
|
(void *)socket,
|
1396
1383
|
(void *)socket->io_handle.data.handle,
|
1397
|
-
|
1398
|
-
|
1399
|
-
|
1384
|
+
wsa_err);
|
1385
|
+
aws_raise_error(s_determine_socket_error(wsa_err));
|
1386
|
+
goto error;
|
1400
1387
|
}
|
1401
1388
|
|
1402
|
-
|
1389
|
+
if (bind((SOCKET)socket->io_handle.data.handle, sock_addr, (int)sock_size) != 0) {
|
1390
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
1391
|
+
AWS_LOGF_ERROR(
|
1392
|
+
AWS_LS_IO_SOCKET,
|
1393
|
+
"id=%p handle=%p: error binding. error %d",
|
1394
|
+
(void *)socket,
|
1395
|
+
(void *)socket->io_handle.data.handle,
|
1396
|
+
wsa_err);
|
1397
|
+
aws_raise_error(s_determine_socket_error(wsa_err));
|
1398
|
+
goto error;
|
1399
|
+
}
|
1403
1400
|
|
1404
|
-
if (
|
1405
|
-
|
1406
|
-
return AWS_OP_SUCCESS;
|
1401
|
+
if (s_update_local_endpoint_ipv4_ipv6(socket)) {
|
1402
|
+
goto error;
|
1407
1403
|
}
|
1408
1404
|
|
1409
|
-
|
1405
|
+
AWS_LOGF_INFO(
|
1410
1406
|
AWS_LS_IO_SOCKET,
|
1411
|
-
"id=%p handle=%p:
|
1407
|
+
"id=%p handle=%p: binding to tcp %s:%d",
|
1412
1408
|
(void *)socket,
|
1413
1409
|
(void *)socket->io_handle.data.handle,
|
1414
|
-
|
1410
|
+
socket->local_endpoint.address,
|
1411
|
+
(int)socket->local_endpoint.port);
|
1412
|
+
|
1413
|
+
socket->state = BOUND;
|
1414
|
+
return AWS_OP_SUCCESS;
|
1415
|
+
|
1416
|
+
error:
|
1415
1417
|
socket->state = ERRORED;
|
1416
|
-
|
1417
|
-
return aws_raise_error(error);
|
1418
|
+
return AWS_OP_ERR;
|
1418
1419
|
}
|
1419
1420
|
|
1420
1421
|
static int s_ipv4_stream_bind(struct aws_socket *socket, const struct aws_socket_endpoint *local_endpoint) {
|
1421
1422
|
struct sockaddr_in addr_in;
|
1423
|
+
AWS_ZERO_STRUCT(addr_in);
|
1422
1424
|
int pton_err = inet_pton(AF_INET, local_endpoint->address, &(addr_in.sin_addr));
|
1423
1425
|
|
1424
1426
|
if (pton_err != 1) {
|
1427
|
+
int aws_err = s_convert_pton_error(pton_err); /* call right after failure, so that WSAError isn't cleared */
|
1425
1428
|
socket->state = ERRORED;
|
1426
|
-
return aws_raise_error(
|
1429
|
+
return aws_raise_error(aws_err);
|
1427
1430
|
}
|
1428
1431
|
|
1429
1432
|
addr_in.sin_port = htons(local_endpoint->port);
|
1430
1433
|
addr_in.sin_family = AF_INET;
|
1431
1434
|
|
1432
|
-
return s_tcp_bind(socket,
|
1435
|
+
return s_tcp_bind(socket, (struct sockaddr *)&addr_in, sizeof(addr_in));
|
1433
1436
|
}
|
1434
1437
|
|
1435
1438
|
static int s_ipv6_stream_bind(struct aws_socket *socket, const struct aws_socket_endpoint *local_endpoint) {
|
1436
1439
|
struct sockaddr_in6 addr_in6;
|
1440
|
+
AWS_ZERO_STRUCT(addr_in6);
|
1437
1441
|
int pton_err = inet_pton(AF_INET6, local_endpoint->address, &(addr_in6.sin6_addr));
|
1438
1442
|
|
1439
1443
|
if (pton_err != 1) {
|
1444
|
+
int aws_err = s_convert_pton_error(pton_err); /* call right after failure, so that WSAError isn't cleared */
|
1440
1445
|
socket->state = ERRORED;
|
1441
|
-
return aws_raise_error(
|
1446
|
+
return aws_raise_error(aws_err);
|
1442
1447
|
}
|
1443
1448
|
|
1444
1449
|
addr_in6.sin6_port = htons(local_endpoint->port);
|
1445
1450
|
addr_in6.sin6_family = AF_INET6;
|
1446
1451
|
|
1447
|
-
return s_tcp_bind(socket,
|
1452
|
+
return s_tcp_bind(socket, (struct sockaddr *)&addr_in6, sizeof(addr_in6));
|
1448
1453
|
}
|
1449
1454
|
|
1450
|
-
static inline int s_udp_bind(
|
1451
|
-
|
1452
|
-
|
1453
|
-
|
1454
|
-
|
1455
|
-
|
1455
|
+
static inline int s_udp_bind(struct aws_socket *socket, struct sockaddr *sock_addr, size_t sock_size) {
|
1456
|
+
|
1457
|
+
if (bind((SOCKET)socket->io_handle.data.handle, sock_addr, (int)sock_size) != 0) {
|
1458
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
1459
|
+
AWS_LOGF_ERROR(
|
1460
|
+
AWS_LS_IO_SOCKET,
|
1461
|
+
"id=%p handle=%p: error binding. error %d",
|
1462
|
+
(void *)socket,
|
1463
|
+
(void *)socket->io_handle.data.handle,
|
1464
|
+
wsa_err);
|
1465
|
+
aws_raise_error(s_determine_socket_error(wsa_err));
|
1466
|
+
goto error;
|
1467
|
+
}
|
1468
|
+
|
1469
|
+
if (s_update_local_endpoint_ipv4_ipv6(socket)) {
|
1470
|
+
goto error;
|
1471
|
+
}
|
1472
|
+
|
1456
1473
|
AWS_LOGF_INFO(
|
1457
1474
|
AWS_LS_IO_SOCKET,
|
1458
1475
|
"id=%p handle=%p: binding to udp %s:%p",
|
1459
1476
|
(void *)socket,
|
1460
1477
|
(void *)socket->io_handle.data.handle,
|
1461
|
-
local_endpoint
|
1462
|
-
(int)local_endpoint
|
1463
|
-
int error_code = bind((SOCKET)socket->io_handle.data.handle, sock_addr, (int)sock_size);
|
1478
|
+
socket->local_endpoint.address,
|
1479
|
+
(int)socket->local_endpoint.port);
|
1464
1480
|
|
1465
|
-
|
1466
|
-
|
1467
|
-
return AWS_OP_SUCCESS;
|
1468
|
-
}
|
1481
|
+
socket->state = CONNECTED_READ;
|
1482
|
+
return AWS_OP_SUCCESS;
|
1469
1483
|
|
1470
|
-
|
1471
|
-
AWS_LS_IO_SOCKET,
|
1472
|
-
"id=%p handle=%p: error binding. error %d",
|
1473
|
-
(void *)socket,
|
1474
|
-
(void *)socket->io_handle.data.handle,
|
1475
|
-
(int)WSAGetLastError());
|
1484
|
+
error:
|
1476
1485
|
socket->state = ERRORED;
|
1477
|
-
|
1478
|
-
return aws_raise_error(error);
|
1486
|
+
return AWS_OP_ERR;
|
1479
1487
|
}
|
1480
1488
|
|
1481
1489
|
static int s_ipv4_dgram_bind(struct aws_socket *socket, const struct aws_socket_endpoint *local_endpoint) {
|
1482
1490
|
struct sockaddr_in addr_in;
|
1491
|
+
AWS_ZERO_STRUCT(addr_in);
|
1483
1492
|
int pton_err = inet_pton(AF_INET, local_endpoint->address, &(addr_in.sin_addr));
|
1484
1493
|
|
1485
1494
|
if (pton_err != 1) {
|
1495
|
+
int aws_err = s_convert_pton_error(pton_err); /* call right after failure, so that WSAError isn't cleared */
|
1486
1496
|
socket->state = ERRORED;
|
1487
|
-
return aws_raise_error(
|
1497
|
+
return aws_raise_error(aws_err);
|
1488
1498
|
}
|
1489
1499
|
|
1490
1500
|
addr_in.sin_port = htons(local_endpoint->port);
|
1491
1501
|
addr_in.sin_family = AF_INET;
|
1492
1502
|
|
1493
|
-
return s_udp_bind(socket,
|
1503
|
+
return s_udp_bind(socket, (struct sockaddr *)&addr_in, sizeof(addr_in));
|
1494
1504
|
}
|
1495
1505
|
|
1496
1506
|
static int s_ipv6_dgram_bind(struct aws_socket *socket, const struct aws_socket_endpoint *local_endpoint) {
|
1497
1507
|
struct sockaddr_in6 addr_in6;
|
1508
|
+
AWS_ZERO_STRUCT(addr_in6);
|
1498
1509
|
int pton_err = inet_pton(AF_INET6, local_endpoint->address, &(addr_in6.sin6_addr));
|
1499
1510
|
|
1500
1511
|
if (pton_err != 1) {
|
1512
|
+
int aws_err = s_convert_pton_error(pton_err); /* call right after failure, so that WSAError isn't cleared */
|
1501
1513
|
socket->state = ERRORED;
|
1502
|
-
return aws_raise_error(
|
1514
|
+
return aws_raise_error(aws_err);
|
1503
1515
|
}
|
1504
1516
|
|
1505
1517
|
addr_in6.sin6_port = htons(local_endpoint->port);
|
1506
1518
|
addr_in6.sin6_family = AF_INET6;
|
1507
1519
|
|
1508
|
-
return s_udp_bind(socket,
|
1520
|
+
return s_udp_bind(socket, (struct sockaddr *)&addr_in6, sizeof(addr_in6));
|
1509
1521
|
}
|
1510
1522
|
|
1511
1523
|
static int s_local_bind(struct aws_socket *socket, const struct aws_socket_endpoint *local_endpoint) {
|
@@ -1531,16 +1543,16 @@ static int s_local_bind(struct aws_socket *socket, const struct aws_socket_endpo
|
|
1531
1543
|
socket->state = BOUND;
|
1532
1544
|
return AWS_OP_SUCCESS;
|
1533
1545
|
} else {
|
1546
|
+
int error_code = GetLastError(); /* logging may reset error, so cache it */
|
1534
1547
|
AWS_LOGF_ERROR(
|
1535
1548
|
AWS_LS_IO_SOCKET,
|
1536
1549
|
"id=%p handle=%p: failed to open named pipe %s with error %d",
|
1537
1550
|
(void *)socket,
|
1538
1551
|
(void *)socket->io_handle.data.handle,
|
1539
1552
|
local_endpoint->address,
|
1540
|
-
|
1553
|
+
error_code);
|
1541
1554
|
|
1542
1555
|
socket->state = ERRORED;
|
1543
|
-
int error_code = GetLastError();
|
1544
1556
|
int aws_error = s_determine_socket_error(error_code);
|
1545
1557
|
return aws_raise_error(aws_error);
|
1546
1558
|
}
|
@@ -1560,13 +1572,13 @@ static int s_tcp_listen(struct aws_socket *socket, int backlog_size) {
|
|
1560
1572
|
return AWS_OP_SUCCESS;
|
1561
1573
|
}
|
1562
1574
|
|
1575
|
+
error_code = GetLastError(); /* logging may reset error, so cache it */
|
1563
1576
|
AWS_LOGF_ERROR(
|
1564
1577
|
AWS_LS_IO_SOCKET,
|
1565
1578
|
"id=%p handle=%p: listen failed with error code %d",
|
1566
1579
|
(void *)socket,
|
1567
1580
|
(void *)socket->io_handle.data.handle,
|
1568
|
-
|
1569
|
-
error_code = GetLastError();
|
1581
|
+
error_code);
|
1570
1582
|
int aws_error = s_determine_socket_error(error_code);
|
1571
1583
|
return aws_raise_error(aws_error);
|
1572
1584
|
}
|
@@ -1732,7 +1744,7 @@ static void s_incoming_pipe_connection_event(
|
|
1732
1744
|
"id=%p handle=%p: named-pipe connect failed with error %d",
|
1733
1745
|
(void *)socket,
|
1734
1746
|
(void *)socket->io_handle.data.handle,
|
1735
|
-
|
1747
|
+
error_code);
|
1736
1748
|
socket->state = ERRORED;
|
1737
1749
|
socket_impl->read_io_data->in_use = false;
|
1738
1750
|
int aws_err = s_determine_socket_error(error_code);
|
@@ -1825,7 +1837,7 @@ static int s_socket_setup_accept(struct aws_socket *socket, struct aws_event_loo
|
|
1825
1837
|
"id=%p handle=%p: accept failed with error %d",
|
1826
1838
|
(void *)socket,
|
1827
1839
|
(void *)socket->io_handle.data.handle,
|
1828
|
-
(int)
|
1840
|
+
(int)win_err);
|
1829
1841
|
socket->state = ERRORED;
|
1830
1842
|
socket_impl->read_io_data->in_use = false;
|
1831
1843
|
aws_mem_release(socket->allocator, socket_impl->incoming_socket);
|
@@ -2244,12 +2256,13 @@ int aws_socket_set_options(struct aws_socket *socket, const struct aws_socket_op
|
|
2244
2256
|
SO_KEEPALIVE,
|
2245
2257
|
(char *)&keep_alive,
|
2246
2258
|
sizeof(int))) {
|
2259
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
2247
2260
|
AWS_LOGF_WARN(
|
2248
2261
|
AWS_LS_IO_SOCKET,
|
2249
2262
|
"id=%p handle=%p: setsockopt() call for enabling keep-alive failed with WSAError %d",
|
2250
2263
|
(void *)socket,
|
2251
2264
|
(void *)socket->io_handle.data.handle,
|
2252
|
-
|
2265
|
+
wsa_err);
|
2253
2266
|
}
|
2254
2267
|
} else if (socket->options.keepalive) {
|
2255
2268
|
ULONG keep_alive_timeout = (ULONG)aws_timestamp_convert(
|
@@ -2272,12 +2285,13 @@ int aws_socket_set_options(struct aws_socket *socket, const struct aws_socket_op
|
|
2272
2285
|
&bytes_returned,
|
2273
2286
|
NULL,
|
2274
2287
|
NULL)) {
|
2288
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
2275
2289
|
AWS_LOGF_WARN(
|
2276
2290
|
AWS_LS_IO_SOCKET,
|
2277
2291
|
"id=%p handle=%p: WSAIoctl() call for setting keep-alive values failed with WSAError %d",
|
2278
2292
|
(void *)socket,
|
2279
2293
|
(void *)socket->io_handle.data.handle,
|
2280
|
-
|
2294
|
+
wsa_err);
|
2281
2295
|
}
|
2282
2296
|
}
|
2283
2297
|
/* this is only available in Windows 10 1703 and later. It doesn't, matter if this runs on an older version
|
@@ -2291,6 +2305,7 @@ int aws_socket_set_options(struct aws_socket *socket, const struct aws_socket_op
|
|
2291
2305
|
TCP_KEEPCNT,
|
2292
2306
|
(char *)&max_probes,
|
2293
2307
|
sizeof(max_probes))) {
|
2308
|
+
int wsa_err = WSAGetLastError(); /* logging may reset error, so cache it */
|
2294
2309
|
AWS_LOGF_WARN(
|
2295
2310
|
AWS_LS_IO_SOCKET,
|
2296
2311
|
"id=%p handle=%p: setsockopt() call for setting keep-alive probe count value failed with WSAError "
|
@@ -2299,7 +2314,7 @@ int aws_socket_set_options(struct aws_socket *socket, const struct aws_socket_op
|
|
2299
2314
|
"Windows 10 1703",
|
2300
2315
|
(void *)socket,
|
2301
2316
|
(void *)socket->io_handle.data.handle,
|
2302
|
-
|
2317
|
+
wsa_err);
|
2303
2318
|
}
|
2304
2319
|
}
|
2305
2320
|
#endif
|
@@ -2673,18 +2688,18 @@ static int s_stream_subscribe_to_read(
|
|
2673
2688
|
NULL,
|
2674
2689
|
aws_overlapped_to_windows_overlapped(&iocp_socket->read_io_data->signal));
|
2675
2690
|
if (!success) {
|
2676
|
-
int
|
2677
|
-
if (
|
2691
|
+
int win_err = GetLastError();
|
2692
|
+
if (win_err != ERROR_IO_PENDING) {
|
2678
2693
|
AWS_LOGF_ERROR(
|
2679
2694
|
AWS_LS_IO_SOCKET,
|
2680
2695
|
"id=%p handle=%p: socket ReadFile() failed with error %d",
|
2681
2696
|
(void *)socket,
|
2682
2697
|
(void *)socket->io_handle.data.handle,
|
2683
|
-
|
2698
|
+
win_err);
|
2684
2699
|
iocp_socket->read_io_data->in_use = false;
|
2685
2700
|
socket->state &= ~CONNECTED_WAITING_ON_READABLE;
|
2686
2701
|
|
2687
|
-
int aws_error = s_determine_socket_error(
|
2702
|
+
int aws_error = s_determine_socket_error(win_err);
|
2688
2703
|
if (aws_error == AWS_IO_SOCKET_CLOSED) {
|
2689
2704
|
socket->state = CLOSED;
|
2690
2705
|
} else {
|
@@ -2787,16 +2802,16 @@ static int s_local_read(struct aws_socket *socket, struct aws_byte_buf *buffer,
|
|
2787
2802
|
NULL,
|
2788
2803
|
aws_overlapped_to_windows_overlapped(&iocp_socket->read_io_data->signal));
|
2789
2804
|
if (!success) {
|
2790
|
-
int
|
2791
|
-
if (
|
2805
|
+
int win_err = GetLastError();
|
2806
|
+
if (win_err != ERROR_IO_PENDING) {
|
2792
2807
|
AWS_LOGF_ERROR(
|
2793
2808
|
AWS_LS_IO_SOCKET,
|
2794
2809
|
"id=%p handle=%p: ReadFile() failed with error %d",
|
2795
2810
|
(void *)socket,
|
2796
2811
|
(void *)socket->io_handle.data.handle,
|
2797
|
-
|
2812
|
+
win_err);
|
2798
2813
|
iocp_socket->read_io_data->in_use = false;
|
2799
|
-
int aws_error = s_determine_socket_error(
|
2814
|
+
int aws_error = s_determine_socket_error(win_err);
|
2800
2815
|
if (aws_error == AWS_IO_SOCKET_CLOSED) {
|
2801
2816
|
socket->state = CLOSED;
|
2802
2817
|
} else {
|
@@ -2911,16 +2926,16 @@ static int s_tcp_read(struct aws_socket *socket, struct aws_byte_buf *buffer, si
|
|
2911
2926
|
NULL,
|
2912
2927
|
aws_overlapped_to_windows_overlapped(&iocp_socket->read_io_data->signal));
|
2913
2928
|
if (!success) {
|
2914
|
-
int
|
2915
|
-
if (
|
2929
|
+
int win_err = GetLastError();
|
2930
|
+
if (win_err != ERROR_IO_PENDING) {
|
2916
2931
|
AWS_LOGF_ERROR(
|
2917
2932
|
AWS_LS_IO_SOCKET,
|
2918
2933
|
"id=%p handle=%p: ReadFile() for 0 byte read failed with error %d",
|
2919
2934
|
(void *)socket,
|
2920
2935
|
(void *)socket->io_handle.data.handle,
|
2921
|
-
|
2936
|
+
win_err);
|
2922
2937
|
iocp_socket->read_io_data->in_use = false;
|
2923
|
-
int aws_error = s_determine_socket_error(
|
2938
|
+
int aws_error = s_determine_socket_error(win_err);
|
2924
2939
|
if (aws_error == AWS_IO_SOCKET_CLOSED) {
|
2925
2940
|
socket->state = CLOSED;
|
2926
2941
|
} else {
|
@@ -3048,7 +3063,7 @@ static int s_dgram_read(struct aws_socket *socket, struct aws_byte_buf *buffer,
|
|
3048
3063
|
|
3049
3064
|
AWS_LOGF_ERROR(
|
3050
3065
|
AWS_LS_IO_SOCKET,
|
3051
|
-
"id=%p handle=%p:
|
3066
|
+
"id=%p handle=%p: recv() failed with error %d",
|
3052
3067
|
(void *)socket,
|
3053
3068
|
(void *)socket->io_handle.data.handle,
|
3054
3069
|
error);
|