Ena ke tlhahlobo ea bobeli letotong la lihlooho tse mabapi le ho hlahloba mananeo a bulehileng bakeng sa ho sebetsa le protocol ea RDP. Ho eona re tla sheba moreki oa rdesktop le seva sa xrdp.
E sebelisoa e le sesebelisoa sa ho khetholla liphoso
Sehlooho sena se fana ka liphoso tseo feela tse neng li bonahala li thahasellisa ho ’na. Leha ho le joalo, merero e nyenyane, kahoo ho ne ho e-na le liphoso tse fokolang :).
mantsoe. Sengoloa se fetileng mabapi le netefatso ea projeke ea FreeRDP se ka fumanoa
rskeng
Moreki enoa o tumme haholo - o sebelisoa ke kamehla ho ReactOS, hape o ka fumana liphetho tsa pele tsa mokha oa boraro bakeng sa eona. Leha ho le joalo, o se a tsofetse haholo: ho lokolloa ha hae ka lekhetlo la pele ho ile ha etsahala ka la 4 April, 2001 - ka nako ea ho ngola, o ne a le lilemo li 17.
Joalokaha ke hlokometse pejana, morero ona o monyenyane haholo. E na le mela e ka bang likete tse 30 tsa khoutu, e leng ntho e makatsang ho latela lilemo tsa eona. Ha ho bapisoa, FreeRDP e na le mela e likete tse 320. Mona ke tlhahiso ea lenaneo la Cloc:
Khoutu e sa fihlelleheng
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);
}
Phoso e kopana le rona hang hang ts'ebetsong ka sehloohong: re bona khoutu e tla ka mor'a opareitara khutlele - sekhechana sena se etsa ho hloekisa mohopolo. Leha ho le joalo, phoso ha e hlahise tšokelo: memori eohle e fanoeng e tla hlakoloa ke sistimi e sebetsang kamora hore lenaneo le tsoe.
Ha ho ts'ebetso ea phoso
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);
}
....
}
K'hasete ea khoutu tabeng ena e baleha ho tloha faeleng ho ea ho buffer ho fihlela faele e fela. Leha ho le joalo, ha ho na phoso ea ho sebetsana le mona: haeba ho na le ntho e sa tsamaeeng hantle, joale bala e tla khutla -1, 'me ka nako eo sehlopha se tla feta Tlhahiso.
Ho sebelisa EOF ka mofuta oa 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++;
}
....
}
Mona re bona ts'ebetso e fosahetseng ea ho fihla qetellong ea faele: haeba fgetc e khutlisetsa motho eo khoutu ea hae e leng 0xFF, e tla hlalosoa e le pheletso ea faele (EOF).
EOF ke ntho e sa fetoheng, hangata e hlalosoang e le -1. Mohlala, ho encoding ea CP1251, lengolo la ho qetela la alfabeta ea Serussia le na le khoutu 0xFF, e tsamaellanang le nomoro -1 haeba re bua ka mofuta o fapaneng. koloi. Hoa etsahala hore letšoao la 0xFF, joalo ka EOF (-1) e hlalosoa e le pheletso ea faele. Ho qoba liphoso tse joalo, phello ea mosebetsi ke fgetc e lokela ho bolokoa ka ho feto-fetoha joaloka eth.
Mefuta
Karolo ea 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; // <=
....
}
Mohlomong mongoli oa khoutu ena o e fositse || и && boemong. A re nahaneng ka mekhoa e ka khonehang bakeng sa litekanyetso ngola_nako и fetola_nako:
- Bobeli ba mefuta-futa ba lekana le 0: tabeng ena re tla qetella re le lekala hape: feto-fetoha mod_time e tla dula e le 0 ho sa natswe maemo a latelang.
- E 'ngoe ea likhetho ke 0: mod_time e tla lekana le 0 (ha feela phapano e 'ngoe e na le boleng bo seng mpe), hobane mets e tla khetha e nyane ho tse peli.
- Liphetoho ka bobeli ha li lekane le 0: khetha bonyane ba boleng.
Ha o nkela boemo sebaka ka write_time && change_time boitšoaro bo tla shebahala bo nepahetse:
- Phapang e le 'ngoe kapa ka bobeli ha e lekane le 0: khetha boleng boo e seng lefela.
- Liphetoho ka bobeli ha li lekane le 0: khetha bonyane ba boleng.
Karolo ea 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;
....
}
Kamoo ho bonahalang kateng, li-operators li kopane le mona || и &&, kapa == и !=: Phapang e ke ke ea ba le boleng ba 20 le 9 ka nako e le 'ngoe.
Ho kopitsa mela e sa lekanyetsoang
RD_NTSTATUS
disk_query_directory(....)
{
....
char *dirname, fullpath[PATH_MAX];
....
/* Get information for directory entry */
sprintf(fullpath, "%s/%s", dirname, pdirent->d_name);
....
}
Ha u sheba mosebetsi ka botlalo, ho tla hlaka hore khoutu ena ha e bake mathata. Leha ho le joalo, li ka 'na tsa hlaha nakong e tlang: phetoho e le' ngoe e sa tsotelleng 'me re tla fumana sekhahla se seholo - lebelo la lebelo ha e felle ka letho, kahoo ha re kopanya litsela re ka fetela ka nģ'ane ho meeli ea sehlopha. E kgothaletswa ho hlokomela pitso ena ka snprintf(fulpath, PATH_MAX, ....).
Boemo bo sa hlokahaleng
static void
inRepos(STREAM in, unsigned int read)
{
SERVER_DWORD add = 4 - read % 4;
if (add < 4 && add > 0)
{
....
}
}
hlahlobeloang eketsa > 0 ha ho hlokahale mona: phapang e tla lula e le kholo ho feta zero, hobane bala % 4 e tla khutlisa karolo e setseng, empa e ke ke ea hlola e lekana le 4.
lreng
- xrdp - ts'ebetsong ea protocol. E ajoa tlas'a laesense ea Apache 2.0.
- xorgxrdp - Sehlopha sa bakhanni ba Xorg bakeng sa tšebeliso le xrdp. License - X11 (joaloka MIT, empa e thibela tšebeliso ea papatso)
Ntlafatso ea morero e ipapisitse le liphetho tsa rdesktop le FreeRDP. Qalong, ho sebetsa ka litšoantšo, o ne o tlameha ho sebelisa seva se arohaneng sa VNC, kapa seva se khethehileng sa X11 se nang le tšehetso ea RDP - X11rdp, empa ka ho fihla ha xorgxrdp, tlhokahalo ea bona e ile ea nyamela.
Sehloohong sena re ke ke ra koahela xorgxrdp.
Morero oa xrdp, joalo ka o fetileng, o nyane haholo mme o na le mela e ka bang likete tse 80.
Litlhahiso tse ling
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++;
}
....
}
....
}
Khoutu ena e nkiloe laebraring ea librfxcodec, e sebelisang jpeg2000 codec bakeng sa RemoteFX. Mona, kamoo ho bonahalang kateng, liteishene tsa data tse hlakileng li kopantsoe - ho e-na le 'mala o "putsoa", "red" e ngotsoe. Phoso ena e kanna ea hlaha ka lebaka la kopi-paste.
Bothata bo ts'oanang bo etsahetse ts'ebetsong e ts'oanang rfx_encode_format_argb, eo mohlahlobi a ileng a re bolella hape:
while (x < 64)
{
*la_buf++ = a;
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r;
x++;
}
Phatlalatso ea 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];
....
}
....
}
Phatlalatso le tlhaloso ea sehlopha sa lifaele tsena tse peli ha li lumellane - boholo bo fapana ka 1. Leha ho le joalo, ha ho na liphoso tse hlahang - boholo bo nepahetseng bo hlalositsoe faeleng ea evdev-map.c, kahoo ha ho na meeli. Kahoo sena ke bothata feela bo ka lokisoang habonolo.
Papiso e fosahetseng
// 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))
{
....
}
....
}
Tshebetso e bala mofuta o fapaneng e sa ngolisoang ka bokhutšoanyane ho fetoha joalo ka eth. Ho hlahloba ha ho hlokahale mona hobane re bala phetoho e sa ngolisoang mme re abela sephetho ho phapang e kholoanyane, kahoo phapang e ke ke ea nka boleng bo fosahetseng.
Licheke tse sa hlokahaleng
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;
}
....
}
Licheke tsa ho se lekane ha li utloahale mona kaha re se re ntse re e-na le papiso qalong. Ho ka etsahala hore sena ke typo mme moqapi o ne a batla ho sebelisa opareitara || ho sefa likhang tse fosahetseng.
fihlela qeto e
Nakong ea tlhahlobo, ha ho liphoso tse tebileng tse ileng tsa fumanoa, empa mefokolo e mengata e ile ea fumanoa. Leha ho le joalo, meralo ena e sebelisoa litsamaisong tse ngata, leha e le tse nyane ka boholo. Morero o monyane ha o hlile o na le liphoso tse ngata, ka hona ha oa lokela ho ahlola ts'ebetso ea mohlahlobi feela mererong e nyane. U ka bala haholoanyane ka sena sehloohong "
U ka khoasolla mofuta oa liteko oa PVS-Studio ho rona
Haeba u batla ho arolelana sengoloa sena le bamameli ba buang Senyesemane, ka kopo sebelisa sehokelo sa phetolelo: Sergey Larin.
Source: www.habr.com