Ke nānā ʻana i ka rdesktop a me ka xrdp me ka hoʻohana ʻana i ka mea anaana PVS-Studio

Ke nānā nei i ka rdesktop a me ka xrdp me ka hoʻohana ʻana i ka PVS-Studio analyzer
ʻO kēia ka lua o ka loiloi i nā ʻatikala e pili ana i ka hoʻāʻo ʻana i nā papahana open source no ka hana ʻana me ka protocol RDP. Ma loko e nānā mākou i ka mea kūʻai rdesktop a me ka server xrdp.

Hoʻohana ʻia e ʻike i nā hewa ʻO PVS-Studio. He mea helu helu helu static no C, C ++, C# a me Java nā ʻōlelo, loaʻa ma Windows, Linux a me macOS platforms.

Hōʻike ka ʻatikala i kēlā mau hewa i manaʻo ʻia iaʻu. Eia naʻe, liʻiliʻi nā papahana, no laila, liʻiliʻi nā hewa :).

i hoʻopuka. Hiki ke loaʻa kahi ʻatikala mua e pili ana i ka hōʻoia papahana FreeRDP maanei.

kaluhiokalani

kaluhiokalani - kahi hoʻokō manuahi o kahi mea kūʻai aku RDP no nā ʻōnaehana UNIX. Hiki ke hoʻohana ʻia ma lalo o Windows inā kūkulu ʻoe i ka papahana ma lalo o Cygwin. Laikini ma lalo o GPLv3.

He mea kaulana loa kēia mea kūʻai - ua hoʻohana ʻia ia ma ka paʻamau ma ReactOS, a hiki iā ʻoe ke loaʻa i nā ʻaoʻao kiʻi kiʻi ʻekolu no ia. Eia nō naʻe, ua ʻelemakule ʻo ia: ʻo kāna hoʻokuʻu mua ʻana i hana ʻia ma ʻApelila 4, 2001 - i ka manawa i kākau ai, ʻo ia ʻo 17 mau makahiki.

E like me kaʻu i ʻike mua ai, liʻiliʻi loa ka papahana. Loaʻa iā ia ma kahi o 30 tausani mau laina o ke code, he mea ʻē aʻe i ka noʻonoʻo ʻana i kona mau makahiki. No ka hoʻohālikelike, loaʻa iā FreeRDP nā laina 320 tausani. Eia ka hopena o ka polokalamu Cloc:

Ke nānā nei i ka rdesktop a me ka xrdp me ka hoʻohana ʻana i ka PVS-Studio analyzer

Code hiki ʻole ke kiʻi ʻia

V779 Ua ʻike ʻia ke code i loaʻa ʻole. Aia paha he hewa. 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);
}

Loaʻa koke ka hewa iā mākou i ka hana ka papa kuhikuhiE: ʻike mākou i ke code e hele mai ana ma hope o ka mea hoʻohana hoi mai - hana kēia ʻāpana i ka hoʻomaʻemaʻe hoʻomanaʻo. Eia naʻe, ʻaʻole hoʻoweliweli ka hewa: e holoi ʻia nā hoʻomanaʻo āpau e ka ʻōnaehana hana ma hope o ka puka ʻana o ka papahana.

ʻAʻohe hana hewa

V557 Hiki ke hoʻopaʻa ʻia i ka underrun. Hiki i ka waiwai o ka 'n' index ke hiki i -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);
  }
  ....
}

Heluhelu ʻia ka snippet code ma kēia hihia mai ka faile i loko o kahi pale a hiki i ka pau ʻana o ka faila. Eia nō naʻe, ʻaʻohe hana hewa ma aneʻi: inā hewa kekahi mea, a laila heluhelu e hoʻi mai -1, a laila e hoʻopau ʻia ka array ia auoiaea.

Ke hoʻohana nei i ka EOF ma ke ʻano char

V739 ʻAʻole pono e hoʻohālikelike ʻia ʻo EOF me kahi waiwai o ke ʻano 'char'. Pono ka '(c = fgetc(fp))' ma ke ʻano '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++;
  }
  ....
}

Maʻaneʻi mākou e ʻike ai i ka lawelawe hewa ʻana o ka hiki ʻana i ka hopena o ka faila: inā fgetc hoʻihoʻi i kahi ʻano nona ka code 0xFF, e unuhi ʻia ʻo ia ka hopena o ka faila (EOF).

EOF he mea mau, i wehewehe pinepine ia e like me -1. No ka laʻana, i ka CP1251 encoding, ʻo ka leka hope loa o ka huapalapala Lūkini he code 0xFF, e pili ana i ka helu -1 inā mākou e kamaʻilio e pili ana i kahi loli like. Mike Char. ʻIke ʻia ka hōʻailona 0xFF, like EOF (-1) ua unuhi ʻia ʻo ia ka hopena o ka faila. No ka pale ʻana i kēlā mau hewa, ʻo ka hopena o ka hana fgetc Pono e mālama ʻia ma kahi ʻano like INT.

Nā typos

Māhele 1

V547 Hoʻopunipuni mau ka ʻōlelo '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; // <=
  ....
}

Ua hewa paha ka mea kākau o kēia code || и && ma ke kulana. E noʻonoʻo kākou i nā koho kūpono no nā waiwai kākau_manawa и loli_manawa:

  • Ua like nā mea hoʻololi ʻelua me 0: i kēia hihia e hoʻopau mākou i kahi lālā e ae: hoololi mod_time e mau ana 0 me ka nana ole i ke kulana mahope.
  • ʻO kekahi o nā mea hoʻololi he 0: mod_time e like ia me 0 (inā loaʻa ka waiwai ʻino ʻole o ka hoʻololi ʻē aʻe), no ka mea MIN e koho i ka mea liʻiliʻi o nā koho ʻelua.
  • ʻAʻole like nā mea hoʻololi ʻelua me 0: koho i ka waiwai liʻiliʻi.

Ke hoʻololi i ke kūlana me kakau_manawa && hoololi_manawa e nānā pono ka hana:

  • ʻAʻole like kekahi a i ʻole nā ​​mea ʻelua i ka 0: koho i kahi waiwai ʻole-zero.
  • ʻAʻole like nā mea hoʻololi ʻelua me 0: koho i ka waiwai liʻiliʻi.

Māhele 2

V547 He ʻoiaʻiʻo mau ka ʻōlelo. Pono paha ka mea hoʻohana '&&' maanei. 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;
  ....
}

ʻIke ʻia ua hui pū ʻia nā mea hoʻohana ma ʻaneʻi || и &&, aiʻole == и !=: ʻAʻole hiki i kahi hoʻololi ke loaʻa ka waiwai 20 a me 9 i ka manawa like.

Ke kope laina palena ʻole

V512 ʻO ke kāhea ʻana o ka hana 'sprintf' e alakaʻi i ke kahe ʻana o ka 'fullpath' buffer. 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);
  ....
}

Ke nānā ʻoe i ka hana piha, e ʻike ʻia ʻaʻole pilikia kēia code. Eia nō naʻe, e kū mai paha lākou i ka wā e hiki mai ana: hoʻokahi hoʻololi mālama ʻole a loaʻa iā mākou kahi puʻupuʻu nui - holo kukini ʻaʻole i kaupalena ʻia e kekahi mea, no laila i ka hui ʻana i nā ala hiki iā mākou ke hele ma waho o nā palena o ka array. Manaʻo ʻia e nānā i kēia kelepona snprintf(fullpath, PATH_MAX, ….).

Kūlana hoʻonui

V560 He ʻoiaʻiʻo mau kekahi ʻāpana o ka ʻōlelo kūlana: hoʻohui > 0. scard.c 507

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

nana hoʻohui > 0 ʻaʻohe pono ma ʻaneʻi: ʻoi aku ka nui o ka mea hoʻololi ma mua o ka ʻole, no ka mea heluhelu % 4 e hoʻihoʻi i ke koena o ka mahele, akā ʻaʻole ia e like me 4.

xrdp

xrdp - ka hoʻokō ʻana i kahi kikowaena RDP me ka code open source. Ua māhele ʻia ka papahana i 2 mau ʻāpana:

  • xrdp - hoʻokō protocol. Hāʻawi ʻia ma lalo o ka laikini Apache 2.0.
  • xorgxrdp - He hoʻonohonoho o nā mea hoʻokele Xorg no ka hoʻohana ʻana me xrdp. Laikini - X11 (e like me MIT, akā pāpā i ka hoʻohana ʻana i ka hoʻolaha)

Hoʻokumu ʻia ka hoʻomohala ʻana o ka papahana ma nā hopena o rdesktop a me FreeRDP. I ka hoʻomaka, e hana me nā kiʻi, pono ʻoe e hoʻohana i kahi kikowaena VNC kaʻawale, a i ʻole kahi kikowaena X11 kūikawā me ke kākoʻo RDP - X11rdp, akā me ka hiki ʻana mai o xorgxrdp, ua nalowale ka pono no lākou.

Ma kēia ʻatikala ʻaʻole mākou e uhi i ka xorgxrdp.

ʻO ka papahana xrdp, e like me ka mea ma mua, he liʻiliʻi loa a aia ma kahi o 80 tausani mau laina.

Ke nānā nei i ka rdesktop a me ka xrdp me ka hoʻohana ʻana i ka PVS-Studio analyzer

ʻO nā kuhi hewa hou aku

V525 Aia ka code i ka hōʻiliʻili o nā poloka like. E nānā i nā mea 'r', 'g', 'r' ma nā 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++;
      }
      ....
  }
  ....
}

Ua lawe ʻia kēia code mai ka waihona librfxcodec, kahi e hoʻokō ai i ka codec jpeg2000 no RemoteFX. Ma ʻaneʻi, ʻike ʻia, ua hui pū ʻia nā kahawai ʻikepili kiʻi - ma kahi o ke kala "uliuli", ua hoʻopaʻa ʻia ka "ʻulaʻula". Ua ʻike ʻia kēia hewa ma muli o ke kope-paʻi.

Ua like ka pilikia ma kahi hana like rfx_encode_format_argb, ka mea nana i hai mai ia makou:

V525 Aia ka code i ka hōʻiliʻili o nā poloka like. E nānā i nā mea 'a', 'r', 'g', 'r' ma nā 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++;
}

Hōʻike Array

V557 Hiki ke hoʻonui ʻia ka laʻana. Hiki i ka helu 'i — 8' ke hiki i ka 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];
    ....
  }
  ....
}

ʻAʻole kūpono ka ʻōlelo a me ka wehewehe ʻana o ka array ma kēia mau faila ʻelua - ʻokoʻa ka nui me 1. Akā naʻe, ʻaʻohe hewa - ua kuhikuhi ʻia ka nui kūpono i ka faila evdev-map.c, no laila ʻaʻohe mea i waho. No laila, he bug wale nō kēia i hiki ke hoʻoponopono maʻalahi.

Hoʻohālikelike hewa

V560 Hoʻopunipuni mau kekahi ʻāpana o ka ʻōlelo kūlana: (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))
  {
    ....
  }
  ....
}

Heluhelu ka hana i kekahi ʻano hoʻololi unsigned pōkole i loko o kahi hoʻololi like INT. ʻAʻole pono ka nānā ʻana ma ʻaneʻi no ka mea ke heluhelu nei mākou i kahi ʻano helu ʻole a hāʻawi i ka hopena i kahi ʻano nui, no laila ʻaʻole hiki i ka mea hoʻololi ke lawe i kahi waiwai maikaʻi ʻole.

Nā nānā pono ʻole

V560 He ʻoiaʻiʻo mau kekahi ʻāpana o ka ʻōlelo kūlana: (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;
  }
  ....
}

ʻAʻole kūpono nā loiloi like ʻole ma ʻaneʻi no ka mea ua loaʻa iā mākou kahi hoʻohālikelike i ka hoʻomaka. Malia paha he typo kēia a ua makemake ka mea hoʻomohala e hoʻohana i ka mea hoʻohana || e kānana i nā manaʻo kūpono ʻole.

hopena

I ka wā o ka loiloi, ʻaʻohe hewa koʻikoʻi i ʻike ʻia, akā nui nā hemahema i ʻike ʻia. Eia nō naʻe, hoʻohana ʻia kēia mau hoʻolālā i nā ʻōnaehana he nui, ʻoiai he liʻiliʻi ka laulā. ʻAʻole nui nā hewa o kahi papahana liʻiliʻi, no laila, ʻaʻole pono ʻoe e hoʻohewa i ka hana a ka mea loiloi ma nā papahana liʻiliʻi wale nō. Hiki iā ʻoe ke heluhelu hou aʻe e pili ana i kēia ma ka ʻatikala "Nā manaʻo i hōʻoia ʻia e nā helu".

Hiki iā ʻoe ke hoʻoiho i kahi mana hoʻāʻo o PVS-Studio mai iā mākou kahua pūnaewele.

Ke nānā nei i ka rdesktop a me ka xrdp me ka hoʻohana ʻana i ka PVS-Studio analyzer

Inā makemake ʻoe e kaʻana like i kēia ʻatikala me kahi anaina ʻōlelo Pelekania, e ʻoluʻolu e hoʻohana i ka loulou unuhi: Sergey Larin. Ke nānā nei i rdesktop a me xrdp me PVS-Studio

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka