/* only used durring connection */ struct stream * APP_CC libxrdp_force_read(struct trans* trans) { int bytes; struct stream *s; s = trans->in_s; init_stream(s, 32 * 1024); if (trans_force_read(trans, 4) != 0) { g_writeln("libxrdp_force_read: error"); return 0; } bytes = libxrdp_get_pdu_bytes(s->data); if (bytes < 1) { g_writeln("libxrdp_force_read: error"); return 0; } if (bytes > 32 * 1024) { g_writeln("libxrdp_force_read: error"); return 0; } if (trans_force_read(trans, bytes - 4) != 0) { g_writeln("libxrdp_force_read: error"); return 0; } return s; }
static int DEFAULT_CC xrdp_process_data_in(struct trans *self) { struct xrdp_process *pro; struct stream *s; int len; DEBUG(("xrdp_process_data_in")); pro = (struct xrdp_process *)(self->callback_data); s = pro->server_trans->in_s; switch (pro->server_trans->extra_flags) { case 0: /* early in connection sequence, we're in this mode */ if (xrdp_process_loop(pro, 0) != 0) { g_writeln("xrdp_process_data_in: " "xrdp_process_loop failed"); return 1; } if (pro->session->up_and_running) { pro->server_trans->header_size = 2; pro->server_trans->extra_flags = 1; 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) { g_writeln("xrdp_process_data_in: " "xrdp_process_get_packet_bytes failed"); return 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 3: /* the whole PDU is read in now process */ s->p = s->data; if (xrdp_process_loop(pro, s) != 0) { g_writeln("xrdp_process_data_in: " "xrdp_process_loop failed"); return 1; } init_stream(s, 0); pro->server_trans->header_size = 2; pro->server_trans->extra_flags = 1; break; } return 0; }