
RDP рдкреНрд░реЛрдЯреЛрдХрд▓рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рд▓реЗрдЦрд╣рд░реВрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдорд╛ рдпреЛ рджреЛрд╕реНрд░реЛ рд╕рдореАрдХреНрд╖рд╛ рд╣реЛред рдпрд╕рдорд╛ рд╣рд╛рдореА rdesktop рдХреНрд▓рд╛рдЗрдиреНрдЯ рд░ xrdp рд╕рд░реНрднрд░ рд╣реЗрд░реНрдиреЗрдЫреМрдВред
рддреНрд░реБрдЯрд┐рд╣рд░реВ рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрди рдЙрдкрдХрд░рдгрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рдпреЛ рдкреНрд▓реЗрдЯрдлрд░реНрдорд╣рд░реВрдорд╛ рдЙрдкрд▓рдмреНрдз C, C++, C# рд░ Java рдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрдерд┐рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реЛред Windows, Linux ╨╕ macOS.
рд▓реЗрдЦрд▓реЗ рддреА рддреНрд░реБрдЯрд┐рд╣рд░реВ рдорд╛рддреНрд░ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрджрдЫ рдЬреБрди рдорд▓рд╛рдИ рд░реЛрдЪрдХ рд▓рд╛рдЧреНрдереНрдпреЛред рдпрджреНрдпрдкрд┐, рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рд╕рд╛рдирд╛ рдЫрдиреН, рддреНрдпрд╕реИрд▓реЗ рддреНрдпрд╣рд╛рдБ рдХреЗрд╣реА рдЧрд▓реНрддреАрд╣рд░реВ рдерд┐рдП :)ред
рднрдиреНрдиреБред FreeRDP рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдмрд╛рд░реЗ рдЕрдШрд┐рд▓реНрд▓реЛ рд▓реЗрдЦ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ .
rdesktop
тАФ ╤Б╨▓╨╛╨▒╨╛╨┤╨╜╨░╤П ╤А╨╡╨░╨╗╨╕╨╖╨░╤Ж╨╕╤П ╨║╨╗╨╕╨╡╨╜╤В╨░ RDP ╨┤╨╗╤П UNIX-based ╤Б╨╕╤Б╤В╨╡╨╝. ╨Х╨│╨╛ ╤В╨░╨║╨╢╨╡ ╨╝╨╛╨╢╨╜╨╛ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╤М ╨╕ ╨┐╨╛╨┤ Windows, ╨╡╤Б╨╗╨╕ ╤Б╨╛╨▒╨╕╤А╨░╤В╤М ╨┐╤А╨╛╨╡╨║╤В ╨┐╨╛╨┤ Cygwin. ╨Ы╨╕╤Ж╨╡╨╜╨╖╨╕╤А╨╛╨▓╨░╨╜ ╨┐╨╛╨┤ GPLv3.
рдпреЛ рдХреНрд▓рд╛рдЗрдиреНрдЯ рдзреЗрд░реИ рд▓реЛрдХрдкреНрд░рд┐рдп рдЫ - рдпреЛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ ReactOS рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рд░ рддрдкрд╛рдЗрдБ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рддреЗрд╕реНрд░реЛ-рдкрдХреНрд╖ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдлреНрд░рдиреНрдЯ-рдПрдиреНрдбрд╣рд░реВ рдкрдирд┐ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпрджреНрдпрдкрд┐, рдЙрд╣рд╛рдБ рдзреЗрд░реИ рдкреБрд░рд╛рдиреЛ рд╣реБрдиреБрд╣реБрдиреНрдЫ: рдЙрдирдХреЛ рдкрд╣рд┐рд▓реЛ рд░рд┐рд▓реАрдЬ рдЕрдкреНрд░рд┐рд▓ 4, 2001 рдорд╛ рднрдПрдХреЛ рдерд┐рдпреЛ - рд▓реЗрдЦрдирдХреЛ рд╕рдордпрдорд╛, рдЙрд╣рд╛рдБ 17 рд╡рд░реНрд╖рдХреЛ рд╣реБрдиреБрд╣реБрдиреНрдЫред
рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░реЗрдЭреИрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдзреЗрд░реИ рд╕рд╛рдиреЛ рдЫред рдпрд╕рд▓реЗ рдХреЛрдбрдХреЛ рд▓рдЧрднрдЧ 30 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдирд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ, рдЬреБрди рдпрд╕рдХреЛ рдЙрдореЗрд░рд▓рд╛рдИ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрджрд╛ рдЕрд▓рд┐ рдЕрдиреМрдареЛ рдЫред рддреБрд▓рдирд╛рдХреЛ рд▓рд╛рдЧрд┐, FreeRDP рдорд╛ 320 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдирд╣рд░реВ рдЫрдиреНред рдпрд╣рд╛рдБ Cloc рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдЫ:

рдкрд╣реБрдБрдЪрдпреЛрдЧреНрдп рдХреЛрдб
рдЕрдиреБрдкрд▓рдмреНрдз рдХреЛрдб рдкрддреНрддрд╛ рд▓рд╛рдЧреНрдпреЛред рдпреЛ рд╕рдореНрднрд╡ рдЫ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрдкрд╕реНрдерд┐рдд рдЫред 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, рд░ рддреНрдпрд╕рдкрдЫрд┐ array рдУрднрд░рд░рди рд╣реБрдиреЗрдЫ рдЙрддреНрдкрд╛рджрди.
рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░рдорд╛ 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 рд╣реЛ, рдпрд╕рд▓рд╛рдИ рдлрд╛рдЗрд▓рдХреЛ рдЕрдиреНрддреНрдпрдХреЛ рд░реВрдкрдорд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░рд┐рдиреЗрдЫ (рдИрдУрдПрдл).
рдИрдУрдПрдл рдпреЛ рдПрдХ рд╕реНрдерд┐рд░ рдЫ, рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ -1 рдХреЛ рд░реВрдкрдорд╛ рдкрд░рд┐рднрд╛рд╖рд┐рддред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, CP1251 рдПрдиреНрдХреЛрдбрд┐рдЩрдорд╛, рд░реВрд╕реА рд╡рд░реНрдгрдорд╛рд▓рд╛рдХреЛ рдЕрдиреНрддрд┐рдо рдЕрдХреНрд╖рд░рдорд╛ рдХреЛрдб 0xFF рдЫ, рдЬреБрди рдирдореНрдмрд░ -1 рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫ рдпрджрд┐ рд╣рд╛рдореА рдЪрд░рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрджреИрдЫреМрдВ рднрдиреЗ рдЕрдХреНрд╖рд░ред рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ рдкреНрд░рддреАрдХ 0xFF, рдЬрд╕реНрддреИ рдИрдУрдПрдл (-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; // <=
....
}рд╕рд╛рдпрдж рдпрд╕ рдХреЛрдбрдХреЛ рд▓реЗрдЦрдХрд▓реЗ рдпреЛ рдЧрд▓рдд рдкрд╛рдЙрдиреБрднрдпреЛ || ╨╕ && рдЕрд╡рд╕реНрдерд╛рдорд╛ред рдорд╛рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдореНрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░реМрдВ рд▓реЗрдЦрди_рд╕рдордп ╨╕ рдкрд░рд┐рд╡рд░реНрддрди_рд╕рдордп:
- рджреБрдмреИ рдЪрд░рд╣рд░реВ реж рдмрд░рд╛рдмрд░ рдЫрдиреН: рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореА рдПрдЙрдЯрд╛ рд╢рд╛рдЦрд╛рдорд╛ рд╕рдорд╛рдкреНрдд рд╣реБрдиреЗрдЫреМрдВ рдЕрд░реВ: рдЪрд░ рдореЛрдб_рд╕рдордп рдкрдЫрд┐рдХреЛ рдЕрд╡рд╕реНрдерд╛рд▓рд╛рдИ рдзреНрдпрд╛рди рдирджрд┐рдИ рд╕рдзреИрдВ реж рд╣реБрдиреЗрдЫред
- рдЪрд░ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ реж рд╣реЛ: рдореЛрдб_рд╕рдордп реж рдмрд░рд╛рдмрд░ рд╣реБрдиреЗрдЫ (рдЕрд░реНрдХреЛ рдЪрд░рдХреЛ рдЧреИрд░-рдЛрдгрд╛рддреНрдордХ рдорд╛рди рдЫ рднрдиреЗ), рдХрд┐рдирднрдиреЗ MIN рджреБрдИ рд╡рд┐рдХрд▓реНрдк рдордзреНрдпреЗ рд╕рд╛рдиреЛ рдЫрдиреЛрдЯ рдЧрд░реНрдиреЗрдЫред
- рджреБрдмреИ рдЪрд░рд╣рд░реВ реж рдмрд░рд╛рдмрд░ рдЫреИрдирдиреН: рдиреНрдпреВрдирддрдо рдорд╛рди рдЫрд╛рдиреНрдиреБрд╣реЛрд╕реНред
рд╕рд░реНрдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджрд╛ рд▓реЗрдЦрди_рд╕рдордп рд░ рдкрд░рд┐рд╡рд░реНрддрди_рд╕рдордп рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд╣реА рджреЗрдЦрд┐рдиреЗрдЫ:
- рдПрдХ рд╡рд╛ рджреБрдмреИ рдЪрд░рд╣рд░реВ реж рдХреЛ рдмрд░рд╛рдмрд░ рдЫреИрдирдиреН: рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдЫрдиреМрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
- рджреБрдмреИ рдЪрд░рд╣рд░реВ реж рдмрд░рд╛рдмрд░ рдЫреИрдирдиреН: рдиреНрдпреВрдирддрдо рдорд╛рди рдЫрд╛рдиреНрдиреБрд╣реЛрд╕реНред
рдЯреБрдХреНрд░рд╛ рез
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдзреИрдВ рд╕рддреНрдп рд╣реЛред рд╕рдореНрднрд╡рддрдГ '&&' рдЕрдкрд░реЗрдЯрд░ рдпрд╣рд╛рдБ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреБ рдкрд░реНрдЫред 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)
{
....
}
}рдирд┐рд░реАрдХреНрд╖рдг рдердкреНрдиреБрд╣реЛрд╕реН > реж рдпрд╣рд╛рдБ рдХреБрдиреИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЫреИрди: рдЪрд░ рд╕рдзреИрдВ рд╢реВрдиреНрдп рднрдиреНрджрд╛ рдареВрд▓реЛ рд╣реБрдиреЗрдЫ, рдХрд┐рдирднрдиреЗ % 4 рдкрдвреНрдиреБрд╣реЛрд╕реН рд╡рд┐рднрд╛рдЬрдирдХреЛ рдмрд╛рдБрдХреА рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗрдЫ, рддрд░ рдпреЛ 4 рдХреЛ рдмрд░рд╛рдмрд░ рд╣реБрдиреЗрдЫреИрдиред
xrdp
- рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдХреЛрдбрдХреЛ рд╕рд╛рде RDP рд╕рд░реНрднрд░рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдкрд░рд┐рдпреЛрдЬрдирд╛ 2 рднрд╛рдЧрдорд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдЫ:
- xrdp - рдкреНрд░реЛрдЯреЛрдХрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред Apache 2.0 рд▓рд╛рдЗрд╕реЗрдиреНрд╕ рдЕрдиреНрддрд░реНрдЧрдд рд╡рд┐рддрд░рд┐рддред
- xorgxrdp - xrdp рд╕рдБрдЧ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ Xorg рдбреНрд░рд╛рдЗрднрд░рд╣рд░реВрдХреЛ рд╕реЗрдЯред рдЗрдЬрд╛рдЬрддрдкрддреНрд░ - X11 (рдЬрд╕реНрддреИ MIT, рддрд░ рд╡рд┐рдЬреНрдЮрд╛рдкрдирдорд╛ рдкреНрд░рдпреЛрдЧ рдирд┐рд╖реЗрдзрд┐рдд рдЧрд░реНрджрдЫ)
рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд╡рд┐рдХрд╛рд╕ rdesktop рд░ FreeRDP рдХреЛ рдкрд░рд┐рдгрд╛рдорд╣рд░реВрдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЫред рд╕реБрд░реБрдорд╛, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рдВрдЧ рдХрд╛рдо рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА, рддрдкрд╛рдИрд▓реЗ рдЫреБрдЯреНрдЯреИ VNC рд╕рд░реНрднрд░, рд╡рд╛ RDP рд╕рдорд░реНрдерди - X11rdp рдХреЛ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ X11 рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрдкрд░реНрдереНрдпреЛ, рддрд░ xorgxrdp рдХреЛ рдЖрдЧрдорди рд╕рдВрдЧ, рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЧрд╛рдпрдм рднрдпреЛред
рдпрд╕ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореА xorgxrdp рд▓рд╛рдИ рдХрднрд░ рдЧрд░реНрджреИрдиреМрдВред
xrdp рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЕрдШрд┐рд▓реНрд▓реЛ рдЬрд╕реНрддреИ, рдзреЗрд░реИ рд╕рд╛рдиреЛ рдЫ рд░ рд▓рдЧрднрдЧ 80 рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдирд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред

рдердк рдЯрд╛рдИрдкрд╣рд░реВ
рдХреЛрдбрд▓реЗ рд╕рдорд╛рди рдмреНрд▓рдХрд╣рд░реВрдХреЛ рд╕рдВрдЧреНрд░рд╣ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рд╡рд╕реНрддреБрд╣рд░реВ 'r', 'g', '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++;
}
....
}
....
}рдпреЛ рдХреЛрдб librfxcodec рдкреБрд╕реНрддрдХрд╛рд▓рдпрдмрд╛рдЯ рд▓рд┐рдЗрдПрдХреЛ рд╣реЛ, рдЬрд╕рд▓реЗ RemoteFX рдХреЛ рд▓рд╛рдЧрд┐ jpeg2000 рдХреЛрдбреЗрдХ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рдпрд╣рд╛рдБ, рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдЧреНрд░рд╛рдлрд┐рдХ рдбреЗрдЯрд╛ рдЪреНрдпрд╛рдирд▓рд╣рд░реВ рдорд┐рд╢реНрд░рд┐рдд рдЫрдиреН - "рдиреАрд▓реЛ" рд░рдЩрдХреЛ рд╕рдЯреНрдЯрд╛, "рд░рд╛рддреЛ" рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХреЛ рдЫред рдпреЛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдп: рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЯрд╛рдБрд╕реНрдиреЗ рдкрд░рд┐рдгрд╛рдордХреЛ рд░реВрдкрдорд╛ рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛред
рдПрдЙрдЯреИ рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рдЙрд╕реНрддреИ рд╕рдорд╕реНрдпрд╛ рднрдпреЛ rfx_encode_format_argb, рдЬреБрди рд╡рд┐рд╢реНрд▓реЗрд╖рдХрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рднрдиреЗ:
рдХреЛрдбрд▓реЗ рд╕рдорд╛рди рдмреНрд▓рдХрд╣рд░реВрдХреЛ рд╕рдВрдЧреНрд░рд╣ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рд╡рд╕реНрддреБрд╣рд░реВ 'a', 'r', 'g', '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++;
}рдПрд░реЗ рдШреЛрд╖рдгрд╛
рдПрд░реЗ рдУрднрд░рд░рди рд╕рдореНрднрд╡ рдЫред '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];
....
}
....
}рдпреА рджреБрдИ рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ array рдХреЛ рдШреЛрд╖рдгрд╛ рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрд╕рдВрдЧрдд рдЫрдиреН - рдЖрдХрд╛рд░ 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
