
рдЖрд░рдбреАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреНрдпрд╛ рдЪрд╛рдЪрдгреАрдмрджреНрджрд▓ рд▓реЗрдЦрд╛рдВрдЪреНрдпрд╛ рдорд╛рд▓рд┐рдХреЗрддреАрд▓ рд╣реЗ рджреБрд╕рд░реЗ рдкреБрдирд░рд╛рд╡рд▓реЛрдХрди рдЖрд╣реЗ. рддреНрдпрд╛рдордзреНрдпреЗ рдЖрдкрдг rdesktop рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ xrdp рд╕рд░реНрд╡реНрд╣рд░ рдкрд╛рд╣реВ.
рддреНрд░реБрдЯреА рдУрд│рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдзрди рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ рд╣реЗ C, C++, C# рдЖрдгрд┐ Java рд╕рд╛рдареА рдПрдХ рд╕реНрдЯреЕрдЯрд┐рдХ рдХреЛрдб рдЕреЕрдирд╛рд▓рд╛рдпрдЭрд░ рдЖрд╣реЗ, рдЬреЗ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдорд╡рд░ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ. Windows, Linux ╨╕ macOS.
рд▓реЗрдЦрд╛рдд рдлрдХреНрдд рддреНрдпрд╛ рддреНрд░реБрдЯреА рдЖрд╣реЗрдд рдЬреНрдпрд╛ рдорд▓рд╛ рдордиреЛрд░рдВрдЬрдХ рд╡рд╛рдЯрд▓реНрдпрд╛. рддрдерд╛рдкрд┐, рдкреНрд░рдХрд▓реНрдк рд▓рд╣рд╛рди рдЖрд╣реЗрдд, рдореНрд╣рдгреВрди рдХрд╛рд╣реА рдЪреБрдХрд╛ рд╣реЛрддреНрдпрд╛ :).
рд╢реЗрд░рд╛. рдлреНрд░реАрдЖрд░рдбреАрдкреА рдкреНрд░рдХрд▓реНрдк рдкрдбрддрд╛рд│рдгреАрдмрджреНрджрд▓ рдорд╛рдЧреАрд▓ рд▓реЗрдЦ рдЖрдврд│реВ рд╢рдХрддреЛ .
rdesktop
тАФ рдпреБрдирд┐рдХреНрд╕-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдгрд╛рд▓реАрдВрд╕рд╛рдареА рдЖрд░рдбреАрдкреА рдХреНрд▓рд╛рдпрдВрдЯрдЪреА рдПрдХ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА. рдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рджреЗрдЦреАрд▓ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ: WindowsрдЬрд░ рддреБрдореНрд╣реА Cygwin рдЕрдВрддрд░реНрдЧрдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдб рдХреЗрд▓рд╛ рддрд░. GPLv3 рдЕрдВрддрд░реНрдЧрдд рдкрд░рд╡рд╛рдирд╛рдХреГрдд.
рд╣рд╛ рдХреНрд▓рд╛рдпрдВрдЯ рдЦреВрдк рд▓реЛрдХрдкреНрд░рд┐рдп рдЖрд╣реЗ - рддреЛ ReactOS рдордзреНрдпреЗ рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдЖрдкрдг рддреНрдпрд╛рд╕рд╛рдареА рддреГрддреАрдп-рдкрдХреНрд╖ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдлреНрд░рдВрдЯ-рдПрдВрдб рджреЗрдЦреАрд▓ рд╢реЛрдзреВ рд╢рдХрддрд╛. рддрдерд╛рдкрд┐, рддреЛ рдмрд░рд╛рдЪ рдЬреБрдирд╛ рдЖрд╣реЗ: рддреНрдпрд╛рдЪреЗ рдкрд╣рд┐рд▓реЗ рдкреНрд░рдХрд╛рд╢рди 4 рдПрдкреНрд░рд┐рд▓ 2001 рд░реЛрдЬреА рдЭрд╛рд▓реЗ - рд▓реЗрдЦрдирд╛рдЪреНрдпрд╛ рд╡реЗрд│реА рддреЛ 17 рд╡рд░реНрд╖рд╛рдВрдЪрд╛ рдЖрд╣реЗ.
рдореА рдЖрдзреА рдирдореВрдж рдХреЗрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдкреНрд░рдХрд▓реНрдк рдЦреВрдкрдЪ рд▓рд╣рд╛рди рдЖрд╣реЗ. рдпрд╛рдд рдЕрдВрджрд╛рдЬреЗ 30 рд╣рдЬрд╛рд░ рдУрд│реА рдХреЛрдб рдЖрд╣реЗрдд, рдЬреЗ рд╡рдп рд▓рдХреНрд╖рд╛рдд рдШреЗрддрд╛ рдереЛрдбреЗ рд╡рд┐рдЪрд┐рддреНрд░ рдЖрд╣реЗ. рддреБрд▓рдиреЗрд╕рд╛рдареА, FreeRDP рдордзреНрдпреЗ 320 рд╣рдЬрд╛рд░ рдУрд│реА рдЖрд╣реЗрдд. рдХреНрд▓реЙрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреЗ рдЖрдЙрдЯрдкреБрдЯ рдпреЗрдереЗ рдЖрд╣реЗ:

рдЕрдЧрдореНрдп рдХреЛрдб
рдЕрдиреБрдкрд▓рдмреНрдз рдХреЛрдб рдЖрдврд│рд▓рд╛. рддреНрд░реБрдЯреА рдЙрдкрд╕реНрдерд┐рдд рдЕрд╕рдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдЖрд╣реЗ. 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);
}рдлрдВрдХреНрд╢рдирдордзреНрдпреЗ рддреНрд░реБрдЯреА рд▓рдЧреЗрдЪ рдЖрдврд│рддреЗ рдореБрдЦреНрдп: рдСрдкрд░реЗрдЯрд░рдЪреНрдпрд╛ рдирдВрддрд░ рдпреЗрдгрд╛рд░рд╛ рдХреЛрдб рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рджрд┐рд╕рддреЛ рдкрд░рдд тАФ рд╣рд╛ рддреБрдХрдбрд╛ рдореЗрдорд░реА рдХреНрд▓реАрдирд┐рдВрдЧ рдХрд░рддреЛ. рддрдерд╛рдкрд┐, рддреНрд░реБрдЯреАрдореБрд│реЗ рдзреЛрдХрд╛ рдЙрджреНрднрд╡рдд рдирд╛рд╣реА: рд╕рд░реНрд╡ рд╡рд╛рдЯрдк рдореЗрдорд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреВрди рдмрд╛рд╣реЗрд░ рдкрдбрд▓реНрдпрд╛рдирдВрддрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдорджреНрд╡рд╛рд░реЗ рд╕рд╛рдл рдХреЗрд▓реА рдЬрд╛рдИрд▓.
рдХреЛрдгрддреАрд╣реА рддреНрд░реБрдЯреА рд╣рд╛рддрд╛рд│рдгреА рдирд╛рд╣реА
рдЕреЕрд░реЗ рдЕрдВрдбрд░рд░рди рд╢рдХреНрдп рдЖрд╣реЗ. 'n' рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдЪреЗ рдореВрд▓реНрдп -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);
}
....
}рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдлрд╛рдИрд▓ рд╕рдВрдкреЗрдкрд░реНрдпрдВрдд рдлрд╛рдЗрд▓рдордзреВрди рдмрдлрд░рдордзреНрдпреЗ рд╡рд╛рдЪрддреЛ. рддрдерд╛рдкрд┐, рдпреЗрдереЗ рд╣рд╛рддрд╛рд│рдгреАрдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА рддреНрд░реБрдЯреА рдирд╛рд╣реА: рдЬрд░ рдХрд╛рд╣реА рдЪреВрдХ рдЭрд╛рд▓реА рддрд░ рд╡рд╛рдЪрд╛ -1 рдкрд░рдд рдпреЗрдИрд▓, рдЖрдгрд┐ рдирдВрддрд░ рдЕреЕрд░реЗ рдУрд╡реНрд╣рд░рд░рди рд╣реЛрдИрд▓ рдЖрдЙрдЯрдкреБрдЯ.
рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░рд╛рдд EOF рд╡рд╛рдкрд░рдгреЗ
EOF рдЪреА рддреБрд▓рдирд╛ 'char' рдкреНрд░рдХрд╛рд░рд╛рдЪреНрдпрд╛ рдореВрд▓реНрдпрд╛рд╢реА рдХрд░реВ рдирдпреЗ. '(c = fgetc(fp))' '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++;
}
....
}рдпреЗрдереЗ рдЖрдкрдг рдлрд╛рдЗрд▓рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЪреЗ рдЪреБрдХреАрдЪреЗ рд╣рд╛рддрд╛рд│рдгреА рдкрд╛рд╣рддреЛ: рдЬрд░ fgetc рдПрдХ рд╡рд░реНрдг рдкрд░рдд рдХрд░рддреЛ рдЬреНрдпрд╛рдЪрд╛ рдХреЛрдб 0xFF рдЖрд╣реЗ, рддреЛ рдлрд╛рдЗрд▓рдЪрд╛ рд╢реЗрд╡рдЯ рдореНрд╣рдгреВрди рдЕрд░реНрде рд▓рд╛рд╡рд▓рд╛ рдЬрд╛рдИрд▓ (EOF).
EOF рд╣реЗ рдПрдХ рд╕реНрдерд┐рд░ рдЖрд╣реЗ, рд╕рд╣рд╕рд╛ -1 рдореНрд╣рдгреВрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, CP1251 рдПрдиреНрдХреЛрдбрд┐рдВрдЧрдордзреНрдпреЗ, рд░рд╢рд┐рдпрди рд╡рд░реНрдгрдорд╛рд▓рд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдЕрдХреНрд╖рд░рд╛рдд 0xFF рдХреЛрдб рдЖрд╣реЗ, рдЬреЛ рдХреНрд░рдорд╛рдВрдХ -1 рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ рдЬрд░ рдЖрдкрдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд. рдЪрд╛рд░. рд╣реЗ рдЪрд┐рдиреНрд╣ 0xFF, рдЬрд╕реЗ рдХреА рдмрд╛рд╣реЗрд░ рд╡рд│рддреЗ EOF (-1) рдлрд╛рдИрд▓рдЪрд╛ рд╢реЗрд╡рдЯ рдЕрд╕рд╛ рдЕрд░реНрде рд▓рд╛рд╡рд▓рд╛ рдЬрд╛рддреЛ. рдЕрд╢рд╛ рддреНрд░реБрдЯреА рдЯрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА, рдлрдВрдХреНрд╢рдирдЪрд╛ рдкрд░рд┐рдгрд╛рдо рдЖрд╣реЗ fgetc рд╕рд╛рд░рдЦреНрдпрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ int.
рдЯрд╛рдпрдкреЙрд╕
рддреБрдХрдбрд╛ рез
'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; // <=
....
}рдХрджрд╛рдЪрд┐рдд рдпрд╛ рд╕рдВрд╣рд┐рддреЗрдЪреНрдпрд╛ рд▓реЗрдЦрдХрд╛рд▓рд╛ рддреЗ рдЪреБрдХрд▓реЗ рдЕрд╕реЗрд▓ || ╨╕ && рд╕реНрдерд┐рддреАрдд рдореВрд▓реНрдпрд╛рдВрд╕рд╛рдареА рд╕рдВрднрд╛рд╡реНрдп рдкрд░реНрдпрд╛рдпрд╛рдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдпрд╛ рд▓реЗрдЦрди_рд╡реЗрд│ ╨╕ рдмрджрд▓_рдХрд╛рд│:
- рджреЛрдиреНрд╣реА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ 0 рдЪреНрдпрд╛ рд╕рдорд╛рди рдЖрд╣реЗрдд: рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдЖрдкрдг рдПрдХрд╛ рд╢рд╛рдЦреЗрдд рд╕рдорд╛рдкреНрдд рд╣реЛрдК рдЖрдгрдЦреА: рдЪрд▓ mod_time рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рд╕реНрдерд┐рддреАрдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░реВрди рдиреЗрд╣рдореА 0 рдЕрд╕реЗрд▓.
- рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдкреИрдХреА рдПрдХ 0 рдЖрд╣реЗ: mod_time 0 рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪреЗ рдЕрд╕реЗрд▓ (рдЬрд░ рдЗрддрд░ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдЪреЗ рдореВрд▓реНрдп рдиреЙрди-рдЛрдгрд╛рддреНрдордХ рдЕрд╕реЗрд▓ рддрд░), рдХрд╛рд░рдг рдорд┐рдирд┐рдЯ рджреЛрди рдкрд░реНрдпрд╛рдпрд╛рдВрдкреИрдХреА рд▓рд╣рд╛рди рдкрд░реНрдпрд╛рдп рдирд┐рд╡рдбреЗрд▓.
- рджреЛрдиреНрд╣реА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ 0 рдЪреНрдпрд╛ рд╕рдорд╛рди рдирд╛рд╣реАрдд: рдХрд┐рдорд╛рди рдореВрд▓реНрдп рдирд┐рд╡рдбрд╛.
рд╕рд╣ рдЕрдЯ рдмрджрд▓рддрд╛рдирд╛ write_time && change_time рд╡рд░реНрддрди рдпреЛрдЧреНрдп рджрд┐рд╕реЗрд▓:
- рдПрдХ рдХрд┐рдВрд╡рд╛ рджреЛрдиреНрд╣реА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ 0 рдЪреНрдпрд╛ рд╕рдорд╛рди рдирд╛рд╣реАрдд: рд╢реВрдиреНрдп рдирд╕рд▓реЗрд▓реЗ рдореВрд▓реНрдп рдирд┐рд╡рдбрд╛.
- рджреЛрдиреНрд╣реА рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ 0 рдЪреНрдпрд╛ рд╕рдорд╛рди рдирд╛рд╣реАрдд: рдХрд┐рдорд╛рди рдореВрд▓реНрдп рдирд┐рд╡рдбрд╛.
рддреБрдХрдбрд╛ рез
рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдиреЗрд╣рдореАрдЪ рд╕рддреНрдп рдЕрд╕рддреЗ. рдмрд╣реБрдзрд╛ рдпреЗрдереЗ '&&' рдСрдкрд░реЗрдЯрд░ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рд╡рд╛. 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;
....
}рд╡рд░рд╡рд░ рдкрд╛рд╣рддрд╛ рдпреЗрдереЗрд╣реА рдСрдкрд░реЗрдЯрд░ рдорд┐рд╕рд│рд▓реЗрд▓реЗ рдЖрд╣реЗрдд || ╨╕ &&, рдХрд┐рдВрд╡рд╛ == ╨╕ !=: рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдордзреНрдпреЗ рдПрдХрд╛рдЪ рд╡реЗрд│реА 20 рдЖрдгрд┐ 9 рдореВрд▓реНрдп рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реА.
рдЕрдорд░реНрдпрд╛рджрд┐рдд рдУрд│ рдХреЙрдкреА рдХрд░рдгреЗ
'sprintf' рдлрдВрдХреНрд╢рдирдЪреНрдпрд╛ рдХреЙрд▓рдореБрд│реЗ рдмрдлрд░ 'рдлреБрд▓рдкрд╛рде' рдУрд╡реНрд╣рд░рдлреНрд▓реЛ рд╣реЛрдИрд▓. 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);
....
}рдЬреЗрд╡реНрд╣рд╛ рдЖрдкрдг рдлрдВрдХреНрд╢рди рдкреВрд░реНрдгрддрдГ рдкрд╣рд╛рд▓ рддреЗрд╡реНрд╣рд╛ рд╣реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдИрд▓ рдХреА рдпрд╛ рдХреЛрдбрдореБрд│реЗ рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рдд рдирд╛рд╣реАрдд. рддрдерд╛рдкрд┐, рддреЗ рднрд╡рд┐рд╖реНрдпрд╛рдд рдЙрджреНрднрд╡реВ рд╢рдХрддрд╛рдд: рдПрдХ рдирд┐рд╖реНрдХрд╛рд│рдЬреА рдмрджрд▓ рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдмрдлрд░ рдУрд╡реНрд╣рд░рдлреНрд▓реЛ рдорд┐рд│реЗрд▓ - рдзрд╛рд╡рдгреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рдЧреЛрд╖реНрдЯреАрджреНрд╡рд╛рд░реЗ рдорд░реНрдпрд╛рджрд┐рдд рдирд╛рд╣реА, рддреНрдпрд╛рдореБрд│реЗ рдорд╛рд░реНрдЧ рдЬреЛрдбрддрд╛рдирд╛ рдЖрдкрдг рдЕреЕрд░реЗрдЪреНрдпрд╛ рд╕реАрдорд╛рдВрдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рдЬрд╛рдК рд╢рдХрддреЛ. рдпрд╛ рдХреЙрд▓рд╡рд░ рд▓рдХреНрд╖ рджреЗрдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХреЗрд▓реА рдЬрд╛рддреЗ snprintf(рдлреБрд▓рдкрд╛рде, PATH_MAX, ....).
рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реНрдерд┐рддреА
рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддреАрдЪрд╛ рдПрдХ рднрд╛рдЧ рдиреЗрд╣рдореА рд╕рддреНрдп рдЕрд╕рддреЛ: рдЬреЛрдбрд╛ > 0. scard.c 507
static void
inRepos(STREAM in, unsigned int read)
{
SERVER_DWORD add = 4 - read % 4;
if (add < 4 && add > 0)
{
....
}
}рддрдкрд╛рд╕рдгреА > 0 рдЬреЛрдбрд╛ рдпреЗрдереЗ рдЧрд░рдЬ рдирд╛рд╣реА: рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдиреЗрд╣рдореА рд╢реВрдиреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдореЛрдареЗ рдЕрд╕реЗрд▓, рдХрд╛рд░рдг % 4 рд╡рд╛рдЪрд╛ рд╡рд┐рднрд╛рдЧрд╛рддреАрд▓ рдЙрд░реНрд╡рд░рд┐рдд рднрд╛рдЧ рдкрд░рдд рдХрд░реЗрд▓, рдкрд░рдВрддреБ рддреЗ рдХрдзреАрд╣реА 4 рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪреЗ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА.
xrdp
тАФ рдУрдкрди рд╕реЛрд░реНрд╕ рдХреЛрдбрд╕рд╣ рдЖрд░рдбреАрдкреА рд╕рд░реНрд╡реНрд╣рд░рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА. рдкреНрд░рдХрд▓реНрдк 2 рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реЗрд▓рд╛ рдЖрд╣реЗ:
- xrdp - рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА. Apache 2.0 рдкрд░рд╡рд╛рдиреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рд╡рд┐рддрд░реАрдд рдХреЗрд▓реЗ.
- xorgxrdp - xrdp рд╕рд╣ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА Xorg рдбреНрд░рд╛рдпрд╡реНрд╣рд░реНрд╕рдЪрд╛ рд╕рдВрдЪ. рдкрд░рд╡рд╛рдирд╛ - X11 (MIT рдкреНрд░рдорд╛рдгреЗ, рдкрд░рдВрддреБ рдЬрд╛рд╣рд┐рд░рд╛рддреАрдВрдордзреНрдпреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ)
рдкреНрд░рдХрд▓реНрдкрд╛рдЪрд╛ рд╡рд┐рдХрд╛рд╕ rdesktop рдЖрдгрд┐ FreeRDP рдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдорд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЖрд╣реЗ. рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рддрдВрддреНрд░ VNC рд╕рд░реНрд╡реНрд╣рд░ рдХрд┐рдВрд╡рд╛ RDP рд╕рдкреЛрд░реНрдЯ - X11rdp рд╕рд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ X11 рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░рд╛рд╡рд╛ рд▓рд╛рдЧрд▓рд╛, рдкрд░рдВрддреБ xorgxrdp рдЪреНрдпрд╛ рдЖрдЧрдордирд╛рдиреЗ, рддреНрдпрд╛рдВрдЪреА рдЧрд░рдЬ рдирд╛рд╣реАрд╢реА рдЭрд╛рд▓реА.
рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдореНрд╣реА xorgxrdp рдХрд╡реНрд╣рд░ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА.
xrdp рдкреНрд░рдХрд▓реНрдк, рдорд╛рдЧреАрд▓ рдкреНрд░рдХрд▓реНрдкрд╛рдкреНрд░рдорд╛рдгреЗ, рдЦреВрдкрдЪ рд▓рд╣рд╛рди рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдЕрдВрджрд╛рдЬреЗ 80 рд╣рдЬрд╛рд░ рдУрд│реА рдЖрд╣реЗрдд.

рдЕрдзрд┐рдХ рдЯрд╛рдпрдкреЛ
рдХреЛрдбрдордзреНрдпреЗ рд╕рдорд╛рди рдмреНрд▓реЙрдХреНрд╕рдЪрд╛ рд╕рдВрдЧреНрд░рд╣ рдЖрд╣реЗ. 87, 88, 89 рдордзреАрд▓ рдЖрдпрдЯрдо 'r', 'g', 'r' рддрдкрд╛рд╕рд╛. 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++;
}
....
}
....
}рд╣рд╛ рдХреЛрдб librfxcodec рд▓рд╛рдпрдмреНрд░рд░реАрддреВрди рдШреЗрддрд▓рд╛ рд╣реЛрддрд╛, рдЬреЛ RemoteFX рд╕рд╛рдареА jpeg2000 рдХреЛрдбреЗрдХ рд▓рд╛рдЧреВ рдХрд░рддреЛ. рдпреЗрдереЗ, рд╡рд░рд╡рд░ рдкрд╛рд╣рддрд╛, рдЧреНрд░рд╛рдлрд┐рдХ рдбреЗрдЯрд╛ рдЪреЕрдиреЗрд▓ рдорд┐рд╕рд│рд▓реЗ рдЖрд╣реЗрдд - "рдирд┐рд│реНрдпрд╛" рд░рдВрдЧрд╛рдРрд╡рдЬреА, "рд▓рд╛рд▓" рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓реЗ рдЖрд╣реЗ. рд╣реА рддреНрд░реБрдЯреА рдмрд╣реБрдзрд╛ рдХреЙрдкреА-рдкреЗрд╕реНрдЯрдЪреНрдпрд╛ рдкрд░рд┐рдгрд╛рдореА рджрд┐рд╕реВрди рдЖрд▓реА.
рд╕рдорд╛рди рдлрдВрдХреНрд╢рдирдордзреНрдпреЗ рд╣реАрдЪ рд╕рдорд╕реНрдпрд╛ рдЖрд▓реА rfx_encode_format_argb, рдЬреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдиреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рджреЗрдЦреАрд▓ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ:
рдХреЛрдбрдордзреНрдпреЗ рд╕рдорд╛рди рдмреНрд▓реЙрдХреНрд╕рдЪрд╛ рд╕рдВрдЧреНрд░рд╣ рдЖрд╣реЗ. рдУрд│реА 260, 261, 262, 263 рдордзреНрдпреЗ рдЖрдпрдЯрдо 'a', 'r', 'g', 'r' рддрдкрд╛рд╕рд╛. rfxencode_rgb_to_yuv.c 260
while (x < 64)
{
*la_buf++ = a;
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r;
x++;
}рдЕреЕрд░реЗ рдШреЛрд╖рдгрд╛
рдЕреЕрд░реЗ рдУрд╡реНрд╣рд░рд░рди рд╢рдХреНрдп рдЖрд╣реЗ. 'i тАФ 8' рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдЪреЗ рдореВрд▓реНрдп 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];
....
}
....
}рдпрд╛ рджреЛрди рдлрд╛рдпрд▓реАрдВрдордзреАрд▓ рдЕреЕрд░реЗрдЪреА рдШреЛрд╖рдгрд╛ рдЖрдгрд┐ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╡рд┐рд╕рдВрдЧрдд рдЖрд╣реЗрдд - рдЖрдХрд╛рд░ 1 рдиреЗ рднрд┐рдиреНрди рдЖрд╣реЗ. рддрдерд╛рдкрд┐, рдХреЛрдгрддреНрдпрд╛рд╣реА рддреНрд░реБрдЯреА рдЙрджреНрднрд╡рдд рдирд╛рд╣реАрдд - рдпреЛрдЧреНрдп рдЖрдХрд╛рд░ evdev-map.c рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓рд╛ рдЖрд╣реЗ, рддреНрдпрд╛рдореБрд│реЗ рдорд░реНрдпрд╛рджрд╛ рдмрд╛рд╣реЗрд░ рдирд╛рд╣реА. рддрд░ рд╣рд╛ рдлрдХреНрдд рдПрдХ рдмрдЧ рдЖрд╣реЗ рдЬреЛ рд╕рд╣рдЬрдкрдгреЗ рдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ.
рдЪреБрдХреАрдЪреА рддреБрд▓рдирд╛
рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддреАрдЪрд╛ рдПрдХ рднрд╛рдЧ рдиреЗрд╣рдореА рдЪреБрдХреАрдЪрд╛ рдЕрд╕рддреЛ: (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))
{
....
}
....
}рдлрдВрдХреНрд╢рди рдЯрд╛рдЗрдк рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╡рд╛рдЪрддреЗ рд╕реНрд╡рд╛рдХреНрд╖рд░реАрдХреГрдд рд▓рд╣рд╛рди рд╕рд╛рд░рдЦреНрдпрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рдордзреНрдпреЗ int. рдпреЗрдереЗ рддрдкрд╛рд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА рдХрд╛рд░рдг рдЖрдкрдг рдПрдХ рд╕реНрд╡рд╛рдХреНрд╖рд░реА рди рдХреЗрд▓реЗрд▓реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╡рд╛рдЪрдд рдЖрд╣реЛрдд рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдо рдореЛрдареНрдпрд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓рд▓рд╛ рджреЗрдд рдЖрд╣реЛрдд, рддреНрдпрд╛рдореБрд│реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рдШреЗрдК рд╢рдХрдд рдирд╛рд╣реА.
рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрдкрд╛рд╕рдгреНрдпрд╛
рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддреАрдЪрд╛ рдПрдХ рднрд╛рдЧ рдиреЗрд╣рдореА рд╕рддреНрдп рдЕрд╕рддреЛ: (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;
}
....
}рдпреЗрдереЗ рдЕрд╕рдорд╛рдирддрд╛ рддрдкрд╛рд╕рдгреНрдпрд╛рд▓рд╛ рдХрд╛рд╣реА рдЕрд░реНрде рдирд╛рд╣реА рдХрд╛рд░рдг рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛рдЪ рддреБрд▓рдирд╛ рдЖрд╣реЗ. рд╣реА рдЯрд╛рдпрдкреЛ рдЕрд╕рдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдЖрд╣реЗ рдЖрдгрд┐ рд╡рд┐рдХрд╕рдХрд╛рд▓рд╛ рдСрдкрд░реЗрдЯрд░ рд╡рд╛рдкрд░рд╛рдпрдЪрд╛ рд╣реЛрддрд╛ || рдЕрд╡реИрдз рд╡рд┐рддрд░реНрдХ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.
рдирд┐рд╖реНрдХрд░реНрд╖
рд▓реЗрдЦрд╛рдкрд░реАрдХреНрд╖рдгрд╛рджрд░рдореНрдпрд╛рди, рдЧрдВрднреАрд░ рддреНрд░реБрдЯреА рдЖрдврд│рд▓реНрдпрд╛ рдирд╛рд╣реАрдд, рдкрд░рдВрддреБ рдЕрдиреЗрдХ рддреНрд░реБрдЯреА рдЖрдврд│рд▓реНрдпрд╛. рддрдерд╛рдкрд┐, рдпрд╛ рдбрд┐рдЭрд╛рдИрдиреНрд╕рдЪрд╛ рд╡рд╛рдкрд░ рдЕрдиреЗрдХ рдкреНрд░рдгрд╛рд▓реАрдВрдордзреНрдпреЗ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдЬрд░реА рд╡реНрдпрд╛рдкреНрддреА рд▓рд╣рд╛рди рдЖрд╣реЗ. рдПрдХрд╛ рд▓рд╣рд╛рди рдкреНрд░рдХрд▓реНрдкрд╛рдд рдЕрдиреЗрдХ рддреНрд░реБрдЯреА рдЕрд╕рддрд╛рддрдЪ рдЕрд╕реЗ рдирд╛рд╣реА, рддреНрдпрд╛рдореБрд│реЗ рддреБрдореНрд╣реА рдХреЗрд╡рд│ рдЫреЛрдЯреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╡рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд╛рдЪреНрдпрд╛ рдХрд╛рдордЧрд┐рд░реАрдЪрд╛ рдиреНрдпрд╛рдп рдХрд░реВ рдирдпреЗ. рдЖрдкрдг рд▓реЗрдЦрд╛рдд рдпрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рд╡рд╛рдЪреВ рд╢рдХрддрд╛ "".
рддреБрдореНрд╣реА рдЖрдордЪреНрдпрд╛рдХрдбреВрди PVS-Studio рдЪреА рдЪрд╛рдЪрдгреА рдЖрд╡реГрддреНрддреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рд╢рдХрддрд╛ .
рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╣рд╛ рд▓реЗрдЦ рдЗрдВрдЧреНрд░рдЬреА рднрд╛рд╖рд┐рдХ рдкреНрд░реЗрдХреНрд╖рдХрд╛рдВрд╕рд╣ рд╕рд╛рдорд╛рдпрд┐рдХ рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓, рддрд░ рдХреГрдкрдпрд╛ рднрд╛рд╖рд╛рдВрддрд░ рджреБрд╡рд╛ рд╡рд╛рдкрд░рд╛: рд╕реЗрд░реНрдЧреЗрдИ рд▓реЕрд░рд┐рди.
рд╕реНрддреНрд░реЛрдд: www.habr.com
