コード例 #1
0
ファイル: libxrdp.c プロジェクト: mehulsbhatt/xrdp
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;
}
コード例 #2
0
ファイル: libxrdp.c プロジェクト: kevinzhou2012/xrdp
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;
}