ʻ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
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
kaluhiokalani
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:
Code hiki ʻole ke kiʻi ʻia
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
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
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
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
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
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
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 - 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.
ʻO nā kuhi hewa hou aku
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:
while (x < 64)
{
*la_buf++ = a;
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r;
x++;
}
Hōʻike Array
// 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
// 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
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 "
Hiki iā ʻoe ke hoʻoiho i kahi mana hoʻāʻo o PVS-Studio mai iā mākou
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.
Source: www.habr.com