ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ rdesktop ืื•ืŸ xrdp ืžื™ื˜ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ

ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ rdesktop ืื•ืŸ xrdp ื ื™ืฆืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ
ื“ืึธืก ืื™ื– ื“ื™ ืจื’ืข ืจืขืฆืขื ื–ื™ืข ืื™ืŸ ืึท ืกืขืจื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ืึทืจื˜ื™ืงืœืขืŸ ื•ื•ืขื’ืŸ ื˜ืขืกื˜ื™ื ื’ ืขืคึฟืขื ืขืŸ ืžืงื•ืจ ืžื’ื™ืœื” ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ื™ RDP ืคึผืจืึธื˜ืึธืงืึธืœ. ืื™ืŸ ืขืก ืžื™ืจ ื•ื•ืขืœืŸ ืงื•ืงืŸ ืื™ืŸ ื“ื™ rdesktop ืงืœื™ืขื ื˜ ืื•ืŸ ื“ื™ xrdp ืกืขืจื•ื•ืขืจ.

ื’ืขื•ื•ื™ื™ื ื˜ ื•ื•ื™ ืึท ื’ืขืฆื™ื™ึทื’ ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืขืจืจืึธืจืก ืคึผื•ื•ืก-ืกื˜ื•ื“ื™ืึธ. ืขืก ืื™ื– ืึท ืกื˜ืึทื˜ื™ืง ืงืึธื“ ืึทื ืึทืœื™ื–ืขืจ ืคึฟืึทืจ C, C ++, C # ืื•ืŸ Java ืฉืคึผืจืึทื›ืŸ, ื‘ื ื™ืžืฆื ืื•ื™ืฃ Windows, Linux ืื•ืŸ macOS ืคึผืœืึทื˜ืคืึธืจืžืก.

ื“ืขืจ ืึทืจื˜ื™ืงืœ ื’ื™ื˜ ื‘ืœื•ื™ื– ื“ื™ ืขืจืจืึธืจืก ื•ื•ืึธืก ื’ืขื•ื•ืขืŸ ื˜ืฉื™ืงืึทื•ื•ืข ืฆื• ืžื™ืจ. ืึธื‘ืขืจ, ื“ื™ ืคึผืจืึทื“ื–ืฉืขืงืก ื–ืขื ืขืŸ ืงืœื™ื™ืŸ, ืึทื–ื•ื™ ืขืก ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ื•ื•ื™ื™ื ื™ืง ืžื™ืกื˜ื™ื™ืงืก :).

ื˜ืึธืŸ. ื ืคืจื™ืขืจื“ื™ืงืŸ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ FreeRDP ืคึผืจื•ื™ืขืงื˜ ื•ื•ืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ื“ืึธ.

ืจื“ืขืกืงื˜ืึธืคึผ

ืจื“ืขืกืงื˜ืึธืคึผ - ืึท ืคืจื™ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืึท RDP ืงืœื™ืขื ื˜ ืคึฟืึทืจ UNIX-ื‘ืื–ื™ืจื˜ ืกื™ืกื˜ืขืžืขืŸ. ืขืก ืงืขื ืขืŸ ืื•ื™ืš ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื•ื ื˜ืขืจ Windows ืื•ื™ื‘ ืื™ืจ ื‘ื•ื™ืขืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื•ื ื˜ืขืจ Cygwin. ืœื™ืกืขื ืกืขื“ ืื•ื ื˜ืขืจ GPLv3.

ื“ืขืจ ืงืœื™ืขื ื˜ ืื™ื– ื–ื™ื™ืขืจ ืคืึธืœืงืก - ืขืก ืื™ื– ื’ืขื ื™ืฆื˜ ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜ ืื™ืŸ ReactOS, ืื•ืŸ ืื™ืจ ืงืขื ืขืŸ ืื•ื™ืš ื’ืขืคึฟื™ื ืขืŸ ื“ืจื™ื˜-ืคึผืึทืจื˜ื™ื™ ื’ืจืึทืคื™ืงืึทืœ ืคืจืึธื ื˜ ืขื ื“ืก ืคึฟืึทืจ ืื™ื. ืึธื‘ืขืจ, ืขืจ ืื™ื– ื’ืึทื ืฅ ืึทืœื˜: ื–ื™ื™ืŸ ืขืจืฉื˜ืขืจ ืžืขืœื“ื•ื ื’ ืื™ื– ื’ืขื•ื•ืขืŸ ืื•ื™ืฃ ืืคืจื™ืœ 4, 2001 - ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ืคื•ืŸ ืฉืจื™ื™ื‘ืŸ, ืขืจ ืื™ื– 17 ื™ืืจ ืึทืœื˜.

ื•ื•ื™ ืื™ืš ื‘ืืžืขืจืงื˜ ืคืจื™ืขืจ, ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื–ื™ื™ืขืจ ืงืœื™ื™ืŸ. ืขืก ื›ึผื•ืœืœ ื‘ืขืขืจืขืš 30 ื˜ื•ื™ื–ื ื˜ ืฉื•ืจื•ืช ืคื•ืŸ ืงืึธื“, ื•ื•ืึธืก ืื™ื– ืึท ื‘ื™ืกืœ ืžืึธื“ื ืข ืงืึทื ืกื™ื“ืขืจื™ื ื’ ื–ื™ื™ึทืŸ ืขืœื˜ืขืจ. ืคึฟืึทืจ ืคืึทืจื’ืœื™ื™ึทืš, FreeRDP ื›ึผื•ืœืœ 320 ื˜ื•ื™ื–ื ื˜ ืฉื•ืจื•ืช. ื“ืึธ ืื™ื– ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ื“ื™ Cloc ืคึผืจืึธื’ืจืึทื:

ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ rdesktop ืื•ืŸ xrdp ื ื™ืฆืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ

ื•ื ืจืขืึทื˜ืฉืึทื‘ืœืข ืงืึธื“

ื•ื•ืงืกื ื•ืžืงืก ืึทื ืึทื•ื•ื™ื™ืœืึทื‘ืึทืœ ืงืึธื“ ื“ื™ื˜ืขืงื˜ืึทื“. ืขืก ืื™ื– ืžืขื’ืœืขืš ืึทื– ืึท ื˜ืขื•ืช ืื™ื– ืคืึธืจืฉื˜ืขืœืŸ. 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);
}

ื“ืขืจ ื˜ืขื•ืช ื™ื ืงืึทื•ื ื˜ืขืจื– ืื•ื ื“ื– ืžื™ื“ ืื™ืŸ ื“ื™ ืคึฟื•ื ืงืฆื™ืข ื”ื•ื™ืคึผื˜: ืžื™ืจ ื–ืขืŸ ื“ื™ ืงืึธื“ ืงื•ืžืขืŸ ื ืึธืš ื“ืขืจ ืึธืคึผืขืจืึทื˜ืึธืจ ืฆื•ืจื™ืงืงื•ืžืขืŸ - ื“ืขื ืคืจืึทื’ืžืขื ื˜ ืคึผืขืจืคืึธืจืžื– ื–ื›ึผืจื•ืŸ ืจื™ื™ื ื™ืงื•ื ื’. ืึธื‘ืขืจ, ื“ืขืจ ื˜ืขื•ืช ืื™ื– ื ื™ืฉื˜ ืึท ืกืึทืงืึธื ืข: ืึทืœืข ืึทืœืึทืงื™ื™ื˜ื™ื“ ื–ื™ืงืึธืจืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืงืœื™ืจื“ ื“ื•ืจืš ื“ื™ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขื ื ืึธืš ื“ื™ ืขื’ื–ื™ื– ืคื•ืŸ ื“ื™ ืคึผืจืึธื’ืจืึทื.

ืงื™ื™ืŸ ื˜ืขื•ืช ื”ืึทื ื“ืœื™ื ื’

ื•ื•ืงืกื ื•ืžืงืก ืžืขื ื’ืข ื•ื ื“ืขืจืจื•ืŸ ืื™ื– ืžืขื’ืœืขืš. ื“ื™ ื•ื•ืขืจื˜ ืคื•ืŸ '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 ืื™ืŸ ื˜ืฉืึทืจ ื˜ื™ืคึผ

ื•ื•ืงืกื ื•ืžืงืก EOF ื–ืึธืœ ื ื™ื˜ ื–ื™ื™ืŸ ืงืึทืžืคึผืขืจื“ ืžื™ื˜ ืึท ื•ื•ืขืจื˜ ืคื•ืŸ ื“ื™ 'char' ื˜ื™ืคึผ. ื“ื™ '(c = fgetc (fp))' ื–ืึธืœ ื–ื™ื™ืŸ ืคื•ืŸ ื“ื™ 'ื™ื ื˜' ื˜ื™ืคึผ. 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 ื–ืึธืœ ื–ื™ื™ืŸ ืกื˜ืึธืจื“ ืื™ืŸ ืึท ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ื•ื•ื™ ื™ื ื˜.

ื˜ื™ืคึผืึธืก

ืคืจืึทื’ืžืขื ื˜ 1

ื•ื•ืงืกื ื•ืžืงืก ืื•ื™ืกื“ืจื•ืง 'ืฉืจื™ื™ื‘_ื˜ื™ื™ื' ืื™ื– ืฉื˜ืขื ื“ื™ืง ืคืึทืœืฉ. 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; // <=
  ....
}

ื˜ืึธืžืขืจ ื“ืขืจ ืžื—ื‘ืจ ืคื•ืŸ ื“ืขื ืงืึธื“ ื”ืื˜ ืขืก ืคืึทืœืฉ || ะธ && ืื™ืŸ ืฆื•ืฉื˜ืึทื ื“. ื–ืืœ ืก ื‘ืึทื˜ืจืึทื›ื˜ืŸ ืžืขื’ืœืขืš ืึธืคึผืฆื™ืขืก ืคึฟืึทืจ ื•ื•ืึทืœื•ืขืก ืฉืจื™ื™ื‘_ืฆื™ื™ื˜ ะธ change_time:

  • ื‘ื™ื™ื“ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื–ืขื ืขืŸ ื’ืœื™ื™ึทืš ืฆื• 0: ืื™ืŸ ื“ืขื ืคืึทืœ ืžื™ืจ ื•ื•ืขืœืŸ ืขื ื“ื™ืงืŸ ืื™ืŸ ืึท ืฆื•ื•ื™ื™ึทื’ ืึทื ื“ืขืจืฉ: ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง mod_time ื•ื•ืขื˜ ืฉื˜ืขื ื“ื™ืง ื–ื™ื™ืŸ 0 ืจืึทื’ืึทืจื“ืœืึทืก ืคื•ืŸ ื“ื™ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ืฆื•ืฉื˜ืึทื ื“.
  • ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ืื™ื– 0: mod_time ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืœื™ื™ึทืš ืฆื• 0 (ืฆื•ื’ืขืฉื˜ืขืœื˜ ืึทื– ื“ื™ ืื ื“ืขืจืข ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ื”ืื˜ ืึท ื ื™ื˜-ื ืขื’ืึทื˜ื™ื•ื• ื•ื•ืขืจื˜), ื•ื•ื™ื™ึทืœ ืžื™ืŸ ื•ื•ืขื˜ ืงืœื™ื™ึทื‘ืŸ ื“ื™ ืงืœืขื ืขืจืขืจ ืคื•ืŸ ื“ื™ ืฆื•ื•ื™ื™ ืึธืคึผืฆื™ืขืก.
  • ื‘ื™ื™ื“ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื–ืขื ืขืŸ ื ื™ืฉื˜ ื’ืœื™ื™ึทืš ืฆื• 0: ืงืœื™ื™ึทื‘ืŸ ื“ื™ ืžื™ื ื™ืžื•ื ื•ื•ืขืจื˜.

ื•ื•ืขืŸ ืจื™ืคึผืœื™ื™ืกื™ื ื’ ื“ื™ ืฆื•ืฉื˜ืึทื ื“ ืžื™ื˜ ืฉืจื™ื™ึทื‘ืŸ_ืฆื™ื™ื˜ && ื˜ื•ื™ืฉืŸ_ืฆื™ื™ื˜ ื“ื™ ื ืึทื˜ื•ืจ ื•ื•ืขื˜ ืงื•ืงืŸ ืจื™ื›ื˜ื™ืง:

  • ืื™ื™ื ืขืจ ืึธื“ืขืจ ื‘ื™ื™ื“ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื–ืขื ืขืŸ ื ื™ืฉื˜ ื’ืœื™ื™ึทืš ืฆื• 0: ืงืœื™ื™ึทื‘ืŸ ืึท ื ื™ื˜-ื ื•ืœ ื•ื•ืขืจื˜.
  • ื‘ื™ื™ื“ืข ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื–ืขื ืขืŸ ื ื™ืฉื˜ ื’ืœื™ื™ึทืš ืฆื• 0: ืงืœื™ื™ึทื‘ืŸ ื“ื™ ืžื™ื ื™ืžื•ื ื•ื•ืขืจื˜.

ืคืจืึทื’ืžืขื ื˜ 2

ื•ื•ืงืกื ื•ืžืงืก ืื•ื™ืกื“ืจื•ืง ืื™ื– ืฉื˜ืขื ื“ื™ืง ืืžืช. ืžื™ืกื˜ืึธืžืข ื“ืขืจ '&&' ืึธืคึผืขืจืึทื˜ืึธืจ ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ื“ืึธ. 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 ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜.

ืึทื ืœื™ืžืึทื˜ืึทื“ ืฉื•ืจื” ืงืึทืคึผื™ื™ื ื’

ื•ื•ืงืกื ื•ืžืงืก ื ืจื•ืฃ ืคื•ืŸ ื“ื™ 'ืกืคึผืจื™ื ื˜ืฃ' ืคึฟื•ื ืงืฆื™ืข ื•ื•ืขื˜ ืคื™ืจืŸ ืฆื• ืœื•ื™ืคืŸ ืคื•ืŸ ื“ื™ ื‘ืึทืคืขืจ '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, โ€ฆ.).

ื™ื‘ืขืจื™ืง ืฆื•ืฉื˜ืึทื ื“

ื•ื•ืงืกื ื•ืžืงืก ื ื˜ื™ื™ืœ ืคื•ืŸ ืงืึทื ื“ื™ืฉืึทื ืึทืœ ืื•ื™ืกื“ืจื•ืง ืื™ื– ืฉื˜ืขื ื“ื™ืง ืืžืช: ืœื™ื™ื’ืŸ> 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. License - X11 (ื•ื•ื™ MIT, ืึธื‘ืขืจ ืคึผืจืึธื•ื›ื™ื‘ืึทืฅ ื ื•ืฆืŸ ืื™ืŸ ื’ืึทื ืฆืข)

ื“ื™ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ืŸ ืคื•ืŸ rdesktop ืื•ืŸ FreeRDP. ื˜ื›ื™ืœืขืก, ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ื’ืจืึทืคื™ืงืก, ืื™ืจ ื”ืึธื‘ืŸ ืฆื• ื ื•ืฆืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ VNC ืกืขืจื•ื•ืขืจ ืึธื“ืขืจ ืึท ืกืคึผืขืฆื™ืขืœ X11 ืกืขืจื•ื•ืขืจ ืžื™ื˜ RDP ืฉื˜ื™ืฆืŸ - X11rdp, ืึธื‘ืขืจ ืžื™ื˜ ื“ื™ ืึทื“ื•ื•ืขื ื˜ ืคื•ืŸ Xorgxrdp, ื“ื™ ื ื•ื™ื˜ ืคึฟืึทืจ ื–ื™ื™ ืคืึทืจืฉื•ื•ื•ื ื“ืŸ.

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ื“ืขืงืŸ xorgxrdp.

ื“ื™ xrdp ืคึผืจื•ื™ืขืงื˜, ื•ื•ื™ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ืื™ื™ื ืขืจ, ืื™ื– ื–ื™ื™ืขืจ ืงืœื™ื™ืŸ ืื•ืŸ ื›ึผื•ืœืœ ื‘ืขืขืจืขืš 80 ื˜ื•ื™ื–ื ื˜ ืฉื•ืจื•ืช.

ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ rdesktop ืื•ืŸ xrdp ื ื™ืฆืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ

ืžืขืจ ื˜ื™ืคึผ ื˜ืขื•ืช

ื•ื•ืงืกื ื•ืžืงืก ื“ืขืจ ืงืึธื“ ื›ึผื•ืœืœ ื“ื™ ื–ืึทืžืœื•ื ื’ ืคื•ืŸ ืขื ืœืขืš ื‘ืœืึทืงืก. ืงื•ืง ื“ื™ ื–ืื›ืŸ 'ืจ', 'ื’', 'ืจ' ืื™ืŸ ื“ื™ ืฉื•ืจื•ืช 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++;
      }
      ....
  }
  ....
}

ื“ืขืจ ืงืึธื“ ืื™ื– ื’ืขื ื•ืžืขืŸ ืคื•ืŸ ื“ื™ ืœื™ื‘ืจืคืงืกืงืึธื“ืขืง ื‘ื™ื‘ืœื™ืึธื˜ืขืง, ื•ื•ืึธืก ื™ืžืคึผืœืึทืžืึทื ืฅ ื“ื™ jpeg2000 ืงืึธื“ืขืง ืคึฟืึทืจ ืจืขืžืึธื˜ืขืคืงืก. ื“ืึธ, ืžืฉืžืขื•ืช, ื“ื™ ื’ืจืึทืคื™ืง ื“ืึทื˜ืŸ ื˜ืฉืึทื ืึทืœื– ื–ืขื ืขืŸ ื’ืขืžื™ืฉื˜ - ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ื“ื™ "ื‘ืœื•ื™" ืงืึธืœื™ืจ, "ืจื•ื™ื˜" ืื™ื– ืจืขืงืึธืจื“ืขื“. ื“ืขืจ ื˜ืขื•ืช ืื™ื– ืžื™ืกื˜ืึธืžืข ืืจื•ื™ืก ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ืงืึธืคึผื™ืข-ืคึผืึทืกื˜ืข.

ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืคึผืจืึธื‘ืœืขื ืคืืจื’ืขืงื•ืžืขืŸ ืื™ืŸ ืึท ืขื ืœืขืš ืคึฟื•ื ืงืฆื™ืข rfx_encode_format_argb, ื•ื•ืึธืก ื“ืขืจ ืึทื ืึทืœื™ื–ืขืจ ื”ืึธื˜ ืื•ื ื“ื– ืื•ื™ืš ื’ืขื–ืึธื’ื˜:

ื•ื•ืงืกื ื•ืžืงืก ื“ืขืจ ืงืึธื“ ื›ึผื•ืœืœ ื“ื™ ื–ืึทืžืœื•ื ื’ ืคื•ืŸ ืขื ืœืขืš ื‘ืœืึทืงืก. ืงื•ืง ื“ื™ ื–ืื›ืŸ 'ืึท', 'ืจ', 'ื’', 'ืจ' ืื™ืŸ ื“ื™ ืฉื•ืจื•ืช 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++;
}

ืžืขื ื’ืข ื“ืขืงืœืึทืจืึทืฆื™ืข

ื•ื•ืงืกื ื•ืžืงืก ืžืขื ื’ืข ืึธื•ื•ื•ืขืจืจื•ืŸ ืื™ื– ืžืขื’ืœืขืš. ื“ื™ ื•ื•ืขืจื˜ ืคื•ืŸ 'ืื™ืš โ€” 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 ื˜ืขืงืข, ืึทื–ื•ื™ ืขืก ืื™ื– ืงื™ื™ืŸ ืื•ื™ืก ืคื•ืŸ ื’ื•ื•ื•ืœ. ืึทื–ื•ื™ ื“ืึธืก ืื™ื– ื ืึธืจ ืึท ื–ืฉื•ืง ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื™ื™ื›ื˜ ืคืึทืจืคืขืกื˜ื™ืงื˜.

ืคืึทืœืฉ ืคืึทืจื’ืœื™ื™ึทืš

ื•ื•ืงืกื ื•ืžืงืก ื ื˜ื™ื™ืœ ืคื•ืŸ ืงืึทื ื“ื™ืฉืึทื ืึทืœ ืื•ื™ืกื“ืจื•ืง ืื™ื– ืฉื˜ืขื ื“ื™ืง ืคืึทืœืฉ: (ืงืึทืคึผ_ืœืขืŸ < 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))
  {
    ....
  }
  ....
}

ื“ื™ ืคึฟื•ื ืงืฆื™ืข ืœื™ื™ืขื ื˜ ืึท ื˜ื™ืคึผ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ื•ื ืกื™ื’ื ืขื“ ืงื•ืจืฅ ืื™ืŸ ืึท ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ื•ื•ื™ ื™ื ื˜. ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ืื™ื– ื ื™ื˜ ื“ืืจืฃ ื“ืึธ ื•ื•ื™ื™ึทืœ ืžื™ืจ ืœื™ื™ืขื ืขืŸ ืึทืŸ ืึทื ืกื™ื™ื ื“ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืื•ืŸ ืึทืกื™ื™ื ื™ื ื’ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ ืฆื• ืึท ื’ืจืขืกืขืจืข ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง, ืึทื–ื•ื™ ื“ื™ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืงืขืŸ ื ื™ืฉื˜ ื ืขืžืขืŸ ืึท ื ืขื’ืึทื˜ื™ื•ื• ื•ื•ืขืจื˜.

ื•ืžื ื™ื™ื˜ื™ืง ื˜ืฉืขืงืก

ื•ื•ืงืกื ื•ืžืงืก ื ื˜ื™ื™ืœ ืคื•ืŸ ืงืึทื ื“ื™ืฉืึทื ืึทืœ ืื•ื™ืกื“ืจื•ืง ืื™ื– ืฉื˜ืขื ื“ื™ืง ืืžืช: (ื‘ืคึผืคึผ != 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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’