PVS-Studio рд╡рд┐рд╢реНрд▓реЗрд╖рдХрдХреЛ рд╕рд╛рде rdesktop рд░ xrdp рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ rdesktop рд░ xrdp рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ
RDP рдкреНрд░реЛрдЯреЛрдХрд▓рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рд▓реЗрдЦрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдорд╛ рдпреЛ рджреЛрд╕реНрд░реЛ рд╕рдореАрдХреНрд╖рд╛ рд╣реЛред рдпрд╕рдорд╛ рд╣рд╛рдореА rdesktop рдХреНрд▓рд╛рдЗрдиреНрдЯ рд░ xrdp рд╕рд░реНрднрд░ рд╣реЗрд░реНрдиреЗрдЫреМрдВред

рддреНрд░реБрдЯрд┐рд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрди рдЙрдкрдХрд░рдгрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ PVS- рд╕реНрдЯреВрдбрд┐рдпреЛрдпреЛ рдкреНрд▓реЗрдЯрдлрд░реНрдорд╣рд░реВрдорд╛ рдЙрдкрд▓рдмреНрдз C, C++, C# рд░ Java рдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрдерд┐рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реЛред Windows, Linux ╨╕ macOS.

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

рднрдиреНрдиреБред FreeRDP рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдмрд╛рд░реЗ рдЕрдШрд┐рд▓реНрд▓реЛ рд▓реЗрдЦ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ рдпрд╣рд╛рдБ.

rdesktop

rdesktop тАФ ╤Б╨▓╨╛╨▒╨╛╨┤╨╜╨░╤П ╤А╨╡╨░╨╗╨╕╨╖╨░╤Ж╨╕╤П ╨║╨╗╨╕╨╡╨╜╤В╨░ RDP ╨┤╨╗╤П UNIX-based ╤Б╨╕╤Б╤В╨╡╨╝. ╨Х╨│╨╛ ╤В╨░╨║╨╢╨╡ ╨╝╨╛╨╢╨╜╨╛ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╤М ╨╕ ╨┐╨╛╨┤ Windows, ╨╡╤Б╨╗╨╕ ╤Б╨╛╨▒╨╕╤А╨░╤В╤М ╨┐╤А╨╛╨╡╨║╤В ╨┐╨╛╨┤ Cygwin. ╨Ы╨╕╤Ж╨╡╨╜╨╖╨╕╤А╨╛╨▓╨░╨╜ ╨┐╨╛╨┤ GPLv3.

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

рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░реЗрдЭреИрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдзреЗрд░реИ рд╕рд╛рдиреЛ рдЫред рдпрд╕рд▓реЗ рдХреЛрдбрдХреЛ рд▓рдЧрднрдЧ 30 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдирд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рдЬреБрди рдпрд╕рдХреЛ рдЙрдореЗрд░рд▓рд╛рдИ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрджрд╛ рдЕрд▓рд┐ рдЕрдиреМрдареЛ рдЫред рддреБрд▓рдирд╛рдХреЛ рд▓рд╛рдЧрд┐, FreeRDP рдорд╛ 320 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдирд╣рд░реВ рдЫрдиреНред рдпрд╣рд╛рдБ Cloc рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдЫ:

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 рдПрд░реЗ рдЕрдиреНрдбрд░рд░рди рд╕рдореНрднрд╡ рдЫред 'n' рд╕реВрдЪрдХрд╛рдВрдХрдХреЛ рдорд╛рди -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, рд░ рддреНрдпрд╕рдкрдЫрд┐ array рдУрднрд░рд░рди рд╣реБрдиреЗрдЫ рдЙрддреНрдкрд╛рджрди.

рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░рдорд╛ EOF рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

V739 EOF рд▓рд╛рдИ 'char' рдкреНрд░рдХрд╛рд░рдХреЛ рдорд╛рдирд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрдиреБ рд╣реБрдБрджреИрдиред '(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 рд╣реЛ, рдпрд╕рд▓рд╛рдИ рдлрд╛рдЗрд▓рдХреЛ рдЕрдиреНрддреНрдпрдХреЛ рд░реВрдкрдорд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░рд┐рдиреЗрдЫ (рдИрдУрдПрдл).

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

рдЯрд╛рдЗрдкреЛрд╕

рдЯреБрдХреНрд░рд╛ рез

V547 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 'write_time' рд╕рдзреИрдВ рдЧрд▓рдд рд╣реБрдиреНрдЫред disk.c 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; // <=
  ....
}

рд╕рд╛рдпрдж рдпрд╕ рдХреЛрдбрдХреЛ рд▓реЗрдЦрдХрд▓реЗ рдпреЛ рдЧрд▓рдд рдкрд╛рдЙрдиреБрднрдпреЛ || ╨╕ && рдЕрд╡рд╕реНрдерд╛рдорд╛ред рдорд╛рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдореНрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░реМрдВ рд▓реЗрдЦрди_рд╕рдордп ╨╕ рдкрд░рд┐рд╡рд░реНрддрди_рд╕рдордп:

  • рджреБрдмреИ рдЪрд░рд╣рд░реВ реж рдмрд░рд╛рдмрд░ рдЫрдиреН: рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореА рдПрдЙрдЯрд╛ рд╢рд╛рдЦрд╛рдорд╛ рд╕рдорд╛рдкреНрдд рд╣реБрдиреЗрдЫреМрдВ рдЕрд░реВ: рдЪрд░ рдореЛрдб_рд╕рдордп рдкрдЫрд┐рдХреЛ рдЕрд╡рд╕реНрдерд╛рд▓рд╛рдИ рдзреНрдпрд╛рди рдирджрд┐рдИ рд╕рдзреИрдВ реж рд╣реБрдиреЗрдЫред
  • рдЪрд░ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ реж рд╣реЛ: рдореЛрдб_рд╕рдордп реж рдмрд░рд╛рдмрд░ рд╣реБрдиреЗрдЫ (рдЕрд░реНрдХреЛ рдЪрд░рдХреЛ рдЧреИрд░-рдЛрдгрд╛рддреНрдордХ рдорд╛рди рдЫ рднрдиреЗ), рдХрд┐рдирднрдиреЗ MIN рджреБрдИ рд╡рд┐рдХрд▓реНрдк рдордзреНрдпреЗ рд╕рд╛рдиреЛ рдЫрдиреЛрдЯ рдЧрд░реНрдиреЗрдЫред
  • рджреБрдмреИ рдЪрд░рд╣рд░реВ реж рдмрд░рд╛рдмрд░ рдЫреИрдирдиреН: рдиреНрдпреВрдирддрдо рдорд╛рди рдЫрд╛рдиреНрдиреБрд╣реЛрд╕реНред

рд╕рд░реНрдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджрд╛ рд▓реЗрдЦрди_рд╕рдордп рд░ рдкрд░рд┐рд╡рд░реНрддрди_рд╕рдордп рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╣реА рджреЗрдЦрд┐рдиреЗрдЫ:

  • рдПрдХ рд╡рд╛ рджреБрдмреИ рдЪрд░рд╣рд░реВ реж рдХреЛ рдмрд░рд╛рдмрд░ рдЫреИрдирдиреН: рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдЫрдиреМрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  • рджреБрдмреИ рдЪрд░рд╣рд░реВ реж рдмрд░рд╛рдмрд░ рдЫреИрдирдиреН: рдиреНрдпреВрдирддрдо рдорд╛рди рдЫрд╛рдиреНрдиреБрд╣реЛрд╕реНред

рдЯреБрдХреНрд░рд╛ рез

V547 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдзреИрдВ рд╕рддреНрдп рд╣реЛред рд╕рдореНрднрд╡рддрдГ '&&' рдЕрдкрд░реЗрдЯрд░ рдпрд╣рд╛рдБ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреБ рдкрд░реНрдЫред disk.c 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 'sprintf' рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рдХрд▓рд▓реЗ рдмрдлрд░ 'рдлреБрд▓рдкрд╛рде' рдХреЛ рдУрднрд░рдлреНрд▓реЛрдорд╛ рдиреЗрддреГрддреНрд╡ рдЧрд░реНрдиреЗрдЫред disk.c 1257

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

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

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

V560 рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдХреЛ рдПрдХ рднрд╛рдЧ рд╕рдзреИрдВ рд╕рддреНрдп рд╣реБрдиреНрдЫ: рдердкреНрдиреБрд╣реЛрд╕реН > 0. scard.c 507

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

рдирд┐рд░реАрдХреНрд╖рдг рдердкреНрдиреБрд╣реЛрд╕реН > реж рдпрд╣рд╛рдБ рдХреБрдиреИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЫреИрди: рдЪрд░ рд╕рдзреИрдВ рд╢реВрдиреНрдп рднрдиреНрджрд╛ рдареВрд▓реЛ рд╣реБрдиреЗрдЫ, рдХрд┐рдирднрдиреЗ % 4 рдкрдвреНрдиреБрд╣реЛрд╕реН рд╡рд┐рднрд╛рдЬрдирдХреЛ рдмрд╛рдБрдХреА рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗрдЫ, рддрд░ рдпреЛ 4 рдХреЛ рдмрд░рд╛рдмрд░ рд╣реБрдиреЗрдЫреИрдиред

xrdp

xrdp - рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдХреЛрдбрдХреЛ рд╕рд╛рде RDP рд╕рд░реНрднрд░рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдкрд░рд┐рдпреЛрдЬрдирд╛ 2 рднрд╛рдЧрдорд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдЫ:

  • xrdp - рдкреНрд░реЛрдЯреЛрдХрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред Apache 2.0 рд▓рд╛рдЗрд╕реЗрдиреНрд╕ рдЕрдиреНрддрд░реНрдЧрдд рд╡рд┐рддрд░рд┐рддред
  • xorgxrdp - xrdp рд╕рдБрдЧ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ Xorg рдбреНрд░рд╛рдЗрднрд░рд╣рд░реВрдХреЛ рд╕реЗрдЯред рдЗрдЬрд╛рдЬрддрдкрддреНрд░ - X11 (рдЬрд╕реНрддреИ MIT, рддрд░ рд╡рд┐рдЬреНрдЮрд╛рдкрдирдорд╛ рдкреНрд░рдпреЛрдЧ рдирд┐рд╖реЗрдзрд┐рдд рдЧрд░реНрджрдЫ)

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

рдпрд╕ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореА xorgxrdp рд▓рд╛рдИ рдХрднрд░ рдЧрд░реНрджреИрдиреМрдВред

xrdp рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЕрдШрд┐рд▓реНрд▓реЛ рдЬрд╕реНрддреИ, рдзреЗрд░реИ рд╕рд╛рдиреЛ рдЫ рд░ рд▓рдЧрднрдЧ 80 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдирд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ rdesktop рд░ xrdp рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ

рдердк рдЯрд╛рдИрдкрд╣рд░реВ

V525 рдХреЛрдбрд▓реЗ рд╕рдорд╛рди рдмреНрд▓рдХрд╣рд░реВрдХреЛ рд╕рдВрдЧреНрд░рд╣ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рд╡рд╕реНрддреБрд╣рд░реВ 'r', 'g', 'r' рд▓рд╛рдИ 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 рдкреБрд╕реНрддрдХрд╛рд▓рдпрдмрд╛рдЯ рд▓рд┐рдЗрдПрдХреЛ рд╣реЛ, рдЬрд╕рд▓реЗ RemoteFX рдХреЛ рд▓рд╛рдЧрд┐ jpeg2000 рдХреЛрдбреЗрдХ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рдпрд╣рд╛рдБ, рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдЧреНрд░рд╛рдлрд┐рдХ рдбреЗрдЯрд╛ рдЪреНрдпрд╛рдирд▓рд╣рд░реВ рдорд┐рд╢реНрд░рд┐рдд рдЫрдиреН - "рдиреАрд▓реЛ" рд░рдЩрдХреЛ рд╕рдЯреНрдЯрд╛, "рд░рд╛рддреЛ" рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХреЛ рдЫред рдпреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдп: рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЯрд╛рдБрд╕реНрдиреЗ рдкрд░рд┐рдгрд╛рдордХреЛ рд░реВрдкрдорд╛ рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛред

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

V525 рдХреЛрдбрд▓реЗ рд╕рдорд╛рди рдмреНрд▓рдХрд╣рд░реВрдХреЛ рд╕рдВрдЧреНрд░рд╣ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рд╡рд╕реНрддреБрд╣рд░реВ 'a', 'r', 'g', 'r' рд▓рд╛рдИ 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 рдПрд░реЗ рдУрднрд░рд░рди рд╕рдореНрднрд╡ рдЫред 'i тАФ 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];
    ....
  }
  ....
}

рдпреА рджреБрдИ рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ array рдХреЛ рдШреЛрд╖рдгрд╛ рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрд╕рдВрдЧрдд рдЫрдиреН - рдЖрдХрд╛рд░ 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 рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдПрдХ рднрд╛рдЧ рд╕рдзреИрдВ рд╕рддреНрдп рдЫ: (bpp != 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-Studio рдХреЛ рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд╕рд╛рдЗрдЯ.

PVS-рд╕реНрдЯреБрдбрд┐рдпреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ rdesktop рд░ xrdp рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ

рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпреЛ рд▓реЗрдЦ рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓реНрдиреЗ рджрд░реНрд╢рдХрд╣рд░реВрд╕рдБрдЧ рд╕рд╛рдЭрд╛ рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рдХреГрдкрдпрд╛ рдЕрдиреБрд╡рд╛рдж рд▓рд┐рдЩреНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН: рд╕рд░реНрдЧреЗрдИ рд▓рд╛рд░рд┐рдиред PVS-Studio рд╕рдБрдЧ rdesktop рд░ xrdp рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ

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

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рднрдПрдХрд╛ рд╕рд╛рдЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рднрд░рдкрд░реНрджреЛ рд╣реЛрд╕реНрдЯрд┐рдЩ рдЦрд░рд┐рдж рдЧрд░реНрдиреБрд╣реЛрд╕реН ЁЯФе DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рд╕рд╣рд┐рддрдХреЛ рднрд░рдкрд░реНрджреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдЩ рдХрд┐рдиреНрдиреБрд╣реЛрд╕реН | ProHoster