From 589d2ec62a6efc3af18b628c5f545c73c90dd331 Mon Sep 17 00:00:00 2001 From: Christian Plattner Date: Wed, 18 Apr 2018 10:38:42 +0200 Subject: [PATCH 1/6] Fix timeout for polling (partly fixes #3602) --- libfreerdp/crypto/tls.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index c9ae8c85f..22f8a994d 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -737,10 +737,14 @@ static int tls_do_handshake(rdpTls* tls, BOOL clientMode) do { - status = poll(&pollfds, 1, 10 * 1000); + status = poll(&pollfds, 1, 10); } while ((status < 0) && (errno == EINTR)); + if (status == 0) { + status = WAIT_TIMEOUT; + } + #elif !defined(_WIN32) FD_ZERO(&rset); FD_SET(fd, &rset); From f9d036a874fe35993d16b79cae54c40f8e9efeab Mon Sep 17 00:00:00 2001 From: Christian Plattner Date: Wed, 18 Apr 2018 10:47:06 +0200 Subject: [PATCH 2/6] Fix #3602 by implementing BIO_get_fd correctly for RDG --- libfreerdp/core/gateway/rdg.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libfreerdp/core/gateway/rdg.c b/libfreerdp/core/gateway/rdg.c index 03bbe28b4..c1d95b926 100644 --- a/libfreerdp/core/gateway/rdg.c +++ b/libfreerdp/core/gateway/rdg.c @@ -1583,6 +1583,17 @@ static long rdg_bio_ctrl(BIO* bio, int cmd, long arg1, void* arg2) else status = 1; } + else if (cmd == BIO_C_GET_FD) + { + /* + * Even if two FDs are part of RDG, only one FD can be returned here. + * + * In FreeRDP, BIO FDs are only used for polling, so it is safe to use the outgoing FD only + * + * See issue #3602 + */ + return BIO_get_fd(tlsOut->bio, NULL); + } return status; } From a15644365e551290dafd4878c15f83c39d02d01a Mon Sep 17 00:00:00 2001 From: Christian Plattner Date: Wed, 18 Apr 2018 21:50:47 +0200 Subject: [PATCH 3/6] Fix BIO_get_fd for RDG, again. --- libfreerdp/core/gateway/rdg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libfreerdp/core/gateway/rdg.c b/libfreerdp/core/gateway/rdg.c index c1d95b926..c7b2e5b57 100644 --- a/libfreerdp/core/gateway/rdg.c +++ b/libfreerdp/core/gateway/rdg.c @@ -1592,7 +1592,7 @@ static long rdg_bio_ctrl(BIO* bio, int cmd, long arg1, void* arg2) * * See issue #3602 */ - return BIO_get_fd(tlsOut->bio, NULL); + status = BIO_ctrl(tlsOut->bio, cmd, arg1, arg2); } return status; From 8956898364a3c045c9fae0e987a3817cc9e341c8 Mon Sep 17 00:00:00 2001 From: Christian Plattner Date: Tue, 24 Apr 2018 16:20:42 +0200 Subject: [PATCH 4/6] Revert useless part of the bugfix This reverts commit 589d2ec62a6efc3af18b628c5f545c73c90dd331. https://github.com/FreeRDP/FreeRDP/pull/4576#pullrequestreview-113378805 --- libfreerdp/crypto/tls.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index 22f8a994d..d702d90a4 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -741,10 +741,6 @@ static int tls_do_handshake(rdpTls* tls, BOOL clientMode) } while ((status < 0) && (errno == EINTR)); - if (status == 0) { - status = WAIT_TIMEOUT; - } - #elif !defined(_WIN32) FD_ZERO(&rset); FD_SET(fd, &rset); From 4739189cfc8b60934f14b734f76a61abfad797fb Mon Sep 17 00:00:00 2001 From: Christian Plattner Date: Tue, 24 Apr 2018 16:35:04 +0200 Subject: [PATCH 5/6] Implement BIO_ctrl more correctly for RDG See #3602 This change is discussed in https://github.com/FreeRDP/FreeRDP/pull/4576#pullrequestreview-113381733 --- libfreerdp/core/gateway/rdg.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/libfreerdp/core/gateway/rdg.c b/libfreerdp/core/gateway/rdg.c index c7b2e5b57..5ed72f5f4 100644 --- a/libfreerdp/core/gateway/rdg.c +++ b/libfreerdp/core/gateway/rdg.c @@ -1526,7 +1526,7 @@ static int rdg_bio_gets(BIO* bio, char* str, int size) static long rdg_bio_ctrl(BIO* bio, int cmd, long arg1, void* arg2) { - int status = 0; + int status = -1; rdpRdg* rdg = (rdpRdg*) BIO_get_data(bio); rdpTls* tlsOut = rdg->tlsOut; rdpTls* tlsIn = rdg->tlsIn; @@ -1537,14 +1537,6 @@ static long rdg_bio_ctrl(BIO* bio, int cmd, long arg1, void* arg2) (void)BIO_flush(tlsIn->bio); status = 1; } - else if (cmd == BIO_C_GET_EVENT) - { - if (arg2) - { - BIO_get_event(rdg->tlsOut->bio, arg2); - status = 1; - } - } else if (cmd == BIO_C_SET_NONBLOCK) { status = 1; @@ -1583,9 +1575,10 @@ static long rdg_bio_ctrl(BIO* bio, int cmd, long arg1, void* arg2) else status = 1; } - else if (cmd == BIO_C_GET_FD) + else if (cmd == BIO_C_GET_EVENT || cmd == BIO_C_GET_FD) { /* + * A note about BIO_C_GET_FD: * Even if two FDs are part of RDG, only one FD can be returned here. * * In FreeRDP, BIO FDs are only used for polling, so it is safe to use the outgoing FD only From 4a19f49878d2cb7eacb4cffb2f1d684120c7891f Mon Sep 17 00:00:00 2001 From: Christian Plattner Date: Tue, 24 Apr 2018 20:45:52 +0200 Subject: [PATCH 6/6] Fail on unimplemented BIO_ctrl for /gt:rpc --- libfreerdp/core/gateway/tsg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libfreerdp/core/gateway/tsg.c b/libfreerdp/core/gateway/tsg.c index ca6f7f3ce..737256070 100644 --- a/libfreerdp/core/gateway/tsg.c +++ b/libfreerdp/core/gateway/tsg.c @@ -1920,7 +1920,7 @@ static int transport_bio_tsg_gets(BIO* bio, char* str, int size) static long transport_bio_tsg_ctrl(BIO* bio, int cmd, long arg1, void* arg2) { - int status = 0; + int status = -1; rdpTsg* tsg = (rdpTsg*) BIO_get_data(bio); RpcVirtualConnection* connection = tsg->rpc->VirtualConnection; RpcInChannel* inChannel = connection->DefaultInChannel;