Siaki le rdesktop ma le xrdp e fa'aaoga ai le su'esu'e PVS-Studio

Siaki le rdesktop ma le xrdp i le fa'aaogaina o le PVS-Studio analyzer
O le toe iloiloga lona lua lea i se faasologa o tala e uiga i le suʻeina o polokalame tatala punaoa mo le galulue faatasi ma le RDP protocol. I totonu o le a tatou vaʻavaʻai i le rdesktop client ma le xrdp server.

Fa'aaogaina e fai ma meafaigaluega e iloa ai mea sese PVS-potu potu. O se su'esu'ega fa'amautu mo C, C ++, C# ma Java gagana, e maua i luga o Windows, Linux ma macOS platforms.

O loʻo faʻaalia e le tusiga na o na mea sese na foliga mai e manaia ia te aʻu. Ae ui i lea, o galuega faatino e laiti, o lea sa i ai ni nai mea sese :).

mataʻi. E mafai ona maua se tala muamua e uiga i le FreeRDP project verification iinei.

tusilima

tusilima - o se fa'atinoina fua o se tagata fa'atau RDP mo faiga fa'avae UNIX. E mafai fo'i ona fa'aoga i lalo ole Windows pe a e fausia le poloketi i lalo ole Cygwin. Laisene ile GPLv3.

O lenei tagata o tausia e sili ona lauiloa - e faʻaaogaina e ala i le faaletonu i ReactOS, ma e mafai foʻi ona e suʻeina faʻataʻitaʻiga faʻa-tolu pito i luma. Ae ui i lea, ua fai si matua o ia: o lona tatalaina muamua na faia ia Aperila 4, 2001 - i le taimi o le tusitusi, e 17 ona tausaga.

E pei ona ou taʻua muamua, o le poloketi e laʻititi lava. O loʻo i ai le tusa ma le 30 afe laina o le code, e fai si ese pe a mafaufau i lona matua. Mo faʻatusatusaga, FreeRDP o loʻo i ai 320 afe laina. O le gaioiga lea o le polokalame Cloc:

Siaki le rdesktop ma le xrdp i le fa'aaogaina o le PVS-Studio analyzer

Code e le mafai ona aapa atu

V779 Ua iloa le code le avanoa. E ono iai se mea sese. 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);
}

O le mea sese e fetaui ma i tatou i le taimi lava lea i le galuega tele: matou te vaʻai i le code e sau pe a maeʻa le tagata faʻatautaia foʻi - o lenei vaega e faia le faamamaina o manatuaga. Ae ui i lea, o le mea sese e le o se faʻamataʻu: o manatuaga uma e tuʻuina atu o le a faʻamalo e le faiga faʻaogaina pe a uma le polokalama.

Leai se taulimaina sese

V557 Array underrun e mafai. Ole tau ole 'n' index e mafai ona o'o ile -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);
  }
  ....
}

O le snippet code i lenei tulaga e faitau mai le faila i totonu o se paʻu seia maeʻa le faila. Ae ui i lea, e leai se mea sese e taulimaina iinei: afai ei ai se mea e faaletonu, ona faitau o le a toe foʻi mai -1, ona faʻaumatia lea o le laina gaosiga.

Faʻaaogaina le EOF i le char type

V739 E le tatau ona fa'atusatusaina le EOF i se tau o le ituaiga 'char'. O le '(c = fgetc(fp))' e tatau ona i ai i le ituaiga '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++;
  }
  ....
}

O iinei tatou te vaʻaia ai le le saʻo o le taulimaina o le oʻo atu i le pito o le faila: afai fgetc toe faʻafoʻi mai se tagata o lona code o le 0xFF, o le a faʻamatalaina o le pito o le faila (EOF).

EOF ose mea tumau, e masani ona faauigaina o le -1. Mo se faʻataʻitaʻiga, i le CP1251 encoding, o le mataitusi mulimuli o le alafapeta Rusia o loʻo i ai le code 0xFF, lea e fetaui ma le numera -1 pe afai tatou te talanoa e uiga i se fesuiaiga e pei o. SIA. E foliga mai o le faailoga 0xFF, pei EOF (-1) ua faauigaina o le pito o le faila. Ina ia aloese mai ia mea sese, o le taunuuga o le galuega o le fgetc e tatau ona teuina i se fesuiaiga pei int.

Tusitusiga

Vaega 1

V547 Fa'amatalaga 'write_time' e sese i taimi uma. tisiki.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; // <=
  ....
}

Masalo na sese le tusitala o lenei code || и && i tulaga. Sei o tatou mafaufau i filifiliga e mafai ona fai mo tulaga faatauaina tusi_taimi и sui_taimi:

  • O fesuiaiga uma e lua e tutusa ma le 0: i lenei tulaga o le a tatou iu i se lala isi: fesuia'i mod_taimi o le a 0 i taimi uma e tusa lava po o le a le tulaga e sosoo ai.
  • O se tasi o fesuiaiga o le 0: mod_taimi o le a tutusa ma le 0 (pe a fai o le isi fesuiaiga e leai se aoga), aua minu o le a filifilia le laʻititi o filifiliga e lua.
  • O fesuiaiga uma e lua e le tutusa ma le 0: filifili le tau maualalo.

Pe a suia le tulaga i tusi_taimi && sui_taimi o le a sa'o le amio:

  • E le tutusa le tasi po'o mea uma e lua i le 0: filifili se tau e le-zero.
  • O fesuiaiga uma e lua e le tutusa ma le 0: filifili le tau maualalo.

Vaega 2

V547 O fa'amatalaga e moni i taimi uma. Masalo o le '&&' e tatau ona fa'aoga iinei. 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;
  ....
}

E foliga mai o loʻo faʻafefiloi foi le au faʻatautaia iinei || и &&, po o == и !=: O se fesuiaiga e le mafai ona i ai le tau 20 ma le 9 i le taimi e tasi.

Kopi laina e le gata

V512 O le vala'au o le 'sprintf' galuega o le a ta'ita'ia ai le sosolo o le pa'u '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);
  ....
}

A e vaʻavaʻai i le gaioiga atoa, o le a manino ai o lenei tulafono e le mafua ai ni faʻafitauli. Ae ui i lea, e mafai ona tulaʻi mai i le lumanaʻi: tasi le suiga le faʻaeteete ma o le a tatou maua se faʻafefe - tamo'e e le faatapulaaina i soo se mea, o lea pe a tuufaatasia auala e mafai ona tatou o atu i tua atu o tuaoi o le array. E fautuaina e matau le valaau lea i luga snprintf(fullpath, PATH_MAX, ….).

Tulaga fa'aletonu

V560 O se vaega o fa'amatalaga tu'utu'uga e moni i taimi uma: fa'aopoopo > 0. scard.c 507

static void
inRepos(STREAM in, unsigned int read)
{
  SERVER_DWORD add = 4 - read % 4;
  if (add < 4 && add > 0)
  {
    ....
  }
}

asiasiga fa'aopoopo > 0 e leai se mea e manaʻomia iinei: o le fesuiaiga o le a sili atu i le zero, aua faitau% 4 o le a toe faafoi atu le vaega o totoe, ae o le a le tutusa lava ma le 4.

xrdp

xrdp - faʻatinoina o se RDP server ma faʻamatalaga tatala punaoa. Ua vaevaeina le poloketi i vaega e 2:

  • xrdp - fa'atinoga fa'akomepiuta. Fa'asoa i lalo ole laisene Apache 2.0.
  • xorgxrdp - O se seti o avetaavale Xorg mo le faʻaogaina ma le xrdp. Laisene - X11 (pei o le MIT, ae fa'asa ona fa'aoga i fa'asalalauga)

O le atinaʻeina o le poloketi e faʻavae i luga o taunuuga o rdesktop ma FreeRDP. I le taimi muamua, e galue ma ata, e tatau ona e faʻaogaina se isi VNC server, poʻo se X11 faʻapitoa faʻatasi ma le RDP lagolago - X11rdp, ae faʻatasi ai ma le oʻo mai o le xorgxrdp, na mou atu le manaʻomia mo i latou.

I lenei tusiga o le a tatou le aofia ai le xorgxrdp.

O le poloketi xrdp, pei o le muamua, e laʻititi tele ma e aofia ai le 80 afe laina.

Siaki le rdesktop ma le xrdp i le fa'aaogaina o le PVS-Studio analyzer

Tele fa'aoga sese

V525 O le code o lo'o i ai le aoina o poloka tutusa. Siaki aitema 'r', 'g', 'r' i laina 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++;
      }
      ....
  }
  ....
}

O lenei code na ave mai le faletusi librfxcodec, lea e faʻaaogaina le codec jpeg2000 mo RemoteFX. O iinei, e foliga mai, o laina faʻamatalaga faʻataʻitaʻi e faʻafefiloi - nai lo le lanu "lanumoana", "mumu" o loʻo faamaumauina. O lenei mea sese e foliga mai o se taunuuga o le kopi-faapipii.

O le faafitauli lava e tasi na tupu i se galuega tutusa rfx_encode_format_argb, lea na taʻu mai foi e le tagata suʻesuʻe ia i matou:

V525 O le code o lo'o i ai le aoina o poloka tutusa. Siaki aitema 'a', 'r', 'g', 'r' i laina 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++;
}

Ta'utinoga Array

V557 E mafai ona sili atu le fa'asologa. Ole tau ole 'i — 8' index e mafai ona o'o ile 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];
    ....
  }
  ....
}

O le taʻutinoga ma le faʻamalamalamaga o le faʻasologa i nei faila e lua e le fetaui - o le tele e ese mai le 1. Ae ui i lea, e leai ni mea sese e tupu - o le saʻo saʻo o loʻo faʻamaonia i le faila evdev-map.c, o lea e leai se mea e le o iai. O lea ua na o se bug e mafai ona faigofie ona toe faaleleia.

Faatusatusaga sese

V560 O se vaega o fa'amatalaga tu'utu'uga e sese i taimi uma: (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))
  {
    ....
  }
  ....
}

O le galuega e faitau se ituaiga fesuiaiga unsigned puʻupuʻu i se fesuiaiga e pei o int. E le manaʻomia le siakiina iinei ona o loʻo matou faitauina se fesuiaiga e leʻi sainia ma tuʻuina atu le taunuuga i se fesuiaiga tele, o lea e le mafai ai e le fesuiaiga ona ave se tau le lelei.

Siaki le talafeagai

V560 O se vaega o fa'amatalaga tu'utu'uga e moni i taimi uma: (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;
  }
  ....
}

O siaki le tutusa e le talafeagai iinei talu ai ua uma ona i ai se faʻatusatusaga i le amataga. E foliga mai o se mea sese lea ma na manaʻo le tagata faʻapipiʻi e faʻaoga le tagata faʻaoga || e faamama ese ai finauga le aoga.

iʻuga

I le taimi o le suʻega, e leai ni faʻalavelave matuia na faʻaalia, ae na maua le tele o faʻaletonu. Ae ui i lea, o nei mamanu o loʻo faʻaaogaina i le tele o faiga, e ui ina laʻititi i le lautele. O se poloketi la'ititi e le'o tele ni mea sese, o lea e le tatau ai ona e fa'amasinoina le fa'atinoga a le tagata su'esu'e na'o galuega laiti. E mafai ona e faitau atili e uiga i lenei mea i le tusiga "O lagona na faʻamaonia e numera".

E mafai ona e siiina mai se faʻataʻitaʻiga o le PVS-Studio mai ia i matou saite.

Siaki le rdesktop ma le xrdp i le fa'aaogaina o le PVS-Studio analyzer

Afai e te manaʻo e faʻasoa lenei tusiga i se faʻalogo Igilisi, faʻamolemole faʻaoga le fesoʻotaʻiga faʻaliliu: Sergey Larin. Siaki le rdesktop ma le xrdp ile PVS-Studio

puna: www.habr.com

Faaopoopo i ai se faamatalaga