File xrdp-handle-3-byte-PDU.patch of Package xrdp.29105

From 409878666fcab91092dd72b554dad7eafb564966 Mon Sep 17 00:00:00 2001
From: Jay Sorg <jay.sorg@gmail.com>
Date: Mon, 3 Oct 2016 20:05:14 -0700
Subject: [PATCH] xrdp: handle 3 byte PDU

---
 xrdp/xrdp_process.c | 48 +++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 43 insertions(+), 5 deletions(-)

diff --git a/xrdp/xrdp_process.c b/xrdp/xrdp_process.c
index 6cb9ea02..c0f3dfa9 100644
--- a/xrdp/xrdp_process.c
+++ b/xrdp/xrdp_process.c
@@ -138,13 +138,43 @@ xrdp_process_data_in(struct trans *self)
             }
             if (pro->session->up_and_running)
             {
+                pro->server_trans->header_size = 2;
                 pro->server_trans->extra_flags = 1;
-                pro->server_trans->header_size = 4;
                 init_stream(s, 0);
             }
             break;
 
         case 1:
+            /* we got 2 bytes */
+            if (s->p[0] == 3)
+            {
+                pro->server_trans->header_size = 4;
+                pro->server_trans->extra_flags = 2;
+            }
+            else
+            {
+                if (s->p[1] & 0x80)
+                {
+                    pro->server_trans->header_size = 3;
+                    pro->server_trans->extra_flags = 2;
+                }
+                else
+                {
+                    len = (tui8)(s->p[1]);
+                    pro->server_trans->header_size = len;
+                    pro->server_trans->extra_flags = 3;
+                }
+            }
+
+            len = (int) (s->end - s->data);
+            if (pro->server_trans->header_size > len)
+            {
+                /* not enough data read yet */
+                break;
+            }
+            /* FALLTHROUGH */
+
+        case 2:
             /* we have enough now to get the PDU bytes */
             len = libxrdp_get_pdu_bytes(s->p);
             if (len == -1)
@@ -154,10 +184,18 @@ xrdp_process_data_in(struct trans *self)
                 return 1;
             }
             pro->server_trans->header_size = len;
-            pro->server_trans->extra_flags = 2;
-            break;
+            pro->server_trans->extra_flags = 3;
 
-        case 2:
+            len = (int) (s->end - s->data);
+            if (pro->server_trans->header_size > len)
+            {
+                /* not enough data read yet */
+                break;
+            }
+            /* FALLTHROUGH */
+            g_writeln("here");
+
+        case 3:
             /* the whole PDU is read in now process */
             s->p = s->data;
             if (xrdp_process_loop(pro, s) != 0)
@@ -167,7 +205,7 @@ xrdp_process_data_in(struct trans *self)
                 return 1;
             }
             init_stream(s, 0);
-            pro->server_trans->header_size = 4;
+            pro->server_trans->header_size = 2;
             pro->server_trans->extra_flags = 1;
             break;
     }
-- 
2.16.4

openSUSE Build Service is sponsored by