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
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
tusilima
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:
Code e le mafai ona aapa atu
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
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
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
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
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
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
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'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.
Tele fa'aoga sese
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:
while (x < 64)
{
*la_buf++ = a;
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r;
x++;
}
Ta'utinoga 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];
....
}
....
}
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
// 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
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 "
E mafai ona e siiina mai se faʻataʻitaʻiga o le PVS-Studio mai ia i matou
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.
puna: www.habr.com