ื‘ื“ื™ืงืช rdesktop ื•-xrdp ื‘ืืžืฆืขื•ืช ืžื ืชื— PVS-Studio

ื‘ื“ื™ืงืช rdesktop ื•-xrdp ื‘ืืžืฆืขื•ืช ืžื ืชื— PVS-Studio
ื–ื•ื”ื™ ื”ืกืงื™ืจื” ื”ืฉื ื™ื™ื” ื‘ืกื“ืจืช ืžืืžืจื™ื ืขืœ ื‘ื“ื™ืงืช ืชื•ื›ื ื•ืช ืงื•ื“ ืคืชื•ื— ืœืขื‘ื•ื“ื” ืขื ืคืจื•ื˜ื•ืงื•ืœ RDP. ื‘ื• ื ืกืชื›ืœ ืขืœ ืœืงื•ื— rdesktop ื•ืฉืจืช xrdp.

ืžืฉืžืฉ ื›ื›ืœื™ ืœื–ื™ื”ื•ื™ ืฉื’ื™ืื•ืช ืกื˜ื•ื“ื™ื• PVS. ื–ื”ื• ืžื ืชื— ืงื•ื“ ืกื˜ื˜ื™ ืœืฉืคื•ืช C, C++, C# ื•-Java, ื–ืžื™ืŸ ื‘ืคืœื˜ืคื•ืจืžื•ืช Windows, Linux ื•-macOS.

ื”ืžืืžืจ ืžืฆื™ื’ ืจืง ืืช ื”ืฉื’ื™ืื•ืช ืฉื ืจืื• ืœื™ ืžืขื ื™ื™ื ื•ืช. ืขื ื–ืืช, ื”ืคืจื•ื™ืงื˜ื™ื ืงื˜ื ื™ื, ืื– ื”ื™ื• ืžืขื˜ ื˜ืขื•ื™ื•ืช :).

ืฉื™ื ืœื‘. ื ื™ืชืŸ ืœืžืฆื•ื ืžืืžืจ ืงื•ื“ื ืขืœ ืื™ืžื•ืช ืคืจื•ื™ืงื˜ FreeRDP ื›ืืŸ.

ืฉื•ืœื—ืŸ ืขื‘ื•ื“ื” r

ืฉื•ืœื—ืŸ ืขื‘ื•ื“ื” r - ื”ื˜ืžืขื” ื—ื•ืคืฉื™ืช ืฉืœ ืœืงื•ื— RDP ืขื‘ื•ืจ ืžืขืจื›ื•ืช ืžื‘ื•ืกืกื•ืช UNIX. ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื• ื’ื ืชื—ืช 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 ืชื™ืชื›ืŸ ืชืช-ืจืฆืฃ ืฉืœ ืžืขืจืš. ื”ืขืจืš ืฉืœ ืื™ื ื“ืงืก '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 ื‘ืกื•ื’ 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++;
  }
  ....
}

ื›ืืŸ ืื ื• ืจื•ืื™ื ื˜ื™ืคื•ืœ ืœื ื ื›ื•ืŸ ื‘ื”ื’ืขื” ืœืกื•ืฃ ื”ืงื•ื‘ืฅ: if fgetc ืžื—ื–ื™ืจ ืชื• ืฉื”ืงื•ื“ ืฉืœื• ื”ื•ื 0xFF, ื”ื•ื ื™ืชืคืจืฉ ื›ืกื•ืฃ ื”ืงื•ื‘ืฅ (EOF).

EOF ื–ื”ื• ืงื‘ื•ืข, ื”ืžื•ื’ื“ืจ ื‘ื“ืจืš ื›ืœืœ ื›-1. ืœื“ื•ื’ืžื”, ื‘ืงื™ื“ื•ื“ CP1251, ืœืื•ืช ื”ืื—ืจื•ื ื” ื‘ืืœืคื‘ื™ืช ื”ืจื•ืกื™ ื™ืฉ ืืช ื”ืงื•ื“ 0xFF, ืฉืžืชืื™ื ืœืžืกืคืจ -1 ืื ืื ื—ื ื• ืžื“ื‘ืจื™ื ืขืœ ืžืฉืชื ื” ื›ืžื• char. ืžืกืชื‘ืจ ืฉื”ืกืžืœ 0xFF, ื›ืžื• EOF (-1) ืžืชืคืจืฉ ื›ืกื•ืฃ ื”ืงื•ื‘ืฅ. ื›ื“ื™ ืœืžื ื•ืข ืฉื’ื™ืื•ืช ื›ืืœื”, ื”ืชื•ืฆืื” ืฉืœ ื”ืคื•ื ืงืฆื™ื” ื”ื™ื fgetc ืฆืจื™ืš ืœื”ื™ื•ืช ืžืื•ื—ืกืŸ ื‘ืžืฉืชื ื” ื›ืžื• int.

ืฉื’ื™ืื•ืช ื›ืชื™ื‘

ืงื˜ืข 1

V547 ื”ื‘ื™ื˜ื•ื™ 'ื–ืžืŸ_ื›ืชื™ื‘ื”' ื”ื•ื ืชืžื™ื“ ืฉืงืจ. 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: ื‘ื—ืจ ืืช ื”ืขืจืš ื”ืžื™ื ื™ืžืœื™.

ื›ืืฉืจ ืžื—ืœื™ืคื™ื ืืช ื”ืžืฆื‘ ื‘ ื›ืชื‘_ื–ืžืŸ && ืฉื™ื ื•ื™_ื–ืžืŸ ื”ื”ืชื ื”ื’ื•ืช ืชื™ืจืื” ื ื›ื•ื ื”:

  • ืื—ื“ ื”ืžืฉืชื ื™ื ืื• ืฉื ื™ื”ื ืื™ื ื ืฉื•ื•ื™ื ืœ-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, ื”ืžื™ื™ืฉืžืช ืืช ื”-codec 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 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 ืžืงื•ื•ืŸ.

ื‘ื“ื™ืงืช rdesktop ื•-xrdp ื‘ืืžืฆืขื•ืช ืžื ืชื— PVS-Studio

ืื ืืชื” ืจื•ืฆื” ืœืฉืชืฃ ืžืืžืจ ื–ื” ืขื ืงื”ืœ ื“ื•ื‘ืจ ืื ื’ืœื™ืช, ืื ื ื”ืฉืชืžืฉ ื‘ืงื™ืฉื•ืจ ื”ืชืจื’ื•ื: ืกืจื’ื™ื™ ืœืจื™ืŸ. ื‘ื“ื™ืงืช rdesktop ื•-xrdp ืขื PVS-Studio

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”