PVS-Studio ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ rdesktop ๋ฐ xrdp ํ™•์ธ

๏ปฟPVS-Studio ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ rdesktop ๋ฐ xrdp ํ™•์ธ
์ด๊ฒƒ์€ RDP ํ”„๋กœํ† ์ฝœ ์ž‘์—…์„ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ ํ…Œ์ŠคํŠธ์— ๊ด€ํ•œ ์ผ๋ จ์˜ ๊ธฐ์‚ฌ ์ค‘ ๋‘ ๋ฒˆ์งธ ๋ฆฌ๋ทฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” rdesktop ํด๋ผ์ด์–ธํŠธ์™€ xrdp ์„œ๋ฒ„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋„๊ตฌ๋กœ ์‚ฌ์šฉ๋จ PVS-์ŠคํŠœ๋””์˜ค. Windows, Linux ๋ฐ macOS ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” C, C++, C# ๋ฐ Java ์–ธ์–ด์šฉ ์ •์  ์ฝ”๋“œ ๋ถ„์„๊ธฐ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—๋Š” ๋‚˜์—๊ฒŒ ํฅ๋ฏธ๋กœ์› ๋˜ ์˜ค๋ฅ˜๋งŒ ์ œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ž‘์•„์„œ ์‹ค์ˆ˜๊ฐ€ ๊ฑฐ์˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค :).

์ฃผ์˜. FreeRDP ํ”„๋กœ์ ํŠธ ๊ฒ€์ฆ์— ๊ด€ํ•œ ์ด์ „ ๊ธฐ์‚ฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

๋ฐ์Šคํฌํƒ‘

๋ฐ์Šคํฌํƒ‘ โ€” UNIX ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์šฉ RDP ํด๋ผ์ด์–ธํŠธ์˜ ๋ฌด๋ฃŒ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. Cygwin์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒฝ์šฐ Windows์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GPLv3์— ๋”ฐ๋ผ ๋ผ์ด์„ผ์Šค๊ฐ€ ๋ถ€์—ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํด๋ผ์ด์–ธํŠธ๋Š” ๋งค์šฐ ์ธ๊ธฐ๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ReactOS์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ์ด์— ๋Œ€ํ•œ ํƒ€์‚ฌ ๊ทธ๋ž˜ํ”ฝ ํ”„๋ŸฐํŠธ ์—”๋“œ๋„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Š” ๊ฝค ๋‚˜์ด๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฆด๋ฆฌ์Šค๋Š” 4๋…„ 2001์›” 17์ผ์— ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ์“ฐ๋Š” ๋‹น์‹œ ๊ทธ๋Š” XNUMX์„ธ์˜€์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋งค์šฐ ์ž‘์Šต๋‹ˆ๋‹ค. ์•ฝ 30์ค„์˜ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”๋ฐ, ์˜ค๋žœ ์„ธ์›”์„ ๊ณ ๋ คํ•˜๋ฉด ์กฐ๊ธˆ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ต๋ฅผ ์œ„ํ•ด FreeRDP์—๋Š” 320๋งŒ ์ค„์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Cloc ํ”„๋กœ๊ทธ๋žจ์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๏ปฟPVS-Studio ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 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);
}

์˜ค๋ฅ˜๋Š” ํ•จ์ˆ˜์—์„œ ์ฆ‰์‹œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ณธ๊ด€: ์—ฐ์‚ฐ์ž ๋’ค์— ์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. return โ€” ์ด ์กฐ๊ฐ์€ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ฅ˜๋Š” ์œ„ํ˜‘์„ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ• ๋‹น๋œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ ํ›„ ์šด์˜ ์ฒด์ œ์— ์˜ํ•ด ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์—†์Œ

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์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ฐฐ์—ด์ด ์˜ค๋ฒ„๋Ÿฐ๋ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ.

char ์œ ํ˜•์—์„œ 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.

์˜คํƒ€

์กฐ๊ฐ 1

V547 'write_time' ํ‘œํ˜„์‹์€ ํ•ญ์ƒ false์ž…๋‹ˆ๋‹ค. 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๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด MIN ๋‘ ์˜ต์…˜ ์ค‘ ๋” ์ž‘์€ ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๋ณ€์ˆ˜ ๋ชจ๋‘ 0์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ตœ์†Œ๊ฐ’์„ ์„ ํƒํ•˜์„ธ์š”.

์กฐ๊ฑด์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ต์ฒดํ•  ๋•Œ write_time && ๋ณ€๊ฒฝ_์‹œ๊ฐ„ ๋™์ž‘์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๋ณ€์ˆ˜ ๋ชจ๋‘ 0์ด ์•„๋‹™๋‹ˆ๋‹ค. XNUMX์ด ์•„๋‹Œ ๊ฐ’์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๋ณ€์ˆ˜ ๋ชจ๋‘ 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(์ „์ฒด ๊ฒฝ๋กœ, 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 ์—ฌ๊ธฐ์„œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ XNUMX๋ณด๋‹ค ํด ๊ฒƒ์ž…๋‹ˆ๋‹ค. % 4 ์ฝ์Œ ๋‚˜๋ˆ—์…ˆ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๊ฒฐ์ฝ” 4์™€ ๊ฐ™์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

xrdp

xrdp โ€” ์˜คํ”ˆ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ RDP ์„œ๋ฒ„ ๊ตฌํ˜„. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค:

  • xrdp - ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„. Apache 2.0 ๋ผ์ด์„ผ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
  • xorgxrdp - xrdp์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Xorg ๋“œ๋ผ์ด๋ฒ„ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ๋ผ์ด์„ผ์Šค - X11(MIT์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๊ด‘๊ณ ์— ์‚ฌ์šฉ์ด ๊ธˆ์ง€๋จ)

ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์€ rdesktop ๋ฐ FreeRDP์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ทธ๋ž˜ํ”ฝ ์ž‘์—…์„ ์œ„ํ•ด ๋ณ„๋„์˜ VNC ์„œ๋ฒ„๋‚˜ RDP๋ฅผ ์ง€์›ํ•˜๋Š” ํŠน์ˆ˜ X11 ์„œ๋ฒ„(X11rdp)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์ง€๋งŒ xorgxrdp์˜ ์ถœํ˜„์œผ๋กœ ๊ทธ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” xorgxrdp๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

xrdp ํ”„๋กœ์ ํŠธ๋Š” ์ด์ „ ํ”„๋กœ์ ํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งค์šฐ ์ž‘์œผ๋ฉฐ ์•ฝ 80๋งŒ ์ค„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๏ปฟPVS-Studio ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 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++;
      }
      ....
  }
  ....
}

์ด ์ฝ”๋“œ๋Š” RemoteFX์šฉ jpeg2000 ์ฝ”๋ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” librfxcodec ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ถ„๋ช…ํžˆ ๊ทธ๋ž˜ํ”ฝ ๋ฐ์ดํ„ฐ ์ฑ„๋„์ด ํ˜ผํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. "ํŒŒ๋ž€์ƒ‰"๋Œ€์‹  "๋นจ๊ฐ„์ƒ‰"์ด ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ ๊ฒฐ๊ณผ๋กœ ๋‚˜ํƒ€๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ๊ธฐ๋Šฅ์—์„œ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค 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-Studio ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ rdesktop ๋ฐ xrdp ํ™•์ธ

์ด ๊ธฐ์‚ฌ๋ฅผ ์˜์–ด๊ถŒ ์ฒญ์ค‘๊ณผ ๊ณต์œ ํ•˜๋ ค๋ฉด Sergey Larin ๋ฒˆ์—ญ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. PVS-Studio๋กœ rdesktop ๋ฐ xrdp ํ™•์ธ

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€