αž€αŸ†αž–αž»αž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž› rdesktop αž“αž·αž„ xrdp αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚ PVS-Studio

αž–αž·αž“αž·αžαŸ’αž™ rdesktop αž“αž·αž„ xrdp αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚ PVS-Studio
αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž–αž·αž“αž·αžαŸ’αž™β€‹αž›αžΎαž€β€‹αž‘αžΈβ€‹αž–αžΈαžšβ€‹αž€αŸ’αž“αž»αž„β€‹αž’αžαŸ’αžαž”αž‘β€‹αž‡αžΆβ€‹αž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž’αŸ†αž–αžΈβ€‹αž€αžΆαžšβ€‹αžŸαžΆαž€αž›αŸ’αž”αž„β€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž”αŸ’αžšαž—αž–β€‹αž”αžΎαž€αž…αŸ†αž β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšβ€‹αž‡αžΆαž˜αž½αž™β€‹αž–αž·αž’αžΈαž€αžΆαžšβ€‹ RDP αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆ αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ rdesktop αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ xrdp αŸ”

αž”αŸ’αžšαžΎαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž€αŸ†αž αž»αžŸ αž—αžΈαŸ” αž’αŸαžŸαŸ” αž’αŸαžŸαŸ” αžŸαŸ’αž‘αžΌαžŒαžΈαž™αŸ„. αžœαžΆαž‚αžΊαž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžœαž·αž—αžΆαž‚αž€αžΌαžŠαž‹αž·αžαž·αžœαž“αŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαžŸαžΆ C, C++, C# αž“αž·αž„ Java αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš Windows, Linux αž“αž·αž„ macOS αŸ”

αž’αžαŸ’αžαž”αž‘αž”αž„αŸ’αž αžΆαž‰αžαŸ‚αž€αŸ†αž αž»αžŸαž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αžŠαŸ‚αž›αž˜αžΎαž›αž‘αŸ…αž‚αž½αžšαž’αŸ„αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž…αŸ†αž–αŸ„αŸ‡αžαŸ’αž‰αž»αŸ†αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž‚αž˜αŸ’αžšαŸ„αž„αžαžΌαž…αžαžΆαž… αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž˜αžΆαž“αž€αŸ†αž αž»αžŸαžαž·αž…αžαž½αž… :) αŸ”

αž€αžΆαžšαž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹. αž’αžαŸ’αžαž”αž‘αž˜αž»αž“αž’αŸ†αž–αžΈαž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ FreeRDP αž’αžΆαž…αžšαž€αž”αžΆαž“ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž›αžΎαžαž»

αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž›αžΎαžαž» - αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ RDP αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎαž™αžΌαž“αžΈαž€αŸ” αžœαžΆαž€αŸαž’αžΆαž…αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αžšαŸ„αž˜ 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 αž†αŸ’αž“αžΆαŸ† ៑៨៧្

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 αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž—αŸαž‘ 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 αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž€αŸ†αž–αž»αž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž’αžαŸαžšαžŠαžΌαž…αž‡αžΆ αžαž½αž’αž€αŸ’αžŸαžš. αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆαž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆ 0xFF αžŠαžΌαž…αž‡αžΆ EOF (-1) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž€αžŸαŸ’αžšαžΆαž™αžαžΆαž‡αžΆαž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž―αž€αžŸαžΆαžšαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž‡αŸ€αžŸαžœαžΆαž„αž€αŸ†αž αž»αžŸαž”αŸ‚αž”αž“αŸαŸ‡αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž˜αž»αžαž„αžΆαžšαž‚αžΊ fgetc αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸαžšαžŠαžΌαž… int.

Typos

αž”αŸ†αžŽαŸ‚αž€ 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; // <=
  ....
}

αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž€αžΌαžŠαž“αŸαŸ‡αž™αž›αŸ‹αžαž»αžŸαž αžΎαž™αŸ” || ΠΈ && αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαŸ” αž…αžΌαžšαž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαž–αžΈαž‡αž˜αŸ’αžšαžΎαžŸαžŠαŸ‚αž›αž’αžΆαž…αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž˜αŸ’αž›αŸƒ សរសេរ_αž˜αŸ‰αŸ„αž„ ΠΈ αž–αŸαž›αžœαŸαž›αžΆαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš:

  • αž’αžαŸαžšαž‘αžΆαŸ†αž„αž–αžΈαžšαž‚αžΊαžŸαŸ’αž˜αžΎαž“αžΉαž„ 0αŸ– αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžαžΆαž˜αž½αž™αŸ” αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ– αž”αŸ’αžšαŸ‚αž”αŸ’αžšαž½αž› mod_time αž“αžΉαž„αžαŸ‚αž„αžαŸ‚αž‡αžΆ 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' αž“αžΉαž„αž“αžΆαŸ†αž‘αŸ…αžŠαž›αŸ‹αž€αžΆαžšαž›αžΎαžŸαž…αŸ†αžŽαž»αŸ‡αž“αŸƒ '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);
  ....
}

αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž˜αžΎαž›αž˜αž»αžαž„αžΆαžšαž–αŸαž‰αž›αŸαž‰ αžœαžΆαž“αžΉαž„αž…αŸ’αž”αžΆαžŸαŸ‹αžαžΆαž€αžΌαžŠαž“αŸαŸ‡αž˜αž·αž“αž”αž„αŸ’αž€αž”αž‰αŸ’αž αžΆαž‘αŸαŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž–αž½αž€αž‚αŸαž’αžΆαž…αž“αžΉαž„αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž–αŸαž›αž’αž“αžΆαž‚αžαŸ– αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžœαž›αŸ‹αž˜αž½αž™ αž αžΎαž™αž™αžΎαž„αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αžŸαžαž·αž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“ - αžšαžαŸ‹ αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž’αŸ’αžœαžΈαž“αŸ„αŸ‡αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αž—αŸ’αž‡αžΆαž”αŸ‹αž•αŸ’αž›αžΌαžœ αž™αžΎαž„αž’αžΆαž…αž‘αŸ…αž αž½αžŸαž–αžΈαž–αŸ’αžšαŸ†αžŠαŸ‚αž“αž“αŸƒαž’αžΆαžšαŸαŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžŠαž›αŸ‹αž’αž“αž»αžŸαžΆαžŸαž“αŸαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαž αŸ…αž“αŸαŸ‡αž“αŸ…αž›αžΎ snprintf(fullpath, 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 αŸ” - αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ 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++;
}

αžŸαŸαž…αž€αŸ’αžαžΈαž”αŸ’αžšαž€αžΆαžŸαž’αžΆαžšαŸ

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 ៦៑៦

// 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 αž–αžΈαž–αž½αž€αž™αžΎαž„ αžαŸ†αž”αž“αŸ‹αž”αžŽαŸ’αžαžΆαž‰.

αž–αž·αž“αž·αžαŸ’αž™ rdesktop αž“αž·αž„ xrdp αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚ PVS-Studio

αž”αŸ’αžšαžŸαž·αž“β€‹αž”αžΎβ€‹αž’αŸ’αž“αž€β€‹αž…αž„αŸ‹β€‹αž…αŸ‚αž€β€‹αžšαŸ†αž›αŸ‚αž€β€‹αž’αžαŸ’αžαž”αž‘β€‹αž“αŸαŸ‡β€‹αž‡αžΆαž˜αž½αž™β€‹αž‘αžŸαŸ’αžŸαž“αž·αž€αž‡αž“β€‹αžŠαŸ‚αž›β€‹αž“αž·αž™αžΆαž™β€‹αž—αžΆαžŸαžΆβ€‹αž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ αžŸαžΌαž˜β€‹αž”αŸ’αžšαžΎβ€‹αžαŸ†αžŽβ€‹αž€αžΆαžšβ€‹αž”αž€β€‹αž”αŸ’αžšαŸ‚αŸ– Sergey LarinαŸ” αž€αŸ†αž–αž»αž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž› rdesktop αž“αž·αž„ xrdp αž‡αžΆαž˜αž½αž™ PVS-Studio

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹