PVS-Studio рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рджреНрд╡рд╛рд░реЗ rdesktop рдЖрдгрд┐ xrdp рддрдкрд╛рд╕рдгреЗ

PVS-рд╕реНрдЯреБрдбрд┐рдУ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╡рд╛рдкрд░реВрди rdesktop рдЖрдгрд┐ xrdp рддрдкрд╛рд╕рдд рдЖрд╣реЗ
рдЖрд░рдбреАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреНрдпрд╛ рдЪрд╛рдЪрдгреАрдмрджреНрджрд▓ рд▓реЗрдЦрд╛рдВрдЪреНрдпрд╛ рдорд╛рд▓рд┐рдХреЗрддреАрд▓ рд╣реЗ рджреБрд╕рд░реЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдЖрд╣реЗ. рддреНрдпрд╛рдордзреНрдпреЗ рдЖрдкрдг rdesktop рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ xrdp рд╕рд░реНрд╡реНрд╣рд░ рдкрд╛рд╣реВ.

рддреНрд░реБрдЯреА рдУрд│рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдзрди рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ рдкреАрд╡реНрд╣реАрдПрд╕-рд╕реНрдЯреБрдбрд┐рдУрд╣реЗ C, C++, C# рдЖрдгрд┐ Java рд╕рд╛рдареА рдПрдХ рд╕реНрдЯреЕрдЯрд┐рдХ рдХреЛрдб рдЕреЕрдирд╛рд▓рд╛рдпрдЭрд░ рдЖрд╣реЗ, рдЬреЗ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ. Windows, Linux ╨╕ macOS.

рд▓реЗрдЦрд╛рдд рдлрдХреНрдд рддреНрдпрд╛ рддреНрд░реБрдЯреА рдЖрд╣реЗрдд рдЬреНрдпрд╛ рдорд▓рд╛ рдордиреЛрд░рдВрдЬрдХ рд╡рд╛рдЯрд▓реНрдпрд╛. рддрдерд╛рдкрд┐, рдкреНрд░рдХрд▓реНрдк рд▓рд╣рд╛рди рдЖрд╣реЗрдд, рдореНрд╣рдгреВрди рдХрд╛рд╣реА рдЪреБрдХрд╛ рд╣реЛрддреНрдпрд╛ :).

рд╢реЗрд░рд╛. рдлреНрд░реАрдЖрд░рдбреАрдкреА рдкреНрд░рдХрд▓реНрдк рдкрдбрддрд╛рд│рдгреАрдмрджреНрджрд▓ рдорд╛рдЧреАрд▓ рд▓реЗрдЦ рдЖрдврд│реВ рд╢рдХрддреЛ рдпреЗрдереЗ.

rdesktop

rdesktop тАФ рдпреБрдирд┐рдХреНрд╕-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдВрд╕рд╛рдареА рдЖрд░рдбреАрдкреА рдХреНрд▓рд╛рдпрдВрдЯрдЪреА рдПрдХ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА. рдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рджреЗрдЦреАрд▓ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ: WindowsрдЬрд░ рддреБрдореНрд╣реА Cygwin рдЕрдВрддрд░реНрдЧрдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рдХреЗрд▓рд╛ рддрд░. 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 рдЕреЕрд░реЗ рдЕрдВрдбрд░рд░рди рд╢рдХреНрдп рдЖрд╣реЗ. '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 рдкрд░рдд рдпреЗрдИрд▓, рдЖрдгрд┐ рдирдВрддрд░ рдЕреЕрд░реЗ рдУрд╡реНрд╣рд░рд░рди рд╣реЛрдИрд▓ рдЖрдЙрдЯрдкреБрдЯ.

рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░рд╛рдд 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 рдЖрд╣реЗ, рддреЛ рдлрд╛рдЗрд▓рдЪрд╛ рд╢реЗрд╡рдЯ рдореНрд╣рдгреВрди рдЕрд░реНрде рд▓рд╛рд╡рд▓рд╛ рдЬрд╛рдИрд▓ (EOF).

EOF рд╣реЗ рдПрдХ рд╕реНрдерд┐рд░ рдЖрд╣реЗ, рд╕рд╣рд╕рд╛ -1 рдореНрд╣рдгреВрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, CP1251 рдПрдиреНрдХреЛрдбрд┐рдВрдЧрдордзреНрдпреЗ, рд░рд╢рд┐рдпрди рд╡рд░реНрдгрдорд╛рд▓рд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдЕрдХреНрд╖рд░рд╛рдд 0xFF рдХреЛрдб рдЖрд╣реЗ, рдЬреЛ рдХреНрд░рдорд╛рдВрдХ -1 рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ рдЬрд░ рдЖрдкрдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд. рдЪрд╛рд░. рд╣реЗ рдЪрд┐рдиреНрд╣ 0xFF, рдЬрд╕реЗ рдХреА рдмрд╛рд╣реЗрд░ рд╡рд│рддреЗ EOF (-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; // <=
  ....
}

рдХрджрд╛рдЪрд┐рдд рдпрд╛ рд╕рдВрд╣рд┐рддреЗрдЪреНрдпрд╛ рд▓реЗрдЦрдХрд╛рд▓рд╛ рддреЗ рдЪреБрдХрд▓реЗ рдЕрд╕реЗрд▓ || ╨╕ && рд╕реНрдерд┐рддреАрдд рдореВрд▓реНрдпрд╛рдВрд╕рд╛рдареА рд╕рдВрднрд╛рд╡реНрдп рдкрд░реНрдпрд╛рдпрд╛рдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛ рд▓реЗрдЦрди_рд╡реЗрд│ ╨╕ рдмрджрд▓_рдХрд╛рд│:

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

рд╕рд╣ рдЕрдЯ рдмрджрд▓рддрд╛рдирд╛ write_time && change_time рд╡рд░реНрддрди рдпреЛрдЧреНрдп рджрд┐рд╕реЗрд▓:

  • рдПрдХ рдХрд┐рдВрд╡рд╛ рджреЛрдиреНрд╣реА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ 0 рдЪреНрдпрд╛ рд╕рдорд╛рди рдирд╛рд╣реАрдд: рд╢реВрдиреНрдп рдирд╕рд▓реЗрд▓реЗ рдореВрд▓реНрдп рдирд┐рд╡рдбрд╛.
  • рджреЛрдиреНрд╣реА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ 0 рдЪреНрдпрд╛ рд╕рдорд╛рди рдирд╛рд╣реАрдд: рдХрд┐рдорд╛рди рдореВрд▓реНрдп рдирд┐рд╡рдбрд╛.

рддреБрдХрдбрд╛ рез

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)
  {
    ....
  }
}

рддрдкрд╛рд╕рдгреА > 0 рдЬреЛрдбрд╛ рдпреЗрдереЗ рдЧрд░рдЬ рдирд╛рд╣реА: рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдиреЗрд╣рдореА рд╢реВрдиреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдореЛрдареЗ рдЕрд╕реЗрд▓, рдХрд╛рд░рдг % 4 рд╡рд╛рдЪрд╛ рд╡рд┐рднрд╛рдЧрд╛рддреАрд▓ рдЙрд░реНрд╡рд░рд┐рдд рднрд╛рдЧ рдкрд░рдд рдХрд░реЗрд▓, рдкрд░рдВрддреБ рддреЗ рдХрдзреАрд╣реА 4 рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪреЗ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА.

xrdp

xrdp тАФ рдУрдкрди рд╕реЛрд░реНрд╕ рдХреЛрдбрд╕рд╣ рдЖрд░рдбреАрдкреА рд╕рд░реНрд╡реНрд╣рд░рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА. рдкреНрд░рдХрд▓реНрдк 2 рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реЗрд▓рд╛ рдЖрд╣реЗ:

  • xrdp - рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА. Apache 2.0 рдкрд░рд╡рд╛рдиреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рд╡рд┐рддрд░реАрдд рдХреЗрд▓реЗ.
  • xorgxrdp - xrdp рд╕рд╣ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА Xorg рдбреНрд░рд╛рдпрд╡реНрд╣рд░реНрд╕рдЪрд╛ рд╕рдВрдЪ. рдкрд░рд╡рд╛рдирд╛ - X11 (MIT рдкреНрд░рдорд╛рдгреЗ, рдкрд░рдВрддреБ рдЬрд╛рд╣рд┐рд░рд╛рддреАрдВрдордзреНрдпреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ)

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

рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдореНрд╣реА xorgxrdp рдХрд╡реНрд╣рд░ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА.

xrdp рдкреНрд░рдХрд▓реНрдк, рдорд╛рдЧреАрд▓ рдкреНрд░рдХрд▓реНрдкрд╛рдкреНрд░рдорд╛рдгреЗ, рдЦреВрдкрдЪ рд▓рд╣рд╛рди рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдЕрдВрджрд╛рдЬреЗ 80 рд╣рдЬрд╛рд░ рдУрд│реА рдЖрд╣реЗрдд.

PVS-рд╕реНрдЯреБрдбрд┐рдУ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╡рд╛рдкрд░реВрди rdesktop рдЖрдгрд┐ xrdp рддрдкрд╛рд╕рдд рдЖрд╣реЗ

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

V525 рдХреЛрдбрдордзреНрдпреЗ рд╕рдорд╛рди рдмреНрд▓реЙрдХреНрд╕рдЪрд╛ рд╕рдВрдЧреНрд░рд╣ рдЖрд╣реЗ. 87, 88, 89 рдордзреАрд▓ рдЖрдпрдЯрдо 'r', 'g', 'r' рддрдкрд╛рд╕рд╛. 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 рдХреЛрдбрдордзреНрдпреЗ рд╕рдорд╛рди рдмреНрд▓реЙрдХреНрд╕рдЪрд╛ рд╕рдВрдЧреНрд░рд╣ рдЖрд╣реЗ. рдУрд│реА 260, 261, 262, 263 рдордзреНрдпреЗ рдЖрдпрдЯрдо 'a', 'r', 'g', 'r' рддрдкрд╛рд╕рд╛. 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];
    ....
  }
  ....
}

рдпрд╛ рджреЛрди рдлрд╛рдпрд▓реАрдВрдордзреАрд▓ рдЕреЕрд░реЗрдЪреА рдШреЛрд╖рдгрд╛ рдЖрдгрд┐ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╡рд┐рд╕рдВрдЧрдд рдЖрд╣реЗрдд - рдЖрдХрд╛рд░ 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 рд╕рд░реНрд╡реНрд╣рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд╛рдЗрдЯрд╕рд╛рдареА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реЗрджреА рдХрд░рд╛ ЁЯФе рдбреАрдбреЙрд╕ рд╕рдВрд░рдХреНрд╖рдгрд╛рд╕рд╣ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ, рд╡реНрд╣реАрдкреАрдПрд╕ (VPS) рд╡реНрд╣реАрдбреАрдПрд╕ (VDS) рд╕рд░реНрд╡реНрд╣рд░реНрд╕ рдЦрд░реЗрджреА рдХрд░рд╛ | ProHoster