Nyochaa rdesktop na xrdp site na iji PVS-Studio analyzer

Lelee rdesktop na xrdp site na iji PVS-Studio analyzer
Nke a bụ nlebanya nke abụọ n'usoro isiokwu gbasara ịnwale mmemme isi mmalite maka ịrụ ọrụ na ụkpụrụ RDP. N'ime ya anyị ga-elele onye ahịa rdesktop na sava xrdp.

Ejiri ya dị ka ngwá ọrụ iji chọpụta mperi PVS-.lọ nka. Ọ bụ ihe nyocha koodu static maka C, C++, C # na asụsụ Java, dị na nyiwe Windows, Linux na macOS.

Isiokwu ahụ na-enye naanị mmejọ ndị ahụ masịrị m. Otú ọ dị, ọrụ ndị ahụ dị ntakịrị, ya mere enwere mmejọ ole na ole :).

Примечание. Enwere ike ịchọta edemede gara aga gbasara nkwenye ọrụ FreeRDP ebe a.

desktọọpụ

desktọọpụ - mmejuputa iwu n'efu nke onye ahịa RDP maka sistemụ dabere na UNIX. Enwere ike iji ya n'okpuru Windows ma ọ bụrụ na ị wuo ọrụ n'okpuru Cygwin. Enyere ikike n'okpuru GPLv3.

Onye ahịa a na-ewu ewu nke ukwuu - a na-eji ya na ndabara na ReactOS, ị nwekwara ike ịhụ njedebe ihu nke ndị ọzọ maka ya. Otú ọ dị, ọ bụ nnọọ agadi: ntọhapụ mbụ ya mere na April 4, 2001 - n'oge ederede, ọ bụ 17 afọ.

Dị ka m kwuru na mbụ, ọrụ a dị nnọọ obere. O nwere ihe dị ka ahịrị 30 puku ahịrị koodu, nke bụ ihe dị ịtụnanya n'ịtụle afọ ya. Maka ntụnyere, FreeRDP nwere ahịrị 320 puku. Nke a bụ mmepụta nke mmemme Cloc:

Lelee rdesktop na xrdp site na iji PVS-Studio analyzer

Koodu enweghị ike iru

V779 Achọpụtara koodu adịghị. O kwere omume na njehie dị. 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);
}

Njehie ahụ na-ezute anyị ozugbo na ọrụ ahụ isi: anyị na-ahụ koodu na-abịa mgbe onye ọrụ nloghachi - iberibe a na-arụ ebe nchekwa ihicha. Agbanyeghị, njehie ahụ anaghị etinye egwu: sistemụ arụmọrụ ga-ehichapụ ebe nchekwa niile ekenyere mgbe mmemme ahụ gachara.

Enweghị njikwa njehie

V557 Enwere ike ime usoro nhazi. Uru nke ndeksi 'n' nwere ike iru -1. rddesktop.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);
  }
  ....
}

Mpempe koodu dị na nke a na-agụ site na faịlụ n'ime ihe nchekwa ruo mgbe faịlụ ahụ gwụ. Otú ọ dị, ọ dịghị njehie na-edozi ebe a: ọ bụrụ na ihe na-ezighị ezi, mgbe ahụ agụ ga-alaghachi -1, mgbe ahụ, a ga-ejupụta n'usoro mmepụta.

Iji EOF n'ụdị char

V739 Ekwesighi iji EOF tụnyere uru nke ụdị 'char'. '(c = fgetc(fp))' kwesịrị ịbụ nke ụdị '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++;
  }
  ....
}

N'ebe a, anyị na-ahụ njikwa na-ezighi ezi nke iru na njedebe nke faịlụ: ọ bụrụ fgetc weghachiri agwa nke koodu ya bụ 0xFF, a ga-atụgharị ya dị ka njedebe nke faịlụ (EOF).

EOF ọ bụ ihe na-adịgide adịgide, a na-akọwakarị ya dị ka -1. Dịka ọmụmaatụ, na ntinye koodu CP1251, mkpụrụedemede ikpeazụ nke mkpụrụedemede Russia nwere koodu 0xFF, nke dabara na nọmba -1 ma ọ bụrụ na anyị na-ekwu maka mgbanwe dị ka. nkwupùta. Ọ tụgharịrị na akara 0xFF, dị ka EOF (-1) ka akọwara dị ka njedebe nke faịlụ. Iji zere njehie dị otú ahụ, nsonaazụ nke ọrụ ahụ bụ fgetc kwesịrị ịchekwa na mgbanwe dị ka Int.

Ụdịdị

Iberibe 1

V547 Okwu 'write_time' na-abụ ụgha mgbe niile. diski.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; // <=
  ....
}

Ikekwe onye dere koodu a nwetara ya ezighi ezi || и && n'ọnọdụ. Ka anyị tụlee nhọrọ ndị nwere ike ime maka ụkpụrụ dee_oge и mgbanwe_oge:

  • Ụdị mgbanwe abụọ ahụ hà nhata 0: na nke a, anyị ga-ejedebe na alaka ọzọ: mgbanwe mod_oge ga-abụ 0 mgbe niile n'agbanyeghị ọnọdụ na-esote.
  • Otu n'ime mgbanwe bụ 0: mod_oge ga-adị nhata 0 (ọ bụrụhaala na mgbanwe nke ọzọ nwere uru na-adịghị mma), n'ihi na min ga-ahọrọ nke nta n'ime nhọrọ abụọ ahụ.
  • Ụdị mgbanwe abụọ a erughị 0: họrọ uru kacha nta.

Mgbe ejiri dochie ọnọdụ ahụ dee_oge && mgbanwe_oge omume ahụ ga-adị mma:

  • Otu ma ọ bụ abụọ agbanweghị nha 0: họrọ uru na-abụghị efu.
  • Ụdị mgbanwe abụọ a erughị 0: họrọ uru kacha nta.

Iberibe 2

V547 Nkwupụta bụ eziokwu mgbe niile. Eleghị anya a ga-eji onye ọrụ '&&' mee ihe ebe a. diski.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;
  ....
}

O doro anya na ndị ọrụ na-agwakọtakwa ebe a || и &&, ma ọ bụ == и !=: A mgbanwe enweghị ike inwe uru 20 na 9 n'otu oge.

Nṅomi ahịrị na-akparaghị ókè

V512 Oku nke ọrụ 'sprintf' ga-eduga n'oke nke ihe nchekwa 'fullpath'. diski.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);
  ....
}

Mgbe ị na-elele ọrụ ahụ n'ụzọ zuru ezu, ọ ga-edo anya na koodu a anaghị akpata nsogbu. Agbanyeghị, ha nwere ike ibilite n'ọdịniihu: otu mgbanwe na-akpachapụghị anya na anyị ga-enweta oke njupụta - sprint na-ejedebeghị ihe ọ bụla, otú mgbe concatenating ụzọ anyị nwere ike ịgafe ókè nke n'usoro. A na-atụ aro ka ị hụ oku a snprintf (ụzọ zuru oke, PATH_MAX,….).

Ọnọdụ ejighi ya

V560 Akụkụ nke okwu ọnọdụ bụ eziokwu mgbe niile: tinye> 0. scard.c 507

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

nnyocha tinye > 0 ọ dịghị mkpa ebe a: mgbanwe ga-adị ukwuu karịa efu, n'ihi na gụọ% 4 ga-eweghachi nke fọdụrụ nke nkewa, ma ọ gaghị abụ otu 4.

Nkeji

Nkeji - mmejuputa ihe nkesa RDP nwere koodu isi mmalite. E kewara ihe omume ahụ ụzọ abụọ:

  • xrdp - mmejuputa protocol. Ekesara n'okpuru ikike Apache 2.0.
  • xorgxrdp - Ntọala nke ndị ọkwọ ụgbọ ala Xorg maka iji xrdp. Ikikere - X11 (dị ka MIT, mana amachibidoro iji na mgbasa ozi)

Mmepe nke oru ngo a dabere na nsonaazụ rdesktop na FreeRDP. Na mbido, iji eserese eserese rụọ ọrụ, ị ga-eji sava VNC dị iche, ma ọ bụ sava X11 pụrụ iche nwere nkwado RDP - X11rdp, mana na ọbịbịa nke xorgxrdp, mkpa maka ha kwụsịrị.

N'isiokwu a anyị agaghị ekpuchi xorgxrdp.

Ọrụ xrdp, dị ka nke gara aga, dị obere ma nwee ihe dị ka ahịrị 80 puku.

Lelee rdesktop na xrdp site na iji PVS-Studio analyzer

Ụdị typos ndị ọzọ

V525 Koodu ahụ nwere nchịkọta nke ngọngọ ndị yiri ya. Lelee ihe 'r', 'g', 'r' na ahị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++;
      }
      ....
  }
  ....
}

Ewepụtara koodu a n'ọbá akwụkwọ librfxcodec, nke na-emejuputa codec jpeg2000 maka RemoteFX. N'ebe a, o doro anya, a na-agwakọta ọwa data eserese - kama agba "acha anụnụ anụnụ", a na-edekọ "red". O yikarịrị ka njehie a pụtara n'ihi nnomi-paste.

Otu nsogbu ahụ mere na ọrụ yiri ya rfx_encode_format_argb, nke onye nyocha gwakwara anyị:

V525 Koodu ahụ nwere nchịkọta nke ngọngọ ndị yiri ya. Lelee ihe 'a', 'r', 'g', 'r' na ahị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++;
}

Nkwuwapụta n'usoro

V557 Enwere ike imebiga ihe n'usoro. Uru 'i — 8' index nwere ike iru 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];
    ....
  }
  ....
}

Nkwupụta na nkọwa nke nhazi na faịlụ abụọ a adabaghị - nha dị iche site na 1. Otú ọ dị, ọ dịghị njehie ọ bụla na-eme - kpọmkwem nha ziri ezi na faịlụ evdev-map.c, n'ihi ya, ọ dịghị ihe ọ bụla. Yabụ na nke a bụ naanị ahụhụ nwere ike idozi ngwa ngwa.

Ntụnyere ezighi ezi

V560 Akụkụ nke okwu ọnọdụ bụ ụgha mgbe niile: (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))
  {
    ....
  }
  ....
}

Ọrụ na-agụ ụdị mgbanwe edebanye aha dị mkpụmkpụ n'ime mgbanwe dị ka Int. Achọghị ịlele ebe a n'ihi na anyị na-agụ mgbanwe na-edeghị ede ma na-ekenye nsonaazụ ya na nnukwu mgbanwe, ya mere mgbanwe ahụ enweghị ike iwere uru na-adịghị mma.

Nyocha na-enweghị isi

V560 Akụkụ nke okwu ọnọdụ bụ eziokwu mgbe niile: (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;
  }
  ....
}

Ntụle ahaghị nhata enweghị isi ebe a ebe anyị nwere ntụnyere na mbido. O yikarịrị ka nke a bụ typo na onye nrụpụta chọrọ iji onye ọrụ || ikpochapụ arụmụka na-ezighi ezi.

nkwubi

N'oge nyocha ahụ, ọ nweghị nnukwu njehie achọpụtara, mana achọpụtara ọtụtụ adịghị ike. Otú ọ dị, a na-eji usoro ndị a eme ihe n'ọtụtụ usoro, ọ bụ ezie na ọ dị ntakịrị. A obere oru ngo na-adịghị nwere ọtụtụ njehie, n'ihi ya, ị na-ekwesịghị na-ekpe ikpe nke analyzer naanị na obere oru ngo. Ị nwere ike ịgụkwu banyere nke a n'isiokwu "Mmetụta nke ọnụọgụgụ kwadoro".

Ị nwere ike ibudata ụdị nnwale nke PVS-Studio n'aka anyị saịtị.

Lelee rdesktop na xrdp site na iji PVS-Studio analyzer

Ọ bụrụ na ịchọrọ ịkọrọ ndị na-ege ntị na-asụ Bekee akụkọ a, biko jiri njikọ ntụgharị asụsụ: Sergey Larin. Jiri PVS-Studio na-enyocha rdesktop na xrdp

isi: www.habr.com

Tinye a comment