
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 āĻšāĻžāĻāĻžāϰ āϞāĻžāĻāύ āϰāϝāĻŧā§āĻā§āĨ¤ āĻāĻāĻžāύ⧠āĻā§āϞāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāĻāĻāĻĒā§āĻ āϰāϝāĻŧā§āĻā§:

āĻā§āĻĄ āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻā§āĻā§ āύāĻž
āĻ āύā§āĻĒāϞāĻŦā§āϧ āĻā§āĻĄ āϏāύāĻžāĻā§āϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§. āĻāĻāĻž āϏāĻŽā§āĻāĻŦ āϝ⧠āĻāĻāĻāĻŋ āϤā§āϰā§āĻāĻŋ āĻāĻĒāϏā§āĻĨāĻŋāϤ āĻāĻā§. 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);
}āϤā§āϰā§āĻāĻŋāĻāĻŋ āĻĢāĻžāĻāĻļāύ⧠āĻ āĻŦāĻŋāϞāĻŽā§āĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšāϝāĻŧ āĻĒā§āϰāϧāĻžāύ: āĻāĻŽāϰāĻž āĻ āĻĒāĻžāϰā§āĻāϰā§āϰ āĻĒāϰ⧠āĻā§āĻĄāĻāĻŋ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻā§āĻāĻŋ āĻĒā§āϰāϤā§āϝāĻžāĻŦāϰā§āϤāύ â āĻāĻ āĻāĻŖā§āĻĄāĻāĻŋ āĻŽā§āĻŽāϰāĻŋ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻāϰā§āĨ¤ āϝāĻžāĻāĻšā§āĻ, āϤā§āϰā§āĻāĻŋāĻāĻŋ āĻā§āύ āĻšā§āĻŽāĻāĻŋ āϏā§āώā§āĻāĻŋ āĻāϰ⧠āύāĻž: āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻĒā§āϰāϏā§āĻĨāĻžāύ āĻāϰāĻžāϰ āĻĒāϰ⧠āϏāĻŽāϏā§āϤ āĻŦāϰāĻžāĻĻā§āĻĻāĻā§āϤ āĻŽā§āĻŽāϰāĻŋ āĻ āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽ āĻĻā§āĻŦāĻžāϰāĻž āϏāĻžāĻĢ āĻāϰāĻž āĻšāĻŦā§āĨ¤
āĻā§āύ āϤā§āϰā§āĻāĻŋ āĻšā§āϝāĻžāύā§āĻĄāϞāĻŋāĻ
āĻ ā§āϝāĻžāϰ⧠underrun āϏāĻŽā§āĻāĻŦ. '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, āĻāĻāĻŋ āĻĢāĻžāĻāϞā§āϰ āĻļā§āώ āĻšāĻŋāϏāĻžāĻŦā§ āĻŦā§āϝāĻžāĻā§āϝāĻž āĻāϰāĻž āĻšāĻŦā§ (āĻĢāĻžāĻāϞā§āϰ āĻļā§āώā§).
āĻĢāĻžāĻāϞā§āϰ āĻļā§āώ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āϧā§āϰā§āĻŦāĻ, āϏāĻžāϧāĻžāϰāĻŖāϤ -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; // <=
....
}āϏāĻŽā§āĻāĻŦāϤ āĻāĻ āĻā§āĻĄā§āϰ āϞā§āĻāĻ āĻāĻāĻŋ āĻā§āϞ āĻĒā§āϝāĻŧā§āĻā§āύ || и && āĻļāϰā§āϤāϰ āĻŽāϧā§āϝā§. āĻāϏā§āύ āĻŽāĻžāύāĻā§āϞāĻŋāϰ āĻāύā§āϝ āϏāĻŽā§āĻāĻžāĻŦā§āϝ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻŋ āϞāĻŋāĻā§āύ_āϏāĻŽāϝāĻŧ и āĻĒāϰāĻŋāĻŦāϰā§āϤāύ_āϏāĻŽāϝāĻŧ:
- āĻāĻāϝāĻŧ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ 0 āĻāϰ āϏāĻŽāĻžāύ: āĻāĻ āĻā§āώā§āϤā§āϰ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻļāĻžāĻāĻžāϝāĻŧ āĻļā§āώ āĻāϰāĻŦ āĻāϰ: āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻļā§āϞ mod_time āĻĒāϰāĻŦāϰā§āϤ⧠āĻ āĻŦāϏā§āĻĨāĻž āύāĻŋāϰā§āĻŦāĻŋāĻļā§āώ⧠āϏāϰā§āĻŦāĻĻāĻž 0 āĻšāĻŦā§āĨ¤
- āĻāĻāĻāĻŋ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻšāϞ 0: mod_time 0 āĻāϰ āϏāĻŽāĻžāύ āĻšāĻŦā§ (āĻ āύā§āϝ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞā§āϰ āĻāĻāĻāĻŋ āύāύ-āύā§āϤāĻŋāĻŦāĻžāĻāĻ āĻŽāĻžāύ āĻĨāĻžāĻāϞā§), āĻāĻžāϰāĻŖ MIN āĻāϰ āĻĻā§āĻāĻŋ āĻŦāĻŋāĻāϞā§āĻĒā§āϰ āĻŽāϧā§āϝ⧠āĻā§āĻāĻāĻŋ āĻŦā§āĻā§ āύā§āĻŦā§āĨ¤
- āĻāĻāϝāĻŧ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ 0 āĻāϰ āϏāĻŽāĻžāύ āύāϝāĻŧ: āϏāϰā§āĻŦāύāĻŋāĻŽā§āύ āĻŽāĻžāύ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύāĨ¤
āϏāĻā§āĻā§ āĻļāϰā§āϤ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āϝāĻāύ āϞāĻŋāĻā§āύ_āϏāĻŽāϝāĻŧ āĻāĻŦāĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ_āϏāĻŽāϝāĻŧ āĻāĻāϰāĻŖ āϏāĻ āĻŋāĻ āĻĻā§āĻāĻžāĻŦā§:
- āĻāĻ āĻŦāĻž āĻāĻāϝāĻŧ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ 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(fullpath, 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
â āĻāĻĒā§āύ āϏā§āϰā§āϏ āĻā§āĻĄ āϏāĻš āĻāĻāĻāĻŋ RDP āϏāĻžāϰā§āĻāĻžāϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύāĨ¤ āĻĒā§āϰāĻāϞā§āĻĒāĻāĻŋ 2 āĻāĻžāĻā§ āĻŦāĻŋāĻāĻā§āϤ:
- xrdp - āĻĒā§āϰā§āĻā§āĻāϞ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύāĨ¤ Apache 2.0 āϞāĻžāĻāϏā§āύā§āϏā§āϰ āĻ āϧā§āύ⧠āĻŦāĻŋāϤāϰāĻŖ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤
- xorgxrdp - xrdp-āĻāϰ āϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāύā§āϝ Xorg āĻĄā§āϰāĻžāĻāĻāĻžāϰā§āϰ āĻāĻāĻāĻŋ āϏā§āĻāĨ¤ āϞāĻžāĻāϏā§āύā§āϏ - X11 (MIT āĻāϰ āĻŽāϤ, āĻāĻŋāύā§āϤ⧠āĻŦāĻŋāĻā§āĻāĻžāĻĒāύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻŋāώāĻŋāĻĻā§āϧ)
āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻāύā§āύāϝāĻŧāύ rdesktop āĻāĻŦāĻ FreeRDP āĻāϰ āĻĢāϞāĻžāĻĢāϞā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰā§āĨ¤ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻāĻāĻžāĻŦā§, āĻā§āϰāĻžāĻĢāĻŋāĻā§āϏā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāĻā§ āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ VNC āϏāĻžāϰā§āĻāĻžāϰ, āĻŦāĻž RDP āϏāĻŽāϰā§āĻĨāύ āϏāĻš āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āώ X11 āϏāĻžāϰā§āĻāĻžāϰ - X11rdp āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāϝāĻŧā§āĻāĻŋāϞ, āĻāĻŋāύā§āϤ⧠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 āĻĢāĻžāĻāϞ⧠āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§, āϤāĻžāĻ āϏā§āĻŽāĻžāϰ āĻŦāĻžāĻāϰ⧠āύā§āĻāĨ¤ āϤāĻžāĻ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻŦāĻžāĻ āϝāĻž āϏāĻšāĻā§āĻ āĻ āĻŋāĻ āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤
āĻā§āϞ āϤā§āϞāύāĻž
āĻļāϰā§āϤāϏāĻžāĻĒā§āĻā§āώ āĻ āĻāĻŋāĻŦā§āϝāĻā§āϤāĻŋāϰ āĻāĻāĻāĻŋ āĻ āĻāĻļ āϏāϰā§āĻŦāĻĻāĻž āĻŽāĻŋāĻĨā§āϝāĻž: (āĻā§āϝāĻžāĻĒ_āϞā§āύ <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
