int EXPORT_CC libxrdp_process_data(struct xrdp_session* session) { int cont; int rv; int code; int term; int dead_lock_counter; term = 0; cont = 1; rv = 0; dead_lock_counter = 0; while ((cont || !session->up_and_running) && !term) { if (session->is_term != 0) { if (session->is_term()) { term = 1; } } code = 0; if (xrdp_rdp_recv((struct xrdp_rdp*)(session->rdp), session->s, &code) != 0) { rv = 1; break; } DEBUG(("libxrdp_process_data code %d", code)); switch (code) { case -1: xrdp_rdp_send_demand_active((struct xrdp_rdp*)session->rdp); session->up_and_running = 0; break; case 0: dead_lock_counter++; break; case RDP_PDU_CONFIRM_ACTIVE: /* 3 */ xrdp_rdp_process_confirm_active((struct xrdp_rdp*)session->rdp, session->s); break; case RDP_PDU_DATA: /* 7 */ if (xrdp_rdp_process_data((struct xrdp_rdp*)session->rdp, session->s) != 0) { DEBUG(("libxrdp_process_data returned non zero")); cont = 0; term = 1; } break; default: g_writeln("unknown in libxrdp_process_data"); dead_lock_counter++; break; } if (dead_lock_counter > 100000) { /*This situation can happen and this is a workaround*/ cont = 0; g_writeln("Serious programming error we were locked in a deadly loop") ; g_writeln("remaining :%d",session->s->end-session->s->next_packet); session->s->next_packet = 0; } if (cont) { cont = (session->s->next_packet != 0) && (session->s->next_packet < session->s->end); } } return rv; }
int EXPORT_CC libxrdp_process_data(struct xrdp_session* session) { int cont; int rv; int code; int term; tui8 header; term = 0; cont = 1; rv = 0; while ((cont || !session->up_and_running) && !term) { if (session->is_term != 0) { if (session->is_term()) { term = 1; } } code = 0; if (xrdp_rdp_recv((struct xrdp_rdp*)session->rdp, session->s, &code) != 0) { rv = 1; break; } DEBUG(("libxrdp_process_data code %d", code)); switch (code) { case -1: xrdp_rdp_send_demand_active((struct xrdp_rdp*)session->rdp); session->up_and_running = 0; break; case 0: break; case RDP_PDU_CONFIRM_ACTIVE: /* 3 */ xrdp_rdp_process_confirm_active((struct xrdp_rdp*)session->rdp, session->s); break; case RDP_PDU_DATA: /* 7 */ //g_writeln("%08x %08x %08x %08x\n",*(tui32*)session->s->p, *(tui32*)(session->s->p+4), // *(tui32*)(session->s->p+8),*(tui32*)(session->s->p+12)); if (xrdp_rdp_process_data((struct xrdp_rdp*)session->rdp, session->s) != 0) { DEBUG(("libxrdp_process_data returned non zero")); cont = 0; term = 1; } break; default: g_writeln("unknown in libxrdp_process_data"); break; } if (cont) { cont = (session->s->next_packet != 0) && (session->s->next_packet < session->s->end); } } return rv; }