เบเบณเบฅเบฑเบ‡เบเบงเบ”เบชเบญเบš rdesktop เปเบฅเบฐ xrdp เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio

เบเบฒเบ™เบเบงเบ”เบชเบญเบš rdesktop เปเบฅเบฐ xrdp เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio
เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เบ—เบตเบชเบญเบ‡เปƒเบ™เบŠเบธเบ”เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป‚เบ„เบ‡เบเบฒเบ™ open source เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš RDP protocol. เปƒเบ™เบกเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบฅเบนเบเบ„เป‰เบฒ rdesktop เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ xrdp.

เปƒเบŠเป‰เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” PVS Studioเบกเบฑเบ™เป€เบ›เบฑเบ™เป‚เบ›เบฃเปเบเบฃเบกเบงเบดเป€เบ„เบฒเบฐเบฅเบฐเบซเบฑเบ”เปเบšเบšเบ„เบปเบ‡เบ—เบตเปˆเบชเบณเบฅเบฑเบš C, C++, C# เปเบฅเบฐ Java, เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เปเบžเบฅเบ”เบŸเบญเบกเบ•เปˆเบฒเบ‡เป†. Windows, Linux ะธ macOS.

เบšเบปเบ”เบ„เบงเบฒเบกเบชเบฐเป€เบซเบ™เบตเบžเบฝเบ‡เปเบ•เปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบเบฑเบšเบ‚เป‰เบญเบ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบซเบ™เป‰เบญเบ :).

ะŸั€ะธะผะตั‡ะฐะฝะธะต. เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเป‚เบ„เบ‡เบเบฒเบ™ FreeRDP เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰ เบ—เบตเปˆเบ™เบตเป‰.

เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ•เบฑเป‰เบ‡เป‚เบ•เบฐ

เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบ•เบฑเป‰เบ‡เป‚เบ•เบฐ โ€” ัะฒะพะฑะพะดะฝะฐั ั€ะตะฐะปะธะทะฐั†ะธั ะบะปะธะตะฝั‚ะฐ RDP ะดะปั UNIX-based ัะธัั‚ะตะผ. ะ•ะณะพ ั‚ะฐะบะถะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะธ ะฟะพะด Windows, ะตัะปะธ ัะพะฑะธั€ะฐั‚ัŒ ะฟั€ะพะตะบั‚ ะฟะพะด Cygwin. ะ›ะธั†ะตะฝะทะธั€ะพะฒะฐะฝ ะฟะพะด GPLv3.

เบฅเบนเบเบ„เป‰เบฒเบ™เบตเป‰เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบ™เบดเบเบปเบกเบซเบผเบฒเบ - เบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™ ReactOS, เปเบฅเบฐเบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบชเปˆเบงเบ™เบซเบ™เป‰เบฒเบ‚เบญเบ‡เบเบฒเบŸเบดเบเบ‚เบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบกเบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบฅเบฒเบงเบกเบตเบญเบฒเบเบธเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡: เบเบฒเบ™เบ›เปˆเบญเบเบ•เบปเบงเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบฅเบฒเบงเป„เบ”เป‰เบˆเบฑเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบงเบฑเบ™เบ—เบต 4 เป€เบ”เบทเบญเบ™เป€เบกเบชเบฒเบ›เบต 2001 - เปƒเบ™เป€เบงเบฅเบฒเบ‚เบฝเบ™, เบฅเบฒเบงเบกเบตเบญเบฒเบเบธ 17 เบ›เบต.

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ™เป‰เบญเบ. เบกเบฑเบ™เบกเบตเบ›เบฐเบกเบฒเบ™ 30 เบžเบฑเบ™เป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เปเบ›เบเบ—เบตเปˆเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบญเบฒเบเบธเบ‚เบญเบ‡เบกเบฑเบ™. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš, FreeRDP เบกเบต 320 เบžเบฑเบ™เบชเบฒเบ. เบ™เบตเป‰เปเบกเปˆเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡เป‚เบ›เบฃเปเบเบฃเบก Cloc:

เบเบฒเบ™เบเบงเบ”เบชเบญเบš rdesktop เปเบฅเบฐ xrdp เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio

เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰

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 Array underrun เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰. เบกเบนเบ™เบ„เปˆเบฒเบ‚เบญเบ‡เบ”เบฑเบ”เบŠเบฐเบ™เบต '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);
  }
  ....
}

เบ‚เปเป‰เบกเบนเบ™เบซเบเปเป‰เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบญเปˆเบฒเบ™เบˆเบฒเบเป„เบŸเบฅเปŒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ buffer เบˆเบปเบ™เบเปˆเบงเบฒเป„เบŸเบฅเปŒเบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ™เบตเป‰: เบ–เป‰เบฒเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบœเบดเบ”เบžเบฒเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ เบญเปˆเบฒเบ™ เบˆเบฐเบเบฑเบšเบ„เบทเบ™ -1, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ array เบˆเบฐเบ–เบทเบ overrun output.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ EOF เปƒเบ™เบ›เบฐเป€เบžเบ” char

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 เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบ•เบปเบงเปเบ›เป€เบŠเบฑเปˆเบ™: char. เบกเบฑเบ™ turns เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบงเปˆเบฒโ€‹เบชเบฑเบ™โ€‹เบเบฒโ€‹เบฅเบฑเบ 0xFFโ€‹, เบ„เบทโ€‹ EOF (-1) เบ–เบทเบเบ•เบตเบ„เบงเบฒเบกเปเบฒเบเป€เบ›เบฑเบ™เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เป€เบญเบเบฐเบชเบฒเบ™. เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเปเบกเปˆเบ™ fgetc เบ„เบงเบ™เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ•เบปเบงเปเบ›เป€เบŠเบฑเปˆเบ™ int.

เบžเบดเบกเบœเบดเบ”

เบŠเบดเป‰เบ™ 1

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; // <=
  ....
}

เบšเบฒเบ‡เบ—เบตเบœเบนเป‰เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เป€เบ‚เบปเป‰เบฒเปƒเบˆเบœเบดเบ” || ะธ && เบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบš. เปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเบ„เปˆเบฒ write_time ะธ change_time:

  • เบ•เบปเบงเปเบ›เบ—เบฑเบ‡เบชเบญเบ‡เป€เบ—เบปเปˆเบฒเบเบฑเบš 0: เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เปƒเบ™เบชเบฒเบ‚เบฒ เบญเบทเปˆเบ™: เบ•เบปเบงเปเบ› mod_time เบˆเบฐเป€เบ›เบฑเบ™ 0 เบชเบฐเป€เปเบตเป‚เบ”เบเบšเปเปˆเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบชเบฐเบžเบฒเบšเบ•เปเปˆเป„เบ›.
  • เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ•เบปเบงเปเบ›เปเบกเปˆเบ™ 0: mod_time เบˆเบฐเป€เบ—เบปเปˆเบฒเบเบฑเบš 0 (เปƒเบซเป‰เบงเปˆเบฒเบ•เบปเบงเปเบ›เบญเบทเปˆเบ™เบกเบตเบ„เปˆเบฒเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบฅเบปเบš), เป€เบžเบฒเบฐเบงเปˆเบฒ MIN เบˆเบฐเป€เบฅเบทเบญเบเป€เบญเบปเบฒเบ™เป‰เบญเบเบเบงเปˆเบฒเบ‚เบญเบ‡เบชเบญเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบ.
  • เบ—เบฑเบ‡เบชเบญเบ‡เบ•เบปเบงเปเบ›เบšเปเปˆเป€เบ—เบปเปˆเบฒเบเบฑเบš 0: เป€เบฅเบทเบญเบเบ„เปˆเบฒเบ•เปเปˆเบฒเบชเบธเบ”.

เป€เบกเบทเปˆเบญเบ›เปˆเบฝเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ”เป‰เบงเบ write_time && change_time เบžเบถเบ”เบ•เบดเบเปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡:

  • เบ•เบปเบงเปเบ›เปœเบถเปˆเบ‡ เบซเบผเบท เบ—เบฑเบ‡เบชเบญเบ‡เบšเปเปˆเป€เบ—เบปเปˆเบฒเบเบฑเบš 0: เป€เบฅเบทเบญเบเบ„เปˆเบฒเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบชเบนเบ™.
  • เบ—เบฑเบ‡เบชเบญเบ‡เบ•เบปเบงเปเบ›เบšเปเปˆเป€เบ—เบปเปˆเบฒเบเบฑเบš 0: เป€เบฅเบทเบญเบเบ„เปˆเบฒเบ•เปเปˆเบฒเบชเบธเบ”.

เบŠเบดเป‰เบ™ 2

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' เบˆเบฐเบ™เปเบฒเป„เบ›เบชเบนเปˆเบเบฒเบ™เบฅเบปเป‰เบ™เบ‚เบญเบ‡ buffer 'fullpath'. 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);
  ....
}

เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆ, เบกเบฑเบ™เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบšเปเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบšเบฑเบ™เบซเบฒ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”: เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบšเปเปˆเบชเบปเบ™เปƒเบˆเบซเบ™เบถเปˆเบ‡เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™ overflow buffer - เปเบฅเปˆเบ™ เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบˆเปเบฒเบเบฑเบ”เป‚เบ”เบเบชเบดเปˆเบ‡เปƒเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ concatenating เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป„เบ›เป€เบเบตเบ™เบ‚เบญเบšเป€เบ‚เบ”เบ‚เบญเบ‡ array เป„เบ”เป‰. เบกเบฑเบ™เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบเบฒเบ™เป‚เบ—เบ™เบตเป‰เบขเบนเปˆเปƒเบ™ snprintf(fullpath, PATH_MAX,โ€ฆ.).

เบชเบฐเบžเบฒเบšเบŠเป‰เบณเบŠเป‰เบญเบ™

V560 เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ—เบตเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เบชเบฐเป€เบซเบกเบต: add > 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 - เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ RDP เบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”. เป‚เบ„เบ‡เบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™ 2 เบžเบฒเบเบชเปˆเบงเบ™เบ„เบท:

  • xrdp - เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบดเบ—เบตเบเบฒเบ™. เปเบˆเบเบขเบฒเบเบžเบฒเบเปƒเบ•เป‰เปƒเบšเบญเบฐเบ™เบธเบเบฒเบ” Apache 2.0.
  • xorgxrdp - เบŠเบธเบ”เบ‚เบญเบ‡เป„เบ”เป€เบงเบต Xorg เบชเปเบฒเบฅเบฑเบšเปƒเบŠเป‰เบเบฑเบš xrdp. เปƒเบšเบญเบฐเบ™เบธเบเบฒเบ” - X11 (เบ„เบทเบเบฑเบš MIT, เปเบ•เปˆเบซเป‰เบฒเบกเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เป‚เบ„เบชเบฐเบ™เบฒ)

เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡ rdesktop เปเบฅเบฐ FreeRDP. เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™, เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบฎเบนเบšเบžเบฒเบš, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VNC เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เบซเบผเบทเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ X11 เบžเบดเป€เบชเบ”เบ—เบตเปˆเบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ RDP - X11rdp, เปเบ•เปˆเบเบฑเบšเบเบฒเบ™เบกเบฒเป€เบ–เบดเบ‡เบ‚เบญเบ‡ xorgxrdp, เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบžเบงเบเบกเบฑเบ™เบซเบฒเบเป„เบ›.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบเบงเบกเป€เบญเบปเบฒ xorgxrdp.

เป‚เบ„เบ‡เบเบฒเบ™ xrdp, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบซเบผเบฒเบเปเบฅเบฐเบกเบตเบ›เบฐเบกเบฒเบ™ 80 เบžเบฑเบ™เบชเบฒเบ.

เบเบฒเบ™เบเบงเบ”เบชเบญเบš rdesktop เปเบฅเบฐ xrdp เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio

เบžเบดเบกเบœเบดเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก

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, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเปเบ›เบ‡เบชเบฑเบ™เบเบฒเบ™ jpeg2000 เบชเปเบฒเบฅเบฑเบš RemoteFX. เบ—เบตเปˆเบ™เบตเป‰, เบ›เบฒเบเบปเบ”เบ‚เบทเป‰เบ™, เบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบเบฒเบŸเบดเบเปเบกเปˆเบ™เบ›เบฐเบชเบปเบก - เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบชเบต "เบชเบตเบŸเป‰เบฒ", "เบชเบตเปเบ”เบ‡" เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰. เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบ›เบฒเบเบปเบ”เป€เบ›เบฑเบ™เบœเบปเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™เบชเบณเป€เบ™เบปเบฒ-เบงเบฒเบ‡.

เบšเบฑเบ™เบซเบฒเบ”เบฝเบงเบเบฑเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™ 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++;
}

เบ›เบฐเบเบฒเบ” Array

V557 เบเบฒเบ™ overrun Array เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰. เบ„เปˆเบฒเบ‚เบญเบ‡เบ”เบฑเบ”เบŠเบฐเบ™เบต '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, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบšเปเปˆเบกเบตเบ‚เบญเบšเป€เบ‚เบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆ bug เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ.

เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡

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 เบˆเบฒเบเบžเบงเบเป€เบฎเบปเบฒ site.

เบเบฒเบ™เบเบงเบ”เบชเบญเบš rdesktop เปเบฅเบฐ xrdp เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบเบฑเบšเบœเบนเป‰เบŠเบปเบกเบ—เบตเปˆเป€เบงเบปเป‰เบฒเบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ”, เบเบฐเบฅเบธเบ™เบฒเปƒเบŠเป‰เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เปเบ›เบžเบฒเบชเบฒ: Sergey Larin. เบเบณเบฅเบฑเบ‡เบเบงเบ”เบชเบญเบš rdesktop เปเบฅเบฐ xrdp เบ”เป‰เบงเบ PVS-Studio

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster