diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user new file mode 100644 index 00000000..47220290 --- /dev/null +++ b/CMakeLists.txt.user @@ -0,0 +1,371 @@ + + + + + + EnvironmentId + {d2097749-f678-439b-ab23-75844ed126ff} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.8.0 MSVC2015_64bit + Desktop Qt 5.8.0 MSVC2015_64bit + qt.58.win64_msvc2015_64_kit + 0 + 0 + 0 + + + C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Default + + + + + + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Build + + ProjectExplorer.BuildSteps.Build + + + + + + clean + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Default + Default + CMakeProjectManager.CMakeBuildConfiguration + + + + CMAKE_BUILD_TYPE:STRING=Debug + + C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Debug + + + + + + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Build + + ProjectExplorer.BuildSteps.Build + + + + + + clean + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + CMakeProjectManager.CMakeBuildConfiguration + + + + CMAKE_BUILD_TYPE:STRING=Release + + C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Release + + + + + + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Build + + ProjectExplorer.BuildSteps.Build + + + + + + clean + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + CMakeProjectManager.CMakeBuildConfiguration + + + + CMAKE_BUILD_TYPE:STRING=RelWithDebInfo + + C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Release with Debug Information + + + + + + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Build + + ProjectExplorer.BuildSteps.Build + + + + + + clean + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release with Debug Information + Release with Debug Information + CMakeProjectManager.CMakeBuildConfiguration + + + + CMAKE_BUILD_TYPE:STRING=MinSizeRel + + C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Minimum Size Release + + + + + + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Build + + ProjectExplorer.BuildSteps.Build + + + + + + clean + + true + Make + + CMakeProjectManager.MakeStep + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Minimum Size Release + Minimum Size Release + CMakeProjectManager.CMakeBuildConfiguration + + 5 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + + + %{buildDir} + Custom Executable + + ProjectExplorer.CustomExecutableRunConfiguration + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + diff --git a/ext/openssl/windows/x64/bin/libeay32.dll b/ext/openssl/windows/x64/bin/libeay32.dll index 92c3edac..96ab836a 100644 Binary files a/ext/openssl/windows/x64/bin/libeay32.dll and b/ext/openssl/windows/x64/bin/libeay32.dll differ diff --git a/ext/openssl/windows/x64/bin/openssl.exe b/ext/openssl/windows/x64/bin/openssl.exe index 9cdf68c4..5c4b361b 100644 Binary files a/ext/openssl/windows/x64/bin/openssl.exe and b/ext/openssl/windows/x64/bin/openssl.exe differ diff --git a/ext/openssl/windows/x64/bin/ssleay32.dll b/ext/openssl/windows/x64/bin/ssleay32.dll index 3b172b57..7798e081 100644 Binary files a/ext/openssl/windows/x64/bin/ssleay32.dll and b/ext/openssl/windows/x64/bin/ssleay32.dll differ diff --git a/ext/openssl/windows/x64/include/openssl/asn1.h b/ext/openssl/windows/x64/include/openssl/asn1.h index 68e791fc..35a2b2aa 100644 --- a/ext/openssl/windows/x64/include/openssl/asn1.h +++ b/ext/openssl/windows/x64/include/openssl/asn1.h @@ -1365,6 +1365,7 @@ void ERR_load_ASN1_strings(void); # define ASN1_R_MSTRING_NOT_UNIVERSAL 139 # define ASN1_R_MSTRING_WRONG_TAG 140 # define ASN1_R_NESTED_ASN1_STRING 197 +# define ASN1_R_NESTED_TOO_DEEP 219 # define ASN1_R_NON_HEX_CHARACTERS 141 # define ASN1_R_NOT_ASCII_FORMAT 190 # define ASN1_R_NOT_ENOUGH_DATA 142 diff --git a/ext/openssl/windows/x64/include/openssl/dh.h b/ext/openssl/windows/x64/include/openssl/dh.h index a228c7a7..80b28fb3 100644 --- a/ext/openssl/windows/x64/include/openssl/dh.h +++ b/ext/openssl/windows/x64/include/openssl/dh.h @@ -257,11 +257,13 @@ DH *DH_get_1024_160(void); DH *DH_get_2048_224(void); DH *DH_get_2048_256(void); +# ifndef OPENSSL_NO_CMS /* RFC2631 KDF */ int DH_KDF_X9_42(unsigned char *out, size_t outlen, const unsigned char *Z, size_t Zlen, ASN1_OBJECT *key_oid, const unsigned char *ukm, size_t ukmlen, const EVP_MD *md); +# endif # define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \ EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ diff --git a/ext/openssl/windows/x64/include/openssl/evp.h b/ext/openssl/windows/x64/include/openssl/evp.h index d258ef87..cf1de15e 100644 --- a/ext/openssl/windows/x64/include/openssl/evp.h +++ b/ext/openssl/windows/x64/include/openssl/evp.h @@ -1363,6 +1363,98 @@ void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, const char *type, const char *value)); +void EVP_PKEY_meth_get_init(EVP_PKEY_METHOD *pmeth, + int (**pinit) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_get_copy(EVP_PKEY_METHOD *pmeth, + int (**pcopy) (EVP_PKEY_CTX *dst, + EVP_PKEY_CTX *src)); + +void EVP_PKEY_meth_get_cleanup(EVP_PKEY_METHOD *pmeth, + void (**pcleanup) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_get_paramgen(EVP_PKEY_METHOD *pmeth, + int (**pparamgen_init) (EVP_PKEY_CTX *ctx), + int (**pparamgen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_get_keygen(EVP_PKEY_METHOD *pmeth, + int (**pkeygen_init) (EVP_PKEY_CTX *ctx), + int (**pkeygen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_get_sign(EVP_PKEY_METHOD *pmeth, + int (**psign_init) (EVP_PKEY_CTX *ctx), + int (**psign) (EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_verify(EVP_PKEY_METHOD *pmeth, + int (**pverify_init) (EVP_PKEY_CTX *ctx), + int (**pverify) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_verify_recover(EVP_PKEY_METHOD *pmeth, + int (**pverify_recover_init) (EVP_PKEY_CTX + *ctx), + int (**pverify_recover) (EVP_PKEY_CTX + *ctx, + unsigned char + *sig, + size_t *siglen, + const unsigned + char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_signctx(EVP_PKEY_METHOD *pmeth, + int (**psignctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (**psignctx) (EVP_PKEY_CTX *ctx, + unsigned char *sig, + size_t *siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_get_verifyctx(EVP_PKEY_METHOD *pmeth, + int (**pverifyctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (**pverifyctx) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + int siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_get_encrypt(EVP_PKEY_METHOD *pmeth, + int (**pencrypt_init) (EVP_PKEY_CTX *ctx), + int (**pencryptfn) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_get_decrypt(EVP_PKEY_METHOD *pmeth, + int (**pdecrypt_init) (EVP_PKEY_CTX *ctx), + int (**pdecrypt) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_get_derive(EVP_PKEY_METHOD *pmeth, + int (**pderive_init) (EVP_PKEY_CTX *ctx), + int (**pderive) (EVP_PKEY_CTX *ctx, + unsigned char *key, + size_t *keylen)); + +void EVP_PKEY_meth_get_ctrl(EVP_PKEY_METHOD *pmeth, + int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1, + void *p2), + int (**pctrl_str) (EVP_PKEY_CTX *ctx, + const char *type, + const char *value)); + void EVP_add_alg_module(void); /* BEGIN ERROR CODES */ diff --git a/ext/openssl/windows/x64/include/openssl/opensslv.h b/ext/openssl/windows/x64/include/openssl/opensslv.h index 825a330a..77f124e2 100644 --- a/ext/openssl/windows/x64/include/openssl/opensslv.h +++ b/ext/openssl/windows/x64/include/openssl/opensslv.h @@ -30,11 +30,11 @@ extern "C" { * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for * major minor fix final patch/beta) */ -# define OPENSSL_VERSION_NUMBER 0x100020cfL +# define OPENSSL_VERSION_NUMBER 0x100020ffL # ifdef OPENSSL_FIPS -# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2l-fips 25 May 2017" +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2o-fips 27 Mar 2018" # else -# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2l 25 May 2017" +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2o 27 Mar 2018" # endif # define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT diff --git a/ext/openssl/windows/x64/include/openssl/ssl.h b/ext/openssl/windows/x64/include/openssl/ssl.h index 90aeb0ce..3cf96a23 100644 --- a/ext/openssl/windows/x64/include/openssl/ssl.h +++ b/ext/openssl/windows/x64/include/openssl/ssl.h @@ -1727,7 +1727,7 @@ extern "C" { # define SSL_ST_BEFORE 0x4000 # define SSL_ST_OK 0x03 # define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT) -# define SSL_ST_ERR 0x05 +# define SSL_ST_ERR (0x05|SSL_ST_INIT) # define SSL_CB_LOOP 0x01 # define SSL_CB_EXIT 0x02 diff --git a/ext/openssl/windows/x64/include/openssl/symhacks.h b/ext/openssl/windows/x64/include/openssl/symhacks.h index 239fa4fb..30019579 100644 --- a/ext/openssl/windows/x64/include/openssl/symhacks.h +++ b/ext/openssl/windows/x64/include/openssl/symhacks.h @@ -280,6 +280,8 @@ # define OPENSSL_add_all_algorithms_conf OPENSSL_add_all_algo_conf # undef EVP_PKEY_meth_set_verify_recover # define EVP_PKEY_meth_set_verify_recover EVP_PKEY_meth_set_vrfy_recover +# undef EVP_PKEY_meth_get_verify_recover +# define EVP_PKEY_meth_get_verify_recover EVP_PKEY_meth_get_vrfy_recover /* Hack some long EC names */ # undef EC_GROUP_set_point_conversion_form diff --git a/ext/openssl/windows/x64/include/openssl/tls1.h b/ext/openssl/windows/x64/include/openssl/tls1.h index 7e237d06..dd1d8c10 100644 --- a/ext/openssl/windows/x64/include/openssl/tls1.h +++ b/ext/openssl/windows/x64/include/openssl/tls1.h @@ -317,7 +317,7 @@ int SSL_get_servername_type(const SSL *s); */ int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, const char *label, size_t llen, - const unsigned char *p, size_t plen, + const unsigned char *context, size_t contextlen, int use_context); int SSL_get_sigalgs(SSL *s, int idx, diff --git a/ext/openssl/windows/x64/lib/engines/4758cca.dll b/ext/openssl/windows/x64/lib/engines/4758cca.dll index 0df3784a..7b678fd9 100644 Binary files a/ext/openssl/windows/x64/lib/engines/4758cca.dll and b/ext/openssl/windows/x64/lib/engines/4758cca.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/aep.dll b/ext/openssl/windows/x64/lib/engines/aep.dll index 95757767..616204c4 100644 Binary files a/ext/openssl/windows/x64/lib/engines/aep.dll and b/ext/openssl/windows/x64/lib/engines/aep.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/atalla.dll b/ext/openssl/windows/x64/lib/engines/atalla.dll index 98899cdf..0aad54cd 100644 Binary files a/ext/openssl/windows/x64/lib/engines/atalla.dll and b/ext/openssl/windows/x64/lib/engines/atalla.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/capi.dll b/ext/openssl/windows/x64/lib/engines/capi.dll index f618149d..d76f9d7b 100644 Binary files a/ext/openssl/windows/x64/lib/engines/capi.dll and b/ext/openssl/windows/x64/lib/engines/capi.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/chil.dll b/ext/openssl/windows/x64/lib/engines/chil.dll index 0731de35..b9914c77 100644 Binary files a/ext/openssl/windows/x64/lib/engines/chil.dll and b/ext/openssl/windows/x64/lib/engines/chil.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/cswift.dll b/ext/openssl/windows/x64/lib/engines/cswift.dll index e37bc735..5d6dc83b 100644 Binary files a/ext/openssl/windows/x64/lib/engines/cswift.dll and b/ext/openssl/windows/x64/lib/engines/cswift.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/gmp.dll b/ext/openssl/windows/x64/lib/engines/gmp.dll index fa090ef2..199bef34 100644 Binary files a/ext/openssl/windows/x64/lib/engines/gmp.dll and b/ext/openssl/windows/x64/lib/engines/gmp.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/gost.dll b/ext/openssl/windows/x64/lib/engines/gost.dll index 867f97a2..29ab5be7 100644 Binary files a/ext/openssl/windows/x64/lib/engines/gost.dll and b/ext/openssl/windows/x64/lib/engines/gost.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/nuron.dll b/ext/openssl/windows/x64/lib/engines/nuron.dll index 187c2853..a0cd8ceb 100644 Binary files a/ext/openssl/windows/x64/lib/engines/nuron.dll and b/ext/openssl/windows/x64/lib/engines/nuron.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/padlock.dll b/ext/openssl/windows/x64/lib/engines/padlock.dll index 0adfb57c..455a98aa 100644 Binary files a/ext/openssl/windows/x64/lib/engines/padlock.dll and b/ext/openssl/windows/x64/lib/engines/padlock.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/sureware.dll b/ext/openssl/windows/x64/lib/engines/sureware.dll index f66ce688..29b52ade 100644 Binary files a/ext/openssl/windows/x64/lib/engines/sureware.dll and b/ext/openssl/windows/x64/lib/engines/sureware.dll differ diff --git a/ext/openssl/windows/x64/lib/engines/ubsec.dll b/ext/openssl/windows/x64/lib/engines/ubsec.dll index 095462c9..3d8e4a4e 100644 Binary files a/ext/openssl/windows/x64/lib/engines/ubsec.dll and b/ext/openssl/windows/x64/lib/engines/ubsec.dll differ diff --git a/ext/openssl/windows/x64/lib/libeay32.lib b/ext/openssl/windows/x64/lib/libeay32.lib index c786d549..9eecfc06 100644 Binary files a/ext/openssl/windows/x64/lib/libeay32.lib and b/ext/openssl/windows/x64/lib/libeay32.lib differ diff --git a/ext/openssl/windows/x64/lib/ssleay32.lib b/ext/openssl/windows/x64/lib/ssleay32.lib index f93da7e0..360420b2 100644 Binary files a/ext/openssl/windows/x64/lib/ssleay32.lib and b/ext/openssl/windows/x64/lib/ssleay32.lib differ diff --git a/ext/openssl/windows/x86/bin/libeay32.dll b/ext/openssl/windows/x86/bin/libeay32.dll index 7f89690d..a2669244 100644 Binary files a/ext/openssl/windows/x86/bin/libeay32.dll and b/ext/openssl/windows/x86/bin/libeay32.dll differ diff --git a/ext/openssl/windows/x86/bin/openssl.exe b/ext/openssl/windows/x86/bin/openssl.exe index e99c4ec4..926b05d7 100644 Binary files a/ext/openssl/windows/x86/bin/openssl.exe and b/ext/openssl/windows/x86/bin/openssl.exe differ diff --git a/ext/openssl/windows/x86/bin/ssleay32.dll b/ext/openssl/windows/x86/bin/ssleay32.dll index 5b86b877..7224eca6 100644 Binary files a/ext/openssl/windows/x86/bin/ssleay32.dll and b/ext/openssl/windows/x86/bin/ssleay32.dll differ diff --git a/ext/openssl/windows/x86/include/openssl/asn1.h b/ext/openssl/windows/x86/include/openssl/asn1.h index 68e791fc..35a2b2aa 100644 --- a/ext/openssl/windows/x86/include/openssl/asn1.h +++ b/ext/openssl/windows/x86/include/openssl/asn1.h @@ -1365,6 +1365,7 @@ void ERR_load_ASN1_strings(void); # define ASN1_R_MSTRING_NOT_UNIVERSAL 139 # define ASN1_R_MSTRING_WRONG_TAG 140 # define ASN1_R_NESTED_ASN1_STRING 197 +# define ASN1_R_NESTED_TOO_DEEP 219 # define ASN1_R_NON_HEX_CHARACTERS 141 # define ASN1_R_NOT_ASCII_FORMAT 190 # define ASN1_R_NOT_ENOUGH_DATA 142 diff --git a/ext/openssl/windows/x86/include/openssl/dh.h b/ext/openssl/windows/x86/include/openssl/dh.h index a228c7a7..80b28fb3 100644 --- a/ext/openssl/windows/x86/include/openssl/dh.h +++ b/ext/openssl/windows/x86/include/openssl/dh.h @@ -257,11 +257,13 @@ DH *DH_get_1024_160(void); DH *DH_get_2048_224(void); DH *DH_get_2048_256(void); +# ifndef OPENSSL_NO_CMS /* RFC2631 KDF */ int DH_KDF_X9_42(unsigned char *out, size_t outlen, const unsigned char *Z, size_t Zlen, ASN1_OBJECT *key_oid, const unsigned char *ukm, size_t ukmlen, const EVP_MD *md); +# endif # define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \ EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \ diff --git a/ext/openssl/windows/x86/include/openssl/evp.h b/ext/openssl/windows/x86/include/openssl/evp.h index d258ef87..cf1de15e 100644 --- a/ext/openssl/windows/x86/include/openssl/evp.h +++ b/ext/openssl/windows/x86/include/openssl/evp.h @@ -1363,6 +1363,98 @@ void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth, const char *type, const char *value)); +void EVP_PKEY_meth_get_init(EVP_PKEY_METHOD *pmeth, + int (**pinit) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_get_copy(EVP_PKEY_METHOD *pmeth, + int (**pcopy) (EVP_PKEY_CTX *dst, + EVP_PKEY_CTX *src)); + +void EVP_PKEY_meth_get_cleanup(EVP_PKEY_METHOD *pmeth, + void (**pcleanup) (EVP_PKEY_CTX *ctx)); + +void EVP_PKEY_meth_get_paramgen(EVP_PKEY_METHOD *pmeth, + int (**pparamgen_init) (EVP_PKEY_CTX *ctx), + int (**pparamgen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_get_keygen(EVP_PKEY_METHOD *pmeth, + int (**pkeygen_init) (EVP_PKEY_CTX *ctx), + int (**pkeygen) (EVP_PKEY_CTX *ctx, + EVP_PKEY *pkey)); + +void EVP_PKEY_meth_get_sign(EVP_PKEY_METHOD *pmeth, + int (**psign_init) (EVP_PKEY_CTX *ctx), + int (**psign) (EVP_PKEY_CTX *ctx, + unsigned char *sig, size_t *siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_verify(EVP_PKEY_METHOD *pmeth, + int (**pverify_init) (EVP_PKEY_CTX *ctx), + int (**pverify) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + size_t siglen, + const unsigned char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_verify_recover(EVP_PKEY_METHOD *pmeth, + int (**pverify_recover_init) (EVP_PKEY_CTX + *ctx), + int (**pverify_recover) (EVP_PKEY_CTX + *ctx, + unsigned char + *sig, + size_t *siglen, + const unsigned + char *tbs, + size_t tbslen)); + +void EVP_PKEY_meth_get_signctx(EVP_PKEY_METHOD *pmeth, + int (**psignctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (**psignctx) (EVP_PKEY_CTX *ctx, + unsigned char *sig, + size_t *siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_get_verifyctx(EVP_PKEY_METHOD *pmeth, + int (**pverifyctx_init) (EVP_PKEY_CTX *ctx, + EVP_MD_CTX *mctx), + int (**pverifyctx) (EVP_PKEY_CTX *ctx, + const unsigned char *sig, + int siglen, + EVP_MD_CTX *mctx)); + +void EVP_PKEY_meth_get_encrypt(EVP_PKEY_METHOD *pmeth, + int (**pencrypt_init) (EVP_PKEY_CTX *ctx), + int (**pencryptfn) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_get_decrypt(EVP_PKEY_METHOD *pmeth, + int (**pdecrypt_init) (EVP_PKEY_CTX *ctx), + int (**pdecrypt) (EVP_PKEY_CTX *ctx, + unsigned char *out, + size_t *outlen, + const unsigned char *in, + size_t inlen)); + +void EVP_PKEY_meth_get_derive(EVP_PKEY_METHOD *pmeth, + int (**pderive_init) (EVP_PKEY_CTX *ctx), + int (**pderive) (EVP_PKEY_CTX *ctx, + unsigned char *key, + size_t *keylen)); + +void EVP_PKEY_meth_get_ctrl(EVP_PKEY_METHOD *pmeth, + int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1, + void *p2), + int (**pctrl_str) (EVP_PKEY_CTX *ctx, + const char *type, + const char *value)); + void EVP_add_alg_module(void); /* BEGIN ERROR CODES */ diff --git a/ext/openssl/windows/x86/include/openssl/opensslv.h b/ext/openssl/windows/x86/include/openssl/opensslv.h index 825a330a..77f124e2 100644 --- a/ext/openssl/windows/x86/include/openssl/opensslv.h +++ b/ext/openssl/windows/x86/include/openssl/opensslv.h @@ -30,11 +30,11 @@ extern "C" { * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for * major minor fix final patch/beta) */ -# define OPENSSL_VERSION_NUMBER 0x100020cfL +# define OPENSSL_VERSION_NUMBER 0x100020ffL # ifdef OPENSSL_FIPS -# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2l-fips 25 May 2017" +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2o-fips 27 Mar 2018" # else -# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2l 25 May 2017" +# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2o 27 Mar 2018" # endif # define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT diff --git a/ext/openssl/windows/x86/include/openssl/ssl.h b/ext/openssl/windows/x86/include/openssl/ssl.h index 90aeb0ce..3cf96a23 100644 --- a/ext/openssl/windows/x86/include/openssl/ssl.h +++ b/ext/openssl/windows/x86/include/openssl/ssl.h @@ -1727,7 +1727,7 @@ extern "C" { # define SSL_ST_BEFORE 0x4000 # define SSL_ST_OK 0x03 # define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT) -# define SSL_ST_ERR 0x05 +# define SSL_ST_ERR (0x05|SSL_ST_INIT) # define SSL_CB_LOOP 0x01 # define SSL_CB_EXIT 0x02 diff --git a/ext/openssl/windows/x86/include/openssl/symhacks.h b/ext/openssl/windows/x86/include/openssl/symhacks.h index 239fa4fb..30019579 100644 --- a/ext/openssl/windows/x86/include/openssl/symhacks.h +++ b/ext/openssl/windows/x86/include/openssl/symhacks.h @@ -280,6 +280,8 @@ # define OPENSSL_add_all_algorithms_conf OPENSSL_add_all_algo_conf # undef EVP_PKEY_meth_set_verify_recover # define EVP_PKEY_meth_set_verify_recover EVP_PKEY_meth_set_vrfy_recover +# undef EVP_PKEY_meth_get_verify_recover +# define EVP_PKEY_meth_get_verify_recover EVP_PKEY_meth_get_vrfy_recover /* Hack some long EC names */ # undef EC_GROUP_set_point_conversion_form diff --git a/ext/openssl/windows/x86/include/openssl/tls1.h b/ext/openssl/windows/x86/include/openssl/tls1.h index 7e237d06..dd1d8c10 100644 --- a/ext/openssl/windows/x86/include/openssl/tls1.h +++ b/ext/openssl/windows/x86/include/openssl/tls1.h @@ -317,7 +317,7 @@ int SSL_get_servername_type(const SSL *s); */ int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, const char *label, size_t llen, - const unsigned char *p, size_t plen, + const unsigned char *context, size_t contextlen, int use_context); int SSL_get_sigalgs(SSL *s, int idx, diff --git a/ext/openssl/windows/x86/lib/engines/4758cca.dll b/ext/openssl/windows/x86/lib/engines/4758cca.dll index 1540ccdf..cc476456 100644 Binary files a/ext/openssl/windows/x86/lib/engines/4758cca.dll and b/ext/openssl/windows/x86/lib/engines/4758cca.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/aep.dll b/ext/openssl/windows/x86/lib/engines/aep.dll index 85b31c76..59e0cf37 100644 Binary files a/ext/openssl/windows/x86/lib/engines/aep.dll and b/ext/openssl/windows/x86/lib/engines/aep.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/atalla.dll b/ext/openssl/windows/x86/lib/engines/atalla.dll index 6511cffc..30726735 100644 Binary files a/ext/openssl/windows/x86/lib/engines/atalla.dll and b/ext/openssl/windows/x86/lib/engines/atalla.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/capi.dll b/ext/openssl/windows/x86/lib/engines/capi.dll index d60138b1..775612a1 100644 Binary files a/ext/openssl/windows/x86/lib/engines/capi.dll and b/ext/openssl/windows/x86/lib/engines/capi.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/chil.dll b/ext/openssl/windows/x86/lib/engines/chil.dll index 5449c966..79a37cc6 100644 Binary files a/ext/openssl/windows/x86/lib/engines/chil.dll and b/ext/openssl/windows/x86/lib/engines/chil.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/cswift.dll b/ext/openssl/windows/x86/lib/engines/cswift.dll index 030e0bd5..ffa3d39d 100644 Binary files a/ext/openssl/windows/x86/lib/engines/cswift.dll and b/ext/openssl/windows/x86/lib/engines/cswift.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/gmp.dll b/ext/openssl/windows/x86/lib/engines/gmp.dll index 9992b7b1..98ae5061 100644 Binary files a/ext/openssl/windows/x86/lib/engines/gmp.dll and b/ext/openssl/windows/x86/lib/engines/gmp.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/gost.dll b/ext/openssl/windows/x86/lib/engines/gost.dll index 0e6ffaa6..6f9e1c28 100644 Binary files a/ext/openssl/windows/x86/lib/engines/gost.dll and b/ext/openssl/windows/x86/lib/engines/gost.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/nuron.dll b/ext/openssl/windows/x86/lib/engines/nuron.dll index e63d35be..9f1acf36 100644 Binary files a/ext/openssl/windows/x86/lib/engines/nuron.dll and b/ext/openssl/windows/x86/lib/engines/nuron.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/padlock.dll b/ext/openssl/windows/x86/lib/engines/padlock.dll index 54aacd24..e8612a3c 100644 Binary files a/ext/openssl/windows/x86/lib/engines/padlock.dll and b/ext/openssl/windows/x86/lib/engines/padlock.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/sureware.dll b/ext/openssl/windows/x86/lib/engines/sureware.dll index f55625a2..987bbdff 100644 Binary files a/ext/openssl/windows/x86/lib/engines/sureware.dll and b/ext/openssl/windows/x86/lib/engines/sureware.dll differ diff --git a/ext/openssl/windows/x86/lib/engines/ubsec.dll b/ext/openssl/windows/x86/lib/engines/ubsec.dll index 18e59573..7872a832 100644 Binary files a/ext/openssl/windows/x86/lib/engines/ubsec.dll and b/ext/openssl/windows/x86/lib/engines/ubsec.dll differ diff --git a/ext/openssl/windows/x86/lib/libeay32.lib b/ext/openssl/windows/x86/lib/libeay32.lib index adb0edd5..7ffa761c 100644 Binary files a/ext/openssl/windows/x86/lib/libeay32.lib and b/ext/openssl/windows/x86/lib/libeay32.lib differ diff --git a/ext/openssl/windows/x86/lib/ssleay32.lib b/ext/openssl/windows/x86/lib/ssleay32.lib index 3128e77c..18bab9fb 100644 Binary files a/ext/openssl/windows/x86/lib/ssleay32.lib and b/ext/openssl/windows/x86/lib/ssleay32.lib differ diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index afb80c07..54cafabc 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -25,9 +25,16 @@ target_link_libraries (synergy shared) if (WIN32) include_directories ($ENV{BONJOUR_SDK_HOME}/Include) - find_library (DNSSD_LIB dnssd.lib + if (CMAKE_SIZEOF_VOID_P EQUAL 8) + find_library (DNSSD_LIB dnssd.lib HINTS ENV BONJOUR_SDK_HOME PATH_SUFFIXES "Lib/x64") + else() + find_library (DNSSD_LIB dnssd.lib + HINTS ENV BONJOUR_SDK_HOME + PATH_SUFFIXES "Lib/Win32") + endif() + elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") target_link_libraries (synergy dns_sd) endif() diff --git a/src/lib/arch/IArchNetwork.h b/src/lib/arch/IArchNetwork.h index d71f8d88..0d58dc85 100644 --- a/src/lib/arch/IArchNetwork.h +++ b/src/lib/arch/IArchNetwork.h @@ -64,6 +64,7 @@ public: enum EAddressFamily { kUNKNOWN, kINET, + kINET6, }; //! Supported socket types diff --git a/src/lib/arch/unix/ArchNetworkBSD.cpp b/src/lib/arch/unix/ArchNetworkBSD.cpp index 5c80a7ad..14b57882 100644 --- a/src/lib/arch/unix/ArchNetworkBSD.cpp +++ b/src/lib/arch/unix/ArchNetworkBSD.cpp @@ -18,22 +18,22 @@ #include "arch/unix/ArchNetworkBSD.h" +#include "arch/Arch.h" #include "arch/unix/ArchMultithreadPosix.h" #include "arch/unix/XArchUnix.h" -#include "arch/Arch.h" #if HAVE_UNISTD_H # include #endif -#include #include +#include #if !defined(TCP_NODELAY) # include #endif #include -#include #include -#include +#include +#include #if HAVE_POLL # include @@ -52,7 +52,8 @@ static const int s_family[] = { PF_UNSPEC, - PF_INET + PF_INET, + PF_INET6, }; static const int s_type[] = { SOCK_DGRAM, @@ -87,8 +88,7 @@ inet_aton(const char* cp, struct in_addr* inp) // ArchNetworkBSD::ArchNetworkBSD() -{ -} += default; ArchNetworkBSD::~ArchNetworkBSD() { @@ -119,7 +119,7 @@ ArchNetworkBSD::newSocket(EAddressFamily family, ESocketType type) } // allocate socket object - ArchSocketImpl* newSocket = new ArchSocketImpl; + auto* newSocket = new ArchSocketImpl; newSocket->m_fd = fd; newSocket->m_refCount = 1; return newSocket; @@ -191,7 +191,7 @@ ArchNetworkBSD::bindSocket(ArchSocket s, ArchNetAddress addr) assert(s != NULL); assert(addr != NULL); - if (bind(s->m_fd, &addr->m_addr, addr->m_len) == -1) { + if (bind(s->m_fd, TYPED_ADDR(struct sockaddr, addr), addr->m_len) == -1) { throwError(errno); } } @@ -214,25 +214,25 @@ ArchNetworkBSD::acceptSocket(ArchSocket s, ArchNetAddress* addr) // if user passed NULL in addr then use scratch space ArchNetAddress dummy; - if (addr == NULL) { + if (addr == nullptr) { addr = &dummy; } // create new socket and address - ArchSocketImpl* newSocket = new ArchSocketImpl; + auto* newSocket = new ArchSocketImpl; *addr = new ArchNetAddressImpl; // accept on socket - ACCEPT_TYPE_ARG3 len = (ACCEPT_TYPE_ARG3)((*addr)->m_len); - int fd = accept(s->m_fd, &(*addr)->m_addr, &len); - (*addr)->m_len = (socklen_t)len; + auto len = ((*addr)->m_len); + int fd = accept(s->m_fd, TYPED_ADDR(struct sockaddr, (*addr)), &len); + (*addr)->m_len = len; if (fd == -1) { int err = errno; delete newSocket; delete *addr; - *addr = NULL; + *addr = nullptr; if (err == EAGAIN) { - return NULL; + return nullptr; } throwError(err); } @@ -244,7 +244,7 @@ ArchNetworkBSD::acceptSocket(ArchSocket s, ArchNetAddress* addr) close(fd); delete newSocket; delete *addr; - *addr = NULL; + *addr = nullptr; throw; } @@ -266,7 +266,7 @@ ArchNetworkBSD::connectSocket(ArchSocket s, ArchNetAddress addr) assert(s != NULL); assert(addr != NULL); - if (connect(s->m_fd, &addr->m_addr, addr->m_len) == -1) { + if (connect(s->m_fd, TYPED_ADDR(struct sockaddr, addr), addr->m_len) == -1) { if (errno == EISCONN) { return true; } @@ -294,11 +294,11 @@ ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout) } // allocate space for translated query - struct pollfd* pfd = new struct pollfd[1 + num]; + auto* pfd = new struct pollfd[1 + num]; // translate query for (int i = 0; i < num; ++i) { - pfd[i].fd = (pe[i].m_socket == NULL) ? -1 : pe[i].m_socket->m_fd; + pfd[i].fd = (pe[i].m_socket == nullptr) ? -1 : pe[i].m_socket->m_fd; pfd[i].events = 0; if ((pe[i].m_events & kPOLLIN) != 0) { pfd[i].events |= POLLIN; @@ -311,7 +311,7 @@ ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout) // add the unblock pipe const int* unblockPipe = getUnblockPipe(); - if (unblockPipe != NULL) { + if (unblockPipe != nullptr) { pfd[n].fd = unblockPipe[0]; pfd[n].events = POLLIN; ++n; @@ -324,7 +324,7 @@ ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout) n = poll(pfd, n, t); // reset the unblock pipe - if (n > 0 && unblockPipe != NULL && (pfd[num].revents & POLLIN) != 0) { + if (n > 0 && unblockPipe != nullptr && (pfd[num].revents & POLLIN) != 0) { // the unblock event was signalled. flush the pipe. char dummy[100]; int ignore; @@ -500,7 +500,7 @@ void ArchNetworkBSD::unblockPollSocket(ArchThread thread) { const int* unblockPipe = getUnblockPipeForThread(thread); - if (unblockPipe != NULL) { + if (unblockPipe != nullptr) { char dummy = 0; int ignore; @@ -545,9 +545,9 @@ ArchNetworkBSD::throwErrorOnSocket(ArchSocket s) // get the error from the socket layer int err = 0; - socklen_t size = (socklen_t)sizeof(err); + auto size = static_cast(sizeof(err)); if (getsockopt(s->m_fd, SOL_SOCKET, SO_ERROR, - (optval_t*)&err, &size) == -1) { + reinterpret_cast(&err), &size) == -1) { err = errno; } @@ -584,16 +584,16 @@ ArchNetworkBSD::setNoDelayOnSocket(ArchSocket s, bool noDelay) // get old state int oflag; - socklen_t size = (socklen_t)sizeof(oflag); + auto size = static_cast(sizeof(oflag)); if (getsockopt(s->m_fd, IPPROTO_TCP, TCP_NODELAY, - (optval_t*)&oflag, &size) == -1) { + reinterpret_cast(&oflag), &size) == -1) { throwError(errno); } int flag = noDelay ? 1 : 0; - size = (socklen_t)sizeof(flag); + size = static_cast(sizeof(flag)); if (setsockopt(s->m_fd, IPPROTO_TCP, TCP_NODELAY, - (optval_t*)&flag, size) == -1) { + reinterpret_cast(&flag), size) == -1) { throwError(errno); } @@ -607,16 +607,16 @@ ArchNetworkBSD::setReuseAddrOnSocket(ArchSocket s, bool reuse) // get old state int oflag; - socklen_t size = (socklen_t)sizeof(oflag); + auto size = static_cast(sizeof(oflag)); if (getsockopt(s->m_fd, SOL_SOCKET, SO_REUSEADDR, - (optval_t*)&oflag, &size) == -1) { + reinterpret_cast(&oflag), &size) == -1) { throwError(errno); } int flag = reuse ? 1 : 0; - size = (socklen_t)sizeof(flag); + size = static_cast(sizeof(flag)); if (setsockopt(s->m_fd, SOL_SOCKET, SO_REUSEADDR, - (optval_t*)&flag, size) == -1) { + reinterpret_cast(&flag), size) == -1) { throwError(errno); } @@ -640,20 +640,27 @@ ArchNetAddress ArchNetworkBSD::newAnyAddr(EAddressFamily family) { // allocate address - ArchNetAddressImpl* addr = new ArchNetAddressImpl; + auto* addr = new ArchNetAddressImpl; // fill it in switch (family) { case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); + auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); ipAddr->sin_family = AF_INET; ipAddr->sin_port = 0; ipAddr->sin_addr.s_addr = INADDR_ANY; - addr->m_len = (socklen_t)sizeof(struct sockaddr_in); + addr->m_len = static_cast(sizeof(struct sockaddr_in)); break; } + case kINET6: { + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + ipAddr->sin6_family = AF_INET6; + ipAddr->sin6_port = 0; + memcpy(&ipAddr->sin6_addr, &in6addr_any, sizeof(in6addr_any)); + addr->m_len = (socklen_t)sizeof(struct sockaddr_in6); + break; + } default: delete addr; assert(0 && "invalid family"); @@ -675,50 +682,33 @@ ArchNetAddress ArchNetworkBSD::nameToAddr(const std::string& name) { // allocate address - ArchNetAddressImpl* addr = new ArchNetAddressImpl; + auto* addr = new ArchNetAddressImpl; - // try to convert assuming an IPv4 dot notation address - struct sockaddr_in inaddr; - memset(&inaddr, 0, sizeof(inaddr)); - if (inet_aton(name.c_str(), &inaddr.sin_addr) != 0) { - // it's a dot notation address - addr->m_len = (socklen_t)sizeof(struct sockaddr_in); - inaddr.sin_family = AF_INET; - inaddr.sin_port = 0; - memcpy(&addr->m_addr, &inaddr, addr->m_len); - } + char ipstr[INET6_ADDRSTRLEN]; + struct addrinfo hints; + struct addrinfo *p; + int ret; - else { - // mutexed address lookup (ugh) - ARCH->lockMutex(m_mutex); - struct hostent* info = gethostbyname(name.c_str()); - if (info == NULL) { - ARCH->unlockMutex(m_mutex); - delete addr; - throwNameError(h_errno); - } + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; - // copy over address (only IPv4 currently supported) - if (info->h_addrtype == AF_INET) { - addr->m_len = (socklen_t)sizeof(struct sockaddr_in); - inaddr.sin_family = info->h_addrtype; - inaddr.sin_port = 0; - memcpy(&inaddr.sin_addr, info->h_addr_list[0], - sizeof(inaddr.sin_addr)); - memcpy(&addr->m_addr, &inaddr, addr->m_len); - } - else { - ARCH->unlockMutex(m_mutex); - delete addr; - throw XArchNetworkNameUnsupported( - "The requested name is valid but " - "does not have a supported address family"); - } - - // done with static buffer + // done with static buffer + ARCH->lockMutex(m_mutex); + if ((ret = getaddrinfo(name.c_str(), NULL, &hints, &p)) != 0) { ARCH->unlockMutex(m_mutex); + delete addr; + throwNameError(ret); } + if (p->ai_family == AF_INET) { + addr->m_len = (socklen_t)sizeof(struct sockaddr_in); + } else { + addr->m_len = (socklen_t)sizeof(struct sockaddr_in6); + } + memcpy(&addr->m_addr, p->ai_addr, addr->m_len); + freeaddrinfo(p); + ARCH->unlockMutex(m_mutex); + return addr; } @@ -737,15 +727,16 @@ ArchNetworkBSD::addrToName(ArchNetAddress addr) // mutexed name lookup (ugh) ARCH->lockMutex(m_mutex); - struct hostent* info = gethostbyaddr(&addr->m_addr, - addr->m_len, addr->m_addr.sa_family); - if (info == NULL) { - ARCH->unlockMutex(m_mutex); - throwNameError(h_errno); + char host[1024]; + char service[20]; + int ret = getnameinfo(TYPED_ADDR(struct sockaddr, addr), addr->m_len, host, sizeof(host), service, sizeof(service), 0); + if (ret != 0) { + ARCH->unlockMutex(m_mutex); + throwNameError(ret); } // save (primary) name - std::string name = info->h_name; + std::string name = host; // done with static buffer ARCH->unlockMutex(m_mutex); @@ -760,14 +751,22 @@ ArchNetworkBSD::addrToString(ArchNetAddress addr) switch (getAddrFamily(addr)) { case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); + auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); ARCH->lockMutex(m_mutex); std::string s = inet_ntoa(ipAddr->sin_addr); ARCH->unlockMutex(m_mutex); return s; } + case kINET6: { + char strAddr[INET6_ADDRSTRLEN]; + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + ARCH->lockMutex(m_mutex); + inet_ntop(AF_INET6, &ipAddr->sin6_addr, strAddr, INET6_ADDRSTRLEN); + ARCH->unlockMutex(m_mutex); + return strAddr; + } + default: assert(0 && "unknown address family"); return ""; @@ -779,9 +778,11 @@ ArchNetworkBSD::getAddrFamily(ArchNetAddress addr) { assert(addr != NULL); - switch (addr->m_addr.sa_family) { + switch (addr->m_addr.ss_family) { case AF_INET: return kINET; + case AF_INET6: + return kINET6; default: return kUNKNOWN; @@ -795,12 +796,17 @@ ArchNetworkBSD::setAddrPort(ArchNetAddress addr, int port) switch (getAddrFamily(addr)) { case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); + auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); ipAddr->sin_port = htons(port); break; } + case kINET6: { + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + ipAddr->sin6_port = htons(port); + break; + } + default: assert(0 && "unknown address family"); break; @@ -814,11 +820,15 @@ ArchNetworkBSD::getAddrPort(ArchNetAddress addr) switch (getAddrFamily(addr)) { case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); + auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); return ntohs(ipAddr->sin_port); } + case kINET6: { + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + return ntohs(ipAddr->sin6_port); + } + default: assert(0 && "unknown address family"); return 0; @@ -832,10 +842,15 @@ ArchNetworkBSD::isAnyAddr(ArchNetAddress addr) switch (getAddrFamily(addr)) { case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); + auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); return (ipAddr->sin_addr.s_addr == INADDR_ANY && - addr->m_len == (socklen_t)sizeof(struct sockaddr_in)); + addr->m_len == static_cast(sizeof(struct sockaddr_in))); + } + + case kINET6: { + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + return (memcmp(&ipAddr->sin6_addr, &in6addr_any, sizeof(in6addr_any)) == 0 && + addr->m_len == (socklen_t)sizeof(struct sockaddr_in6)); } default: @@ -865,8 +880,8 @@ const int* ArchNetworkBSD::getUnblockPipeForThread(ArchThread thread) { ArchMultithreadPosix* mt = ArchMultithreadPosix::getInstance(); - int* unblockPipe = (int*)mt->getNetworkDataForThread(thread); - if (unblockPipe == NULL) { + auto* unblockPipe = static_cast(mt->getNetworkDataForThread(thread)); + if (unblockPipe == nullptr) { unblockPipe = new int[2]; if (pipe(unblockPipe) != -1) { try { @@ -875,12 +890,12 @@ ArchNetworkBSD::getUnblockPipeForThread(ArchThread thread) } catch (...) { delete[] unblockPipe; - unblockPipe = NULL; + unblockPipe = nullptr; } } else { delete[] unblockPipe; - unblockPipe = NULL; + unblockPipe = nullptr; } } return unblockPipe; @@ -985,4 +1000,4 @@ ArchNetworkBSD::throwNameError(int err) default: throw XArchNetworkName(s_msg[4]); } -} +} \ No newline at end of file diff --git a/src/lib/arch/unix/ArchNetworkBSD.h b/src/lib/arch/unix/ArchNetworkBSD.h index 32a22cfd..a153a976 100644 --- a/src/lib/arch/unix/ArchNetworkBSD.h +++ b/src/lib/arch/unix/ArchNetworkBSD.h @@ -38,6 +38,7 @@ typedef int socklen_t; typedef char optval_t; #define ARCH_NETWORK ArchNetworkBSD +#define TYPED_ADDR(type_, addr_) (reinterpret_cast(&addr_->m_addr)) class ArchSocketImpl { public: @@ -50,8 +51,8 @@ public: ArchNetAddressImpl() : m_len(sizeof(m_addr)) { } public: - struct sockaddr m_addr; - socklen_t m_len; + struct sockaddr_storage m_addr; + socklen_t m_len; }; //! Berkeley (BSD) sockets implementation of IArchNetwork diff --git a/src/lib/arch/win32/ArchNetworkWinsock.cpp b/src/lib/arch/win32/ArchNetworkWinsock.cpp index 65a5b320..64750acc 100644 --- a/src/lib/arch/win32/ArchNetworkWinsock.cpp +++ b/src/lib/arch/win32/ArchNetworkWinsock.cpp @@ -26,7 +26,8 @@ static const int s_family[] = { PF_UNSPEC, - PF_INET + PF_INET, + PF_INET6, }; static const int s_type[] = { SOCK_DGRAM, @@ -156,7 +157,7 @@ ArchNetworkWinsock::initModule(HMODULE module) setfunc(startup, WSAStartup, int(PASCAL FAR*)(WORD, LPWSADATA)); // startup network library - WORD version = MAKEWORD(2 /*major*/, 0 /*minor*/); + WORD version = MAKEWORD(2 /*major*/, 2 /*minor*/); WSADATA data; int err = startup(version, &data); if (data.wVersion != version) { @@ -212,6 +213,11 @@ ArchNetworkWinsock::newSocket(EAddressFamily family, ESocketType type) } try { setBlockingOnSocket(fd, false); + BOOL flag = 0; + int size = sizeof(flag); + if (setsockopt_winsock(fd, IPPROTO_IPV6, IPV6_V6ONLY, &flag, size) == SOCKET_ERROR) { + throwError(getsockerror_winsock()); + } } catch (...) { close_winsock(fd); @@ -294,7 +300,7 @@ ArchNetworkWinsock::bindSocket(ArchSocket s, ArchNetAddress addr) assert(s != NULL); assert(addr != NULL); - if (bind_winsock(s->m_socket, &addr->m_addr, addr->m_len) == SOCKET_ERROR) { + if (bind_winsock(s->m_socket, TYPED_ADDR(struct sockaddr, addr), addr->m_len) == SOCKET_ERROR) { throwError(getsockerror_winsock()); } } @@ -317,10 +323,10 @@ ArchNetworkWinsock::acceptSocket(ArchSocket s, ArchNetAddress* const addr) // create new socket and temporary address ArchSocketImpl* socket = new ArchSocketImpl; - ArchNetAddress tmp = ArchNetAddressImpl::alloc(sizeof(struct sockaddr)); + ArchNetAddress tmp = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in6)); // accept on socket - SOCKET fd = accept_winsock(s->m_socket, &tmp->m_addr, &tmp->m_len); + SOCKET fd = accept_winsock(s->m_socket, TYPED_ADDR(struct sockaddr, tmp), &tmp->m_len); if (fd == INVALID_SOCKET) { int err = getsockerror_winsock(); delete socket; @@ -368,7 +374,7 @@ ArchNetworkWinsock::connectSocket(ArchSocket s, ArchNetAddress addr) assert(s != NULL); assert(addr != NULL); - if (connect_winsock(s->m_socket, &addr->m_addr, + if (connect_winsock(s->m_socket, TYPED_ADDR(struct sockaddr, addr), addr->m_len) == SOCKET_ERROR) { if (getsockerror_winsock() == WSAEISCONN) { return true; @@ -685,6 +691,15 @@ ArchNetworkWinsock::newAnyAddr(EAddressFamily family) break; } + case kINET6: { + addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in6)); + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + ipAddr->sin6_family = AF_INET6; + ipAddr->sin6_port = 0; + memcpy(&ipAddr->sin6_addr, &in6addr_any, sizeof(in6addr_any)); + break; + } + default: assert(0 && "invalid family"); } @@ -705,41 +720,31 @@ ArchNetAddress ArchNetworkWinsock::nameToAddr(const std::string& name) { // allocate address - ArchNetAddressImpl* addr = NULL; - // try to convert assuming an IPv4 dot notation address - struct sockaddr_in inaddr; - memset(&inaddr, 0, sizeof(inaddr)); - inaddr.sin_family = AF_INET; - inaddr.sin_port = 0; - inaddr.sin_addr.s_addr = inet_addr_winsock(name.c_str()); - if (inaddr.sin_addr.s_addr != INADDR_NONE) { - // it's a dot notation address - addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in)); - memcpy(TYPED_ADDR(void, addr), &inaddr, addr->m_len); + ArchNetAddressImpl* addr = new ArchNetAddressImpl; + + struct addrinfo hints; + struct addrinfo *p; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + int ret = -1; + + ARCH->lockMutex(m_mutex); + if ((ret = getaddrinfo(name.c_str(), NULL, &hints, &p)) != 0) { + ARCH->unlockMutex(m_mutex); + delete addr; + throwNameError(ret); } - else { - // address lookup - struct hostent* info = gethostbyname_winsock(name.c_str()); - if (info == NULL) { - throwNameError(getsockerror_winsock()); - } - - // copy over address (only IPv4 currently supported) - if (info->h_addrtype == AF_INET) { - addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in)); - memcpy(&inaddr.sin_addr, info->h_addr_list[0], - sizeof(inaddr.sin_addr)); - memcpy(TYPED_ADDR(void, addr), &inaddr, addr->m_len); - } - else { - throw XArchNetworkNameUnsupported( - "The requested name is valid but " - "does not have a supported address family"); - } + if (p->ai_family == AF_INET) { + addr->m_len = (socklen_t)sizeof(struct sockaddr_in); + } else { + addr->m_len = (socklen_t)sizeof(struct sockaddr_in6); } + memcpy(&addr->m_addr, p->ai_addr, addr->m_len); + freeaddrinfo(p); + ARCH->unlockMutex(m_mutex); return addr; } @@ -756,16 +761,17 @@ ArchNetworkWinsock::addrToName(ArchNetAddress addr) { assert(addr != NULL); - // name lookup - struct hostent* info = gethostbyaddr_winsock( - reinterpret_cast(&addr->m_addr), - addr->m_len, addr->m_addr.sa_family); - if (info == NULL) { - throwNameError(getsockerror_winsock()); + char host[1024]; + char service[20]; + int ret = getnameinfo(TYPED_ADDR(struct sockaddr, addr), addr->m_len, host, sizeof(host), service, sizeof(service), 0); + + if (ret != NULL) { + throwNameError(ret); } // return (primary) name - return info->h_name; + std::string name = host; + return name; } std::string @@ -775,11 +781,17 @@ ArchNetworkWinsock::addrToString(ArchNetAddress addr) switch (getAddrFamily(addr)) { case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); + struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); return inet_ntoa_winsock(ipAddr->sin_addr); } + case kINET6: { + char strAddr[INET6_ADDRSTRLEN]; + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + inet_ntop(AF_INET6, &ipAddr->sin6_addr, strAddr, INET6_ADDRSTRLEN); + return strAddr; + } + default: assert(0 && "unknown address family"); return ""; @@ -791,10 +803,13 @@ ArchNetworkWinsock::getAddrFamily(ArchNetAddress addr) { assert(addr != NULL); - switch (addr->m_addr.sa_family) { + switch (addr->m_addr.ss_family) { case AF_INET: return kINET; + case AF_INET6: + return kINET6; + default: return kUNKNOWN; } @@ -807,9 +822,14 @@ ArchNetworkWinsock::setAddrPort(ArchNetAddress addr, int port) switch (getAddrFamily(addr)) { case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - ipAddr->sin_port = htons_winsock(port); + struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); + ipAddr->sin_port = htons_winsock(static_cast(port)); + break; + } + + case kINET6: { + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + ipAddr->sin6_port = htons_winsock(static_cast(port)); break; } @@ -826,11 +846,15 @@ ArchNetworkWinsock::getAddrPort(ArchNetAddress addr) switch (getAddrFamily(addr)) { case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); + struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); return ntohs_winsock(ipAddr->sin_port); } + case kINET6: { + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + return ntohs_winsock(ipAddr->sin6_port); + } + default: assert(0 && "unknown address family"); return 0; @@ -844,12 +868,17 @@ ArchNetworkWinsock::isAnyAddr(ArchNetAddress addr) switch (getAddrFamily(addr)) { case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); + struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); return (addr->m_len == sizeof(struct sockaddr_in) && ipAddr->sin_addr.s_addr == INADDR_ANY); } + case kINET6: { + struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr); + return (addr->m_len == sizeof(struct sockaddr_in) && + memcmp(&ipAddr->sin6_addr, &in6addr_any, sizeof(in6addr_any))== 0); + } + default: assert(0 && "unknown address family"); return true; diff --git a/src/lib/arch/win32/ArchNetworkWinsock.h b/src/lib/arch/win32/ArchNetworkWinsock.h index 4c2e8573..cb60d51f 100644 --- a/src/lib/arch/win32/ArchNetworkWinsock.h +++ b/src/lib/arch/win32/ArchNetworkWinsock.h @@ -18,8 +18,11 @@ #pragma once +#include // declare no functions in winsock2 +#ifndef INCL_WINSOCK_API_PROTOTYPES #define INCL_WINSOCK_API_PROTOTYPES 0 +#endif #define INCL_WINSOCK_API_TYPEDEFS 0 #include "arch/IArchNetwork.h" @@ -30,6 +33,8 @@ #include #include +#pragma comment(lib, "ws2_32.lib") + #define ARCH_NETWORK ArchNetworkWinsock class ArchSocketImpl { @@ -45,8 +50,8 @@ public: static ArchNetAddressImpl* alloc(size_t); public: - int m_len; - struct sockaddr m_addr; + int m_len; + struct sockaddr_storage m_addr; }; #define ADDR_HDR_SIZE offsetof(ArchNetAddressImpl, m_addr) #define TYPED_ADDR(type_, addr_) (reinterpret_cast(&addr_->m_addr)) diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp index c744ec2b..6b63190d 100644 --- a/src/lib/client/Client.cpp +++ b/src/lib/client/Client.cpp @@ -147,7 +147,7 @@ Client::connect() } // create the socket - IDataSocket* socket = m_socketFactory->create(m_useSecureNetwork); + IDataSocket* socket = m_socketFactory->create(m_useSecureNetwork, ARCH->getAddrFamily(m_serverAddress.getAddress())); m_socket = dynamic_cast(socket); // filter socket messages, including a packetizing filter diff --git a/src/lib/ipc/IpcServer.cpp b/src/lib/ipc/IpcServer.cpp index 791595f2..e285a384 100644 --- a/src/lib/ipc/IpcServer.cpp +++ b/src/lib/ipc/IpcServer.cpp @@ -54,7 +54,7 @@ IpcServer::IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer, void IpcServer::init() { - m_socket = new TCPListenSocket(m_events, m_socketMultiplexer); + m_socket = new TCPListenSocket(m_events, m_socketMultiplexer, IArchNetwork::EAddressFamily::kINET); m_clientsMutex = ARCH->newMutex(); m_address.resolve(); diff --git a/src/lib/net/ISocketFactory.h b/src/lib/net/ISocketFactory.h index 628535db..9ba61685 100644 --- a/src/lib/net/ISocketFactory.h +++ b/src/lib/net/ISocketFactory.h @@ -19,6 +19,7 @@ #pragma once #include "common/IInterface.h" +#include "arch/IArchNetwork.h" class IDataSocket; class IListenSocket; @@ -34,10 +35,10 @@ public: //@{ //! Create data socket - virtual IDataSocket* create(bool secure) const = 0; + virtual IDataSocket* create(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const = 0; //! Create listen socket - virtual IListenSocket* createListen(bool secure) const = 0; + virtual IListenSocket* createListen(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const = 0; //@} }; diff --git a/src/lib/net/NetworkAddress.cpp b/src/lib/net/NetworkAddress.cpp index c0df9805..7e699507 100644 --- a/src/lib/net/NetworkAddress.cpp +++ b/src/lib/net/NetworkAddress.cpp @@ -87,7 +87,7 @@ NetworkAddress::NetworkAddress(const String& hostname, int port) : // notation. in that case we assume it's not a port suffix. // the user can replace the double colon with zeros to // disambiguate. - if ((!doubleColon || dotNotation) || !colonNotation) { + if ((!doubleColon || dotNotation) && !colonNotation) { // parse port from hostname char* end; const char* chostname = m_hostname.c_str(); diff --git a/src/lib/net/SecureListenSocket.cpp b/src/lib/net/SecureListenSocket.cpp index b0b50506..75036298 100644 --- a/src/lib/net/SecureListenSocket.cpp +++ b/src/lib/net/SecureListenSocket.cpp @@ -32,8 +32,9 @@ static const char s_certificateFilename[] = { "Synergy.pem" }; SecureListenSocket::SecureListenSocket( IEventQueue* events, - SocketMultiplexer* socketMultiplexer) : - TCPListenSocket(events, socketMultiplexer) + SocketMultiplexer* socketMultiplexer, + IArchNetwork::EAddressFamily family) : + TCPListenSocket(events, socketMultiplexer, family) { } diff --git a/src/lib/net/SecureListenSocket.h b/src/lib/net/SecureListenSocket.h index 340dba5d..5abf4c51 100644 --- a/src/lib/net/SecureListenSocket.h +++ b/src/lib/net/SecureListenSocket.h @@ -27,7 +27,7 @@ class IDataSocket; class SecureListenSocket : public TCPListenSocket{ public: SecureListenSocket(IEventQueue* events, - SocketMultiplexer* socketMultiplexer); + SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family); ~SecureListenSocket(); // IListenSocket overrides diff --git a/src/lib/net/SecureSocket.cpp b/src/lib/net/SecureSocket.cpp index 9dd3a816..c795b33d 100644 --- a/src/lib/net/SecureSocket.cpp +++ b/src/lib/net/SecureSocket.cpp @@ -53,18 +53,16 @@ struct Ssl { SSL* m_ssl; }; -SecureSocket::SecureSocket( - IEventQueue* events, - SocketMultiplexer* socketMultiplexer) : - TCPSocket(events, socketMultiplexer), +SecureSocket::SecureSocket(IEventQueue* events, + SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family) : + TCPSocket(events, socketMultiplexer, family), m_ssl(nullptr), m_secureReady(false), m_fatal(false) { } -SecureSocket::SecureSocket( - IEventQueue* events, +SecureSocket::SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, ArchSocket socket) : TCPSocket(events, socketMultiplexer, socket), diff --git a/src/lib/net/SecureSocket.h b/src/lib/net/SecureSocket.h index 2292cd29..43eb732f 100644 --- a/src/lib/net/SecureSocket.h +++ b/src/lib/net/SecureSocket.h @@ -32,7 +32,7 @@ A secure socket using SSL. */ class SecureSocket : public TCPSocket { public: - SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer); + SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family); SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, ArchSocket socket); diff --git a/src/lib/net/TCPListenSocket.cpp b/src/lib/net/TCPListenSocket.cpp index 23abed40..707f8fe2 100644 --- a/src/lib/net/TCPListenSocket.cpp +++ b/src/lib/net/TCPListenSocket.cpp @@ -34,13 +34,13 @@ // TCPListenSocket // -TCPListenSocket::TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer) : +TCPListenSocket::TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family) : m_events(events), m_socketMultiplexer(socketMultiplexer) { m_mutex = new Mutex; try { - m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM); + m_socket = ARCH->newSocket(family, IArchNetwork::kSTREAM); } catch (XArchNetwork& e) { throw XSocketCreate(e.what()); diff --git a/src/lib/net/TCPListenSocket.h b/src/lib/net/TCPListenSocket.h index 4abd752c..0d38eddd 100644 --- a/src/lib/net/TCPListenSocket.h +++ b/src/lib/net/TCPListenSocket.h @@ -32,7 +32,7 @@ A listen socket using TCP. */ class TCPListenSocket : public IListenSocket { public: - TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer); + TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family); virtual ~TCPListenSocket(); // ISocket overrides diff --git a/src/lib/net/TCPSocket.cpp b/src/lib/net/TCPSocket.cpp index ff69ab2b..39fce497 100644 --- a/src/lib/net/TCPSocket.cpp +++ b/src/lib/net/TCPSocket.cpp @@ -37,7 +37,7 @@ // TCPSocket // -TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer) : +TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family) : IDataSocket(events), m_events(events), m_mutex(), @@ -45,7 +45,7 @@ TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer) m_socketMultiplexer(socketMultiplexer) { try { - m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM); + m_socket = ARCH->newSocket(family, IArchNetwork::kSTREAM); } catch (XArchNetwork& e) { throw XSocketCreate(e.what()); diff --git a/src/lib/net/TCPSocket.h b/src/lib/net/TCPSocket.h index b29aa927..ba02c8a9 100644 --- a/src/lib/net/TCPSocket.h +++ b/src/lib/net/TCPSocket.h @@ -36,7 +36,7 @@ A data socket using TCP. */ class TCPSocket : public IDataSocket { public: - TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer); + TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family = IArchNetwork::kINET); TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, ArchSocket socket); virtual ~TCPSocket(); diff --git a/src/lib/net/TCPSocketFactory.cpp b/src/lib/net/TCPSocketFactory.cpp index e8329980..d365101c 100644 --- a/src/lib/net/TCPSocketFactory.cpp +++ b/src/lib/net/TCPSocketFactory.cpp @@ -41,27 +41,27 @@ TCPSocketFactory::~TCPSocketFactory() } IDataSocket* -TCPSocketFactory::create(bool secure) const +TCPSocketFactory::create(bool secure, IArchNetwork::EAddressFamily family) const { if (secure) { - SecureSocket* secureSocket = new SecureSocket(m_events, m_socketMultiplexer); + SecureSocket* secureSocket = new SecureSocket(m_events, m_socketMultiplexer, family); secureSocket->initSsl (false); return secureSocket; } else { - return new TCPSocket(m_events, m_socketMultiplexer); + return new TCPSocket(m_events, m_socketMultiplexer, family); } } IListenSocket* -TCPSocketFactory::createListen(bool secure) const +TCPSocketFactory::createListen(bool secure, IArchNetwork::EAddressFamily family) const { IListenSocket* socket = NULL; if (secure) { - socket = new SecureListenSocket(m_events, m_socketMultiplexer); + socket = new SecureListenSocket(m_events, m_socketMultiplexer, family); } else { - socket = new TCPListenSocket(m_events, m_socketMultiplexer); + socket = new TCPListenSocket(m_events, m_socketMultiplexer, family); } return socket; diff --git a/src/lib/net/TCPSocketFactory.h b/src/lib/net/TCPSocketFactory.h index 0b28851e..65c15a6e 100644 --- a/src/lib/net/TCPSocketFactory.h +++ b/src/lib/net/TCPSocketFactory.h @@ -19,6 +19,7 @@ #pragma once #include "net/ISocketFactory.h" +#include "arch/IArchNetwork.h" class IEventQueue; class SocketMultiplexer; @@ -31,9 +32,9 @@ public: // ISocketFactory overrides virtual IDataSocket* - create(bool secure) const; + create(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const; virtual IListenSocket* - createListen(bool secure) const; + createListen(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const; private: IEventQueue* m_events; diff --git a/src/lib/platform/MSWindowsEventQueueBuffer.cpp b/src/lib/platform/MSWindowsEventQueueBuffer.cpp index b1203f9a..8cc70a82 100644 --- a/src/lib/platform/MSWindowsEventQueueBuffer.cpp +++ b/src/lib/platform/MSWindowsEventQueueBuffer.cpp @@ -62,7 +62,7 @@ MSWindowsEventQueueBuffer::waitForEvent(double timeout) // MsgWaitForMultipleObjects() will block even if the queue isn't // empty if the messages in the queue were there before the last // call to GetMessage()/PeekMessage(). - if (HIWORD(GetQueueStatus(QS_ALLINPUT)) != 0) { + if (HIWORD(GetQueueStatus(QS_ALLPOSTMESSAGE)) != 0) { return; } @@ -79,12 +79,14 @@ MSWindowsEventQueueBuffer::waitForEvent(double timeout) // cancellation but that's okay because we're run in the main // thread and we never cancel that thread. HANDLE dummy[1]; - MsgWaitForMultipleObjects(0, dummy, FALSE, t, QS_ALLINPUT); + MsgWaitForMultipleObjects(0, dummy, FALSE, t, QS_ALLPOSTMESSAGE); } IEventQueueBuffer::Type MSWindowsEventQueueBuffer::getEvent(Event& event, UInt32& dataID) { + // NOTE: QS_ALLINPUT was replaced with QS_ALLPOSTMESSAGE. + // // peek at messages first. waiting for QS_ALLINPUT will return // if a message has been sent to our window but GetMessage will // dispatch that message behind our backs and block. PeekMessage @@ -128,7 +130,7 @@ MSWindowsEventQueueBuffer::addEvent(UInt32 dataID) bool MSWindowsEventQueueBuffer::isEmpty() const { - return (HIWORD(GetQueueStatus(QS_ALLINPUT)) == 0); + return (HIWORD(GetQueueStatus(QS_ALLPOSTMESSAGE)) == 0); } EventQueueTimer* diff --git a/src/lib/platform/OSXScreen.mm b/src/lib/platform/OSXScreen.mm index 6c24a487..93bec0e9 100644 --- a/src/lib/platform/OSXScreen.mm +++ b/src/lib/platform/OSXScreen.mm @@ -39,6 +39,7 @@ #include "base/IEventQueue.h" #include "base/TMethodEventJob.h" #include "base/TMethodJob.h" +#include "synergy/DisplayInvalidException.h" #include #include @@ -107,7 +108,7 @@ OSXScreen::OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCurso { m_displayID = CGMainDisplayID(); if (!updateScreenShape(m_displayID, 0)) { - throw std::runtime_error ("failed to initialize screen shape"); + throw DisplayInvalidException ("failed to initialize screen shape"); } try { diff --git a/src/lib/server/ClientListener.cpp b/src/lib/server/ClientListener.cpp index 0ecdb0e6..d7ee675a 100644 --- a/src/lib/server/ClientListener.cpp +++ b/src/lib/server/ClientListener.cpp @@ -45,7 +45,7 @@ ClientListener::ClientListener(const NetworkAddress& address, assert(m_socketFactory != NULL); try { - m_listen = m_socketFactory->createListen(m_useSecureNetwork); + m_listen = m_socketFactory->createListen(m_useSecureNetwork, ARCH->getAddrFamily(address.getAddress())); // setup event handler m_events->adoptHandler(m_events->forIListenSocket().connecting(), diff --git a/src/lib/synergy/App.cpp b/src/lib/synergy/App.cpp index 4c8c1808..78511608 100644 --- a/src/lib/synergy/App.cpp +++ b/src/lib/synergy/App.cpp @@ -32,6 +32,7 @@ #include "ipc/IpcMessage.h" #include "ipc/Ipc.h" #include "base/EventQueue.h" +#include "DisplayInvalidException.h" #if SYSAPI_WIN32 #include "arch/win32/ArchMiscWindows.h" @@ -50,6 +51,7 @@ #include "platform/OSXDragSimulator.h" #endif + App* App::s_instance = nullptr; // @@ -125,6 +127,15 @@ App::run(int argc, char** argv) // using the exit(int) function! result = e.getCode(); } + catch (DisplayInvalidException& die) { + LOG((CLOG_CRIT "A display invalid exception error occurred: %s\n", die.what())); + // display invalid exceptions can occur when going to sleep. When this process exits, the + // UI will restart us instantly. We don't really want that behevior, so we quies for a bit + ARCH->sleep(10); + } + catch (std::runtime_error& re) { + LOG((CLOG_CRIT "A runtime error occurred: %s\n", re.what())); + } catch (std::exception& e) { LOG((CLOG_CRIT "An error occurred: %s\n", e.what())); } diff --git a/src/lib/synergy/DisplayInvalidException.h b/src/lib/synergy/DisplayInvalidException.h new file mode 100644 index 00000000..bdc32801 --- /dev/null +++ b/src/lib/synergy/DisplayInvalidException.h @@ -0,0 +1,39 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2012-2018 Symless Ltd. + * Copyright (C) 2002 Chris Schoeneman + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * found in the file LICENSE that should have accompanied this file. + * + * This package is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef SYNERGY_DISPLAYINVALIDEXCEPTION_H +#define SYNERGY_DISPLAYINVALIDEXCEPTION_H + + +#include +#include + +class DisplayInvalidException : public std::runtime_error { + public: + DisplayInvalidException(const char* msg): + std::runtime_error(msg) + { + } + + DisplayInvalidException(std::string msg): + std::runtime_error(msg) + { + } +}; + + +#endif //SYNERGY_DISPLAYINVALIDEXCEPTION_H diff --git a/src/test/unittests/synergy/ClipboardChunkTests.cpp b/src/test/unittests/synergy/ClipboardChunkTests.cpp index 1e547a46..b33d85f0 100644 --- a/src/test/unittests/synergy/ClipboardChunkTests.cpp +++ b/src/test/unittests/synergy/ClipboardChunkTests.cpp @@ -22,19 +22,6 @@ TEST(ClipboardChunkTests, start_formatStartChunk) { -<<<<<<< HEAD - ClipboardID id = 0; - UInt32 sequence = 0; - String mockDataSize("10"); - ClipboardChunk* chunk = ClipboardChunk::start(id, sequence, mockDataSize); - - EXPECT_EQ(id, chunk->m_chunk[0]); - EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]); - EXPECT_EQ(kDataStart, chunk->m_chunk[5]); - EXPECT_EQ('1', chunk->m_chunk[6]); - EXPECT_EQ('0', chunk->m_chunk[7]); - EXPECT_EQ('\0', chunk->m_chunk[8]); -======= ClipboardID id = 0; UInt32 sequence = 0; String mockDataSize("10"); @@ -48,14 +35,12 @@ TEST(ClipboardChunkTests, start_formatStartChunk) EXPECT_EQ('1', chunk->m_chunk[6]); EXPECT_EQ('0', chunk->m_chunk[7]); EXPECT_EQ('\0', chunk->m_chunk[8]); ->>>>>>> master delete chunk; } TEST(ClipboardChunkTests, data_formatDataChunk) { -<<<<<<< HEAD ClipboardID id = 0; UInt32 sequence = 1; String mockData("mock data"); @@ -74,35 +59,12 @@ TEST(ClipboardChunkTests, data_formatDataChunk) EXPECT_EQ('t', chunk->m_chunk[13]); EXPECT_EQ('a', chunk->m_chunk[14]); EXPECT_EQ('\0', chunk->m_chunk[15]); -======= - ClipboardID id = 0; - UInt32 sequence = 1; - String mockData("mock data"); - ClipboardChunk* chunk = ClipboardChunk::data(id, sequence, mockData); - UInt32 temp_m_chunk; - memcpy(&temp_m_chunk, &(chunk->m_chunk[1]), 4); - - EXPECT_EQ(id, chunk->m_chunk[0]); - EXPECT_EQ(sequence, temp_m_chunk); - EXPECT_EQ(kDataChunk, chunk->m_chunk[5]); - EXPECT_EQ('m', chunk->m_chunk[6]); - EXPECT_EQ('o', chunk->m_chunk[7]); - EXPECT_EQ('c', chunk->m_chunk[8]); - EXPECT_EQ('k', chunk->m_chunk[9]); - EXPECT_EQ(' ', chunk->m_chunk[10]); - EXPECT_EQ('d', chunk->m_chunk[11]); - EXPECT_EQ('a', chunk->m_chunk[12]); - EXPECT_EQ('t', chunk->m_chunk[13]); - EXPECT_EQ('a', chunk->m_chunk[14]); - EXPECT_EQ('\0', chunk->m_chunk[15]); ->>>>>>> master delete chunk; } TEST(ClipboardChunkTests, end_formatDataChunk) { -<<<<<<< HEAD ClipboardID id = 1; UInt32 sequence = 1; ClipboardChunk* chunk = ClipboardChunk::end(id, sequence); @@ -111,18 +73,6 @@ TEST(ClipboardChunkTests, end_formatDataChunk) EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]); EXPECT_EQ(kDataEnd, chunk->m_chunk[5]); EXPECT_EQ('\0', chunk->m_chunk[6]); -======= - ClipboardID id = 1; - UInt32 sequence = 1; - ClipboardChunk* chunk = ClipboardChunk::end(id, sequence); - UInt32 temp_m_chunk; - memcpy(&temp_m_chunk, &(chunk->m_chunk[1]), 4); - - EXPECT_EQ(id, chunk->m_chunk[0]); - EXPECT_EQ(sequence, temp_m_chunk); - EXPECT_EQ(kDataEnd, chunk->m_chunk[5]); - EXPECT_EQ('\0', chunk->m_chunk[6]); ->>>>>>> master delete chunk; }