summaryrefslogtreecommitdiffstats
path: root/common/trans.c
diff options
context:
space:
mode:
authorJay Sorg <jay.sorg@gmail.com>2014-11-21 20:49:01 -0800
committerJay Sorg <jay.sorg@gmail.com>2014-11-21 20:49:01 -0800
commit5a8bf87c7fe4911335a81b3ace83f35ada4fdc7d (patch)
tree3127cf82bd2f433672e46d8bf4b5f2b8ee3f496c /common/trans.c
parent160d950bd5e5d4b7cb7c0838ddf37212e753aa23 (diff)
downloadxrdp-proprietary-5a8bf87c7fe4911335a81b3ace83f35ada4fdc7d.tar.gz
xrdp-proprietary-5a8bf87c7fe4911335a81b3ace83f35ada4fdc7d.zip
common: tls, fix for pending reads
Diffstat (limited to 'common/trans.c')
-rw-r--r--common/trans.c43
1 files changed, 33 insertions, 10 deletions
diff --git a/common/trans.c b/common/trans.c
index 5503ea61..5f435bcd 100644
--- a/common/trans.c
+++ b/common/trans.c
@@ -47,6 +47,17 @@ trans_tls_send(struct trans *self, const void *data, int len)
/*****************************************************************************/
int APP_CC
+trans_tls_can_recv(struct trans *self, int sck, int millis)
+{
+ if (self->tls == NULL)
+ {
+ return 1;
+ }
+ return xrdp_tls_can_recv(self->tls, sck, millis);
+}
+
+/*****************************************************************************/
+int APP_CC
trans_tcp_recv(struct trans *self, void *ptr, int len)
{
return g_tcp_recv(self->sck, ptr, len, 0);
@@ -60,6 +71,13 @@ trans_tcp_send(struct trans *self, const void *data, int len)
}
/*****************************************************************************/
+int APP_CC
+trans_tcp_can_recv(struct trans *self, int sck, int millis)
+{
+ return g_tcp_can_recv(sck, millis);
+}
+
+/*****************************************************************************/
struct trans *
APP_CC
trans_create(int mode, int in_size, int out_size)
@@ -79,6 +97,7 @@ trans_create(int mode, int in_size, int out_size)
/* assign tcp calls by default */
self->trans_recv = trans_tcp_recv;
self->trans_send = trans_tcp_send;
+ self->trans_can_recv = trans_tcp_can_recv;
}
return self;
@@ -133,6 +152,16 @@ trans_get_wait_objs(struct trans *self, tbus *objs, int *count)
objs[*count] = self->sck;
(*count)++;
+
+ if (self->tls != 0)
+ {
+ if (self->tls->rwo != 0)
+ {
+ objs[*count] = self->tls->rwo;
+ (*count)++;
+ }
+ }
+
return 0;
}
@@ -141,19 +170,11 @@ int APP_CC
trans_get_wait_objs_rw(struct trans *self, tbus *robjs, int *rcount,
tbus *wobjs, int *wcount)
{
- if (self == 0)
+ if (trans_get_wait_objs(self, robjs, rcount) != 0)
{
return 1;
}
- if (self->status != TRANS_STATUS_UP)
- {
- return 1;
- }
-
- robjs[*rcount] = self->sck;
- (*rcount)++;
-
if (self->wait_s != 0)
{
wobjs[*wcount] = self->sck;
@@ -288,7 +309,7 @@ trans_check_wait_objs(struct trans *self)
}
else /* connected server or client (2 or 3) */
{
- if (g_tcp_can_recv(self->sck, 0))
+ if (self->trans_can_recv(self, self->sck, 0))
{
read_so_far = (int) (self->in_s->end - self->in_s->data);
to_read = self->header_size - read_so_far;
@@ -716,6 +737,7 @@ trans_set_tls_mode(struct trans *self, const char *key, const char *cert)
/* assign tls functions */
self->trans_recv = trans_tls_recv;
self->trans_send = trans_tls_send;
+ self->trans_can_recv = trans_tls_can_recv;
return 0;
}
@@ -732,6 +754,7 @@ trans_shutdown_tls_mode(struct trans *self)
/* assign callback back to tcp cal */
self->trans_recv = trans_tcp_recv;
self->trans_send = trans_tcp_send;
+ self->trans_can_recv = trans_tcp_can_recv;
return 0;
}