рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ rdesktop рдФрд░ xrdp рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛

я╗┐PVS-рд╕реНрдЯреВрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ rdesktop рдФрд░ xrdp рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛
рдЖрд░рдбреАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдпрд╣ рджреВрд╕рд░реА рд╕рдореАрдХреНрд╖рд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╣рдо rdesktop рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ xrdp рд╕рд░реНрд╡рд░ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ. рдпрд╣ C, C++, C# рдФрд░ Java рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реИ, рдЬреЛ Windows, Linux рдФрд░ macOS рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

рд▓реЗрдЦ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧреАрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдБ рдЫреЛрдЯреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдЧрд▓рддрд┐рдпрд╛рдБ рд╣реБрдИрдВ :)ред

рдиреЛрдЯ. FreeRDP рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓рд╛ рд▓реЗрдЦ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣рд╛рдВ.

рдЖрд░рдбреЗрд╕реНрдХрдЯреЙрдк

рдЖрд░рдбреЗрд╕реНрдХрдЯреЙрдк - UNIX-рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП RDP рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдирд┐рдГрд╢реБрд▓реНрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдпрджрд┐ рдЖрдк рд╕рд┐рдЧрд╡рд┐рди рдХреЗ рддрд╣рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред GPLv3 рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрддред

рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ReactOS рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рддреГрддреАрдп-рдкрдХреНрд╖ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдлреНрд░рдВрдЯ-рдПрдВрдб рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╣ рдХрд╛рдлреА рдмреВрдврд╝рд╛ рд╣реИ: рдЙрд╕рдХреА рдкрд╣рд▓реА рд░рд┐рд▓реАрдЬрд╝ 4 рдЕрдкреНрд░реИрд▓, 2001 рдХреЛ рд╣реБрдИ - рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рд╡рд╣ 17 рд╡рд░реНрд╖ рдХрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрд╣реБрдд рдЫреЛрдЯреА рд╣реИред рдЗрд╕рдореЗрдВ рдХреЛрдб рдХреА рд▓рдЧрднрдЧ 30 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ, рдЬреЛ рдЗрд╕рдХреА рдЙрдореНрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, FreeRDP рдореЗрдВ 320 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред рдХреНрд▓реЙрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

я╗┐PVS-рд╕реНрдЯреВрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ rdesktop рдФрд░ xrdp рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛

рдЕрдЧрдореНрдп рд╕рдВрдХреЗрдд

V779 рдЕрдиреБрдкрд▓рдмреНрдз рдХреЛрдб рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛. рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдореМрдЬреВрдж рд╣реЛ. rdesktop.c 1502

int
main(int argc, char *argv[])
{
  ....
  return handle_disconnect_reason(deactivated, ext_disc_reason);

  if (g_redirect_username)
    xfree(g_redirect_username);

  xfree(g_username);
}

рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рддреНрд░реБрдЯрд┐ рддреБрд░рдВрдд рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдЖрддреА рд╣реИ рдореБрдЦреНрдп: рд╣рдо рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рдж рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рджреЗрдЦрддреЗ рд╣реИрдВ рд╡рд╛рдкрд╕реА - рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдореЗрдореЛрд░реА рдХреА рд╕рдлрд╛рдИ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рддреНрд░реБрдЯрд┐ рдХреЛрдИ рдЦрддрд░рд╛ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ: рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╕рднреА рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдлрд╝ рдХрд░ рджреА рдЬрд╛рдПрдЧреАред

рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ

V557 рдРрд░реЗ рдЕрдВрдбрд░рд░рди рд╕рдВрднрд╡ рд╣реИ. 'рдПрди' рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдорд╛рди -1 рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред rdesktop.c 1872

RD_BOOL
subprocess(char *const argv[], str_handle_lines_t linehandler, void *data)
{
  int n = 1;
  char output[256];
  ....
  while (n > 0)
  {
    n = read(fd[0], output, 255);
    output[n] = ' '; // <=
    str_handle_lines(output, &rest, linehandler, data);
  }
  ....
}

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдмрдлрд╝рд░ рдореЗрдВ рдкрдврд╝рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣рд╛рдБ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рд╣реИ: рдпрджрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрдврд╝рдирд╛ -1 рд▓реМрдЯрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╕рд░рдгреА рдУрд╡рд░рд░рди рд╣реЛ рдЬрд╛рдПрдЧреА рдЙрддреНрдкрд╛рджрди.

рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдИрдУрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

V739 рдИрдУрдПрдл рдХреА рддреБрд▓рдирд╛ 'рдЪрд╛рд░' рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рд╕реЗ рдирд╣реАрдВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред '(c = fgetc(fp))' 'int' рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред Ctrl.c 500


int
ctrl_send_command(const char *cmd, const char *arg)
{
  char result[CTRL_RESULT_SIZE], c, *escaped;
  ....
  while ((c = fgetc(fp)) != EOF && index < CTRL_RESULT_SIZE && c != 'n')
  {
    result[index] = c;
    index++;
  }
  ....
}

рдпрд╣рд╛рдВ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЧрд▓рдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ рджреЗрдЦрддреЗ рд╣реИрдВ: рдпрджрд┐ fgetc рдПрдХ рд╡рд░реНрдг рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЛрдб 0xFF рд╣реИ, рдЗрд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ (EOF).

EOF рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдорддреМрд░ рдкрд░ -1 рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CP1251 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореЗрдВ, рд░реВрд╕реА рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЗ рдЕрдВрддрд┐рдо рдЕрдХреНрд╖рд░ рдореЗрдВ рдХреЛрдб 0xFF рд╣реИ, рдЬреЛ рд╕рдВрдЦреНрдпрд╛ -1 рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдПрдХ рдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЯреИрдВрдХ. рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХ 0xFF, рдЬреИрд╕реЗ EOF (-1) рдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ fgetc рдЬреИрд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП int.

рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐рдпрд╛рдВ

рдЯреБрдХрдбрд╝рд╛ 1

V547 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 'write_time' рд╕рджреИрд╡ рдЕрд╕рддреНрдп рд╣реИред рдбрд┐рд╕реНрдХ.рд╕реА 805

RD_NTSTATUS
disk_set_information(....)
{
  time_t write_time, change_time, access_time, mod_time;
  ....
  if (write_time || change_time)
    mod_time = MIN(write_time, change_time);
  else
    mod_time = write_time ? write_time : change_time; // <=
  ....
}

рд╢рд╛рдпрдж рдЗрд╕ рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рдпрд╣ рдЧрд╝рд▓рдд рд▓рдЧрд╛ || ╨╕ && рдЗрд╕ рд╢рд░реНрддред рдЖрдЗрдП рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп ╨╕ рд╕рдордп рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:

  • рджреЛрдиреЛрдВ рдЪрд░ 0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдПрдХ рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдЕрдиреНрдп: рдЪрд░ mod_time рдмрд╛рдж рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╣рдореЗрд╢рд╛ 0 рд░рд╣реЗрдЧрд╛ред
  • рдЪрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ 0 рд╣реИ: mod_time 0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ (рдмрд╢рд░реНрддреЗ рдХрд┐ рджреВрд╕рд░реЗ рдЪрд░ рдХрд╛ рдорд╛рди рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ), рдХреНрдпреЛрдВрдХрд┐ рдиреНрдпреВрдирддрдо рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдЫреЛрдЯреЗ рдХреЛ рдЪреБрдиреЗрдВрдЧреЗред
  • рджреЛрдиреЛрдВ рдЪрд░ 0 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИрдВ: рдиреНрдпреВрдирддрдо рдорд╛рди рдЪреБрдиреЗрдВред

рд╢рд░реНрдд рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕рдордп рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╣реА рджрд┐рдЦреЗрдЧрд╛:

  • рдПрдХ рдпрд╛ рджреЛрдиреЛрдВ рдЪрд░ 0 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИрдВ: рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдЪреБрдиреЗрдВред
  • рджреЛрдиреЛрдВ рдЪрд░ 0 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИрдВ: рдиреНрдпреВрдирддрдо рдорд╛рди рдЪреБрдиреЗрдВред

рдЯреБрдХрдбрд╝рд╛ 2

V547 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рджреИрд╡ рд╕рддреНрдп рд╣реЛрддреА рд╣реИ. рд╕рдВрднрд╡рддрдГ рдпрд╣рд╛рдВ '&&' рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рд╕реНрдХ.рд╕реА 1419

static RD_NTSTATUS
disk_device_control(RD_NTHANDLE handle, uint32 request, STREAM in,
      STREAM out)
{
  ....
  if (((request >> 16) != 20) || ((request >> 16) != 9))
    return RD_STATUS_INVALID_PARAMETER;
  ....
}

рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдпрд╣рд╛рдВ рднреА рд╕рдВрдЪрд╛рд▓рдХ рдорд┐рд▓реЗ рд╣реБрдП рд╣реИрдВ || ╨╕ &&рдпрд╛ == ╨╕ !=: рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдорд╛рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ 20 рдФрд░ 9 рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

рдЕрд╕реАрдорд┐рдд рд▓рд╛рдЗрди рдкреНрд░рддрд┐рд▓рд┐рдкрд┐

V512 'рд╕реНрдкреНрд░рд┐рдВрдЯрдл' рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓ рд╕реЗ рдмрдлрд░ 'рдлреБрд▓рдкрд╛рде' рдХрд╛ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдбрд┐рд╕реНрдХ.рд╕реА 1257

RD_NTSTATUS
disk_query_directory(....)
{
  ....
  char *dirname, fullpath[PATH_MAX];
  ....
  /* Get information for directory entry */
  sprintf(fullpath, "%s/%s", dirname, pdirent->d_name);
  ....
}

рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЛрдб рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рд▓рд╛рдкрд░рд╡рд╛рд╣ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рд╣рдореЗрдВ рдПрдХ рдмрдлрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдорд┐рд▓реЗрдЧрд╛ - sprintf рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрдереЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рд╣рдо рд╕рд░рдгреА рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдХреЙрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ snprintf(рдкреВрд░реНрдгрдкрде, PATH_MAX, ....).

рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реНрдерд┐рддрд┐

V560 рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рднрд╛рдЧ рд╣рдореЗрд╢рд╛ рд╕рддреНрдп рд╣реЛрддрд╛ рд╣реИ: рдЬреЛрдбрд╝реЗрдВ > 0. рд╕реНрдХрд╛рд░реНрдб.рд╕реА 507

static void
inRepos(STREAM in, unsigned int read)
{
  SERVER_DWORD add = 4 - read % 4;
  if (add < 4 && add > 0)
  {
    ....
  }
}

╨Я╤А╨╛╨▓╨╡╤А╨║╨░ рдЬреЛрдбрд╝реЗрдВ > 0 рдпрд╣рд╛рдВ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдЪрд░ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкрдврд╝реЗрдВ % 4 рд╡рд┐рднрд╛рдЬрди рдХрд╛ рд╢реЗрд╖ рднрд╛рдЧ рд▓реМрдЯрд╛ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрднреА рднреА 4 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

xrdp

xrdp - рдУрдкрди рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЖрд░рдбреАрдкреА рд╕рд░реНрд╡рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ 2 рднрд╛рдЧреЛрдВ рдореЗрдВ рдмрд╛рдВрдЯрд╛ рдЧрдпрд╛ рд╣реИ:

  • xrdp - рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдЕрдкрд╛рдЪреЗ 2.0 рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рд╡рд┐рддрд░рд┐рддред
  • xorgxrdp - xrdp рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП Xorg рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред рд▓рд╛рдЗрд╕реЗрдВрд╕ - X11 (рдПрдордЖрдИрдЯреА рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди рд╡рд┐рдЬреНрдЮрд╛рдкрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИ)

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рдХрд╛рд╕ rdesktop рдФрд░ FreeRDP рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ VNC рд╕рд░реНрд╡рд░, рдпрд╛ RDP рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ X11 рд╕рд░реНрд╡рд░ - X11rdp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди xorgxrdp рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо xorgxrdp рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

xrdp рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреА рддрд░рд╣, рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ 80 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред

я╗┐PVS-рд╕реНрдЯреВрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ rdesktop рдФрд░ xrdp рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛

рдЕрдзрд┐рдХ рдЯрд╛рдЗрдкреЛ

V525 рдХреЛрдб рдореЗрдВ рд╕рдорд╛рди рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╢рд╛рдорд┐рд▓ рд╣реИред рдкрдВрдХреНрддрд┐ 87, 88, 89 рдореЗрдВ рдЖрдЗрдЯрдо 'рдЖрд░', 'рдЬреА', 'рдЖрд░' рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред rfxencode_rgb_to_yuv.c 87

static int
rfx_encode_format_rgb(const char *rgb_data, int width, int height,
                      int stride_bytes, int pixel_format,
                      uint8 *r_buf, uint8 *g_buf, uint8 *b_buf)
{
  ....
  switch (pixel_format)
  {
    case RFX_FORMAT_BGRA:
      ....
      while (x < 64)
      {
          *lr_buf++ = r;
          *lg_buf++ = g;
          *lb_buf++ = r; // <=
          x++;
      }
      ....
  }
  ....
}

рдпрд╣ рдХреЛрдб librfxcodec рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд░рд┐рдореЛрдЯрдПрдлрдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП jpeg2000 рдХреЛрдбреЗрдХ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдЧреНрд░рд╛рдлрд┐рдХ рдбреЗрдЯрд╛ рдЪреИрдирд▓ рдорд┐рд╢реНрд░рд┐рдд рд╣реИрдВ - "рдиреАрд▓реЗ" рд░рдВрдЧ рдХреЗ рдмрдЬрд╛рдп, "рд▓рд╛рд▓" рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрднрд╡рддрдГ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рджрд┐рдЦрд╛рдИ рджреАред

рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИ rfx_encode_format_argb, рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдиреЗ рд╣рдореЗрдВ рдпрд╣ рднреА рдмрддрд╛рдпрд╛:

V525 рдХреЛрдб рдореЗрдВ рд╕рдорд╛рди рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╢рд╛рдорд┐рд▓ рд╣реИред рдкрдВрдХреНрддрд┐ 260, 261, 262, 263 рдореЗрдВ рдЖрдЗрдЯрдо 'рдП', 'рдЖрд░', 'рдЬреА', 'рдЖрд░' рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред rfxencode_rgb_to_yuv.c 260

while (x < 64)
{
    *la_buf++ = a;
    *lr_buf++ = r;
    *lg_buf++ = g;
    *lb_buf++ = r;
    x++;
}

рд╕рд╛рд░рдгреА рдШреЛрд╖рдгрд╛

V557 рдРрд░реЗ рдУрд╡рд░рд░рди рд╕рдВрднрд╡ рд╣реИ. 'рдЖрдИ-8' рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдорд╛рди 129 рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред genkeymap.c 142

// evdev-map.c
int xfree86_to_evdev[137-8+1] = {
  ....
};

// genkeymap.c
extern int xfree86_to_evdev[137-8];

int main(int argc, char **argv)
{
  ....
  for (i = 8; i <= 137; i++) /* Keycodes */
  {
    if (is_evdev)
        e.keycode = xfree86_to_evdev[i-8];
    ....
  }
  ....
}

рдЗрди рджреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рд░рдгреА рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрд╕рдВрдЧрдд рд╣реИ - рдЖрдХрд╛рд░ 1 рд╕реЗ рднрд┐рдиреНрди рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ - рд╕рд╣реА рдЖрдХрд╛рд░ evdev-map.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реИред рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЧрд▓рдд рддреБрд▓рдирд╛

V560 рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рднрд╛рдЧ рд╣рдореЗрд╢рд╛ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ: (cap_len < 0)ред xrdp_caps.c 616

// common/parse.h
#if defined(B_ENDIAN) || defined(NEED_ALIGN)
#define in_uint16_le(s, v) do 
....
#else
#define in_uint16_le(s, v) do 
{ 
    (v) = *((unsigned short*)((s)->p)); 
    (s)->p += 2; 
} while (0)
#endif

int
xrdp_caps_process_confirm_active(struct xrdp_rdp *self, struct stream *s)
{
  int cap_len;
  ....
  in_uint16_le(s, cap_len);
  ....
  if ((cap_len < 0) || (cap_len > 1024 * 1024))
  {
    ....
  }
  ....
}

рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдЪрд░ рдкрдврд╝рддрд╛ рд╣реИ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЫреЛрдЯрд╛ рдЬреИрд╕реЗ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ int. рдпрд╣рд╛рдВ рдЬрд╛рдБрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдмрдбрд╝реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗрд░рд┐рдПрдмрд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рдирд╣реАрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред

рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрд╛рдБрдЪ

V560 рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рднрд╛рдЧ рд╕рджреИрд╡ рд╕рддреНрдп рд╣реЛрддрд╛ рд╣реИ: (рдмреАрдкреАрдкреА !=16)ред libxrdp.c 704

int EXPORT_CC
libxrdp_send_pointer(struct xrdp_session *session, int cache_idx,
                     char *data, char *mask, int x, int y, int bpp)
{
  ....
  if ((bpp == 15) && (bpp != 16) && (bpp != 24) && (bpp != 32))
  {
      g_writeln("libxrdp_send_pointer: error");
      return 1;
  }
  ....
}

рдпрд╣рд╛рдВ рдЕрд╕рдорд╛рдирддрд╛ рдЬрд╛рдВрдЪ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рддреБрд▓рдирд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЯрд╛рдЗрдкреЛ рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ || рдЕрдорд╛рдиреНрдп рддрд░реНрдХреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдирд┐рд╖реНрдХрд░реНрд╖

рдСрдбрд┐рдЯ рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рдЧрдВрднреАрд░ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдкрд╛рдИ рдЧрдИ, рд▓реЗрдХрд┐рди рдХрдИ рдХрдорд┐рдпрд╛рдВ рдкрд╛рдИ рдЧрдИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрди рдбрд┐рдЬрд╝рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЙрдирдХрд╛ рджрд╛рдпрд░рд╛ рдЫреЛрдЯрд╛ рд╣реЛред рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдЖрдХрд▓рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ "рднрд╛рд╡рдирд╛рдПрдБ рдЬрд┐рдирдХреА рдкреБрд╖реНрдЯрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рдереА"ред

рдЖрдк рд╣рдорд╕реЗ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдСрдирд▓рд╛рдЗрди.

я╗┐PVS-рд╕реНрдЯреВрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ rdesktop рдФрд░ xrdp рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛

рдпрджрд┐ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖реА рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдиреБрд╡рд╛рдж рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рд╕рд░реНрдЧреЗрдИ рд▓рд╛рд░рд┐рдиред рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде rdesktop рдФрд░ xrdp рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ