
เบเบตเปเปเบกเปเบเบเบฒเบเบเบปเบเบเบงเบเบเบทเบเบเบตเบชเบญเบเปเบเบเบธเบเบเบญเบเบเบปเบเบเบงเบฒเบกเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเบปเบเบชเบญเบเปเบเบเบเบฒเบ open source เบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบ RDP protocol. เปเบเบกเบฑเบเบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบดเปเบเบฅเบนเบเบเปเบฒ rdesktop เปเบฅเบฐเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบ xrdp.
เปเบเปเปเบเบฑเบเปเบเบทเปเบญเบเบกเบทเปเบเบทเปเบญเบเปเบฒเบเบปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ เบกเบฑเบเปเบเบฑเบเปเบเบฃเปเบเบฃเบกเบงเบดเปเบเบฒเบฐเบฅเบฐเบซเบฑเบเปเบเบเบเบปเบเบเบตเปเบชเบณเบฅเบฑเบ C, C++, C# เปเบฅเบฐ Java, เบเบตเปเบกเบตเบขเบนเปเปเบเปเบเบฅเบเบเบญเบกเบเปเบฒเบเป. Windows, Linux ะธ macOS.
เบเบปเบเบเบงเบฒเบกเบชเบฐเปเบซเบเบตเบเบฝเบเปเบเปเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเปเบเบดเปเบเบเบทเบงเปเบฒเบซเบเปเบฒเบชเบปเบเปเบเบเบฑเบเบเปเบญเบ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเบเบเบฒเบเปเบกเปเบเบกเบตเบเบฐเบซเบเบฒเบเบเปเบญเบ, เบเบฑเปเบเบเบฑเปเบเบกเบตเบเบงเบฒเบกเบเบดเบเบเบฒเบเบซเบเปเบญเบ :).
ะัะธะผะตัะฐะฝะธะต. เบเบปเบเบเบงเบฒเบกเบเบตเปเบเปเบฒเบเบกเบฒเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเบงเบเบชเบญเบเปเบเบเบเบฒเบ FreeRDP เบชเบฒเบกเบฒเบเบเบปเบเปเบเป .
เบเบญเบกเบเบดเบงเปเบเบตเบเบฑเปเบเปเบเบฐ
โ ัะฒะพะฑะพะดะฝะฐั ัะตะฐะปะธะทะฐัะธั ะบะปะธะตะฝัะฐ 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);
}เบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบปเบเบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเบตเปเบเบซเบเปเบฒเบเบตเป เบเบปเปเบเบเป: เบเบงเบเปเบฎเบปเบฒเปเบซเบฑเบเบฅเบฐเบซเบฑเบเบกเบฒเบซเบผเบฑเบเบเบฒเบเบเบปเบงเบเบฐเบเบดเบเบฑเบเบเบฒเบ เบเบฒเบเบเบฑเบเบเบทเบเบกเบฒ โ เบเบดเปเบเบเบตเปเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเปเบฒเบเบงเบฒเบกเบชเบฐเบญเบฒเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเบงเบฒเบกเบเบดเบเบเบฒเบเบเปเปเปเบเปเปเบฎเบฑเบเปเบซเปเปเบเบตเบเปเบเบเบปเปเบกเบเบนเป: เบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบตเปเบเบฑเบเบชเบฑเบเบเบฑเบเบซเบกเบปเบเบเบฐเบเบทเบเบฅเบถเบเบฅเปเบฒเบเปเบเบเบฅเบฐเบเบปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบซเบผเบฑเบเบเบฒเบเปเบเบเบเบฒเบเบญเบญเบ.
เบเปเปโเบกเบตโเบเบฒเบโเบเบฑเบโเบเบฒเบโเบเบงเบฒเบกโเบเบดเบโเบเบฒเบโ
Array 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);
}
....
}เบเปเปเบกเบนเบเบซเบเปเปเบเบญเบเบฅเบฐเบซเบฑเบเปเบเบเปเบฅเบฐเบเบตเบเบตเปเบญเปเบฒเบเบเบฒเบเปเบเบฅเปเปเบเบปเปเบฒเปเบเปเบ buffer เบเบปเบเบเปเบงเบฒเปเบเบฅเปเบชเบดเปเบเบชเบธเบเบฅเบปเบ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเปเปเบกเบตเบเบงเบฒเบกเบเบดเบเบเบฒเบเปเบเบเบฒเบเบเบฑเบเบเบฒเบเบเบตเป: เบเปเบฒเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบดเบเบเบฒเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ เบญเปเบฒเบ เบเบฐเบเบฑเบเบเบทเบ -1, เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ array เบเบฐเบเบทเบ overrun output.
เบเบฒเบเบเปเบฒเปเบเป EOF เปเบเบเบฐเปเบเบ char
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 เบเปเบฒเบเบงเบเปเบฎเบปเบฒเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบเบปเบงเปเบเปเบเบฑเปเบ: char. เบกเบฑเบ turns เปเบซเปโเปเบซเบฑเบโเบงเปเบฒโเบชเบฑเบโเบเบฒโเบฅเบฑเบ 0xFFโ, เบเบทโ EOF (-1) เบเบทเบเบเบตเบเบงเบฒเบกเปเบฒเบเปเบเบฑเบเบเบธเบเบชเบดเปเบเบชเบธเบเบเบญเบเปเบญเบเบฐเบชเบฒเบ. เปเบเบทเปเบญเบซเบผเบตเบเปเบงเบฑเปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบง, เบเบปเบเปเบเปเบฎเบฑเบเบเบญเบเบซเบเปเบฒเบเบตเปเปเบกเปเบ fgetc เบเบงเบเบเบทเบเปเบเบฑเบเปเบงเปเปเบเบเบปเบงเปเบเปเบเบฑเปเบ int.
เบเบดเบกเบเบดเบ
เบเบดเปเบ 1
เบเบฒเบเบชเบฐเปเบเบเบญเบญเบ '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; // <=
....
}เบเบฒเบเบเบตเบเบนเปเบเบฝเบเบฅเบฐเบซเบฑเบเบเบตเปเปเบเบปเปเบฒเปเบเบเบดเบ || ะธ && เบขเบนเปเปเบเบชเบฐเบเบฒเบ. เปเบซเปเบเบดเบเบฒเบฅเบฐเบเบฒเบเบฒเบเปเบฅเบทเบญเบเบเบตเปเปเบเบฑเบเปเบเปเบเปเบชเปเบฒเบฅเบฑเบเบเปเบฒ write_time ะธ change_time:
- เบเบปเบงเปเบเบเบฑเบเบชเบญเบเปเบเบปเปเบฒเบเบฑเบ 0: เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบชเบดเปเบเบชเบธเบเปเบเบชเบฒเบเบฒ เบญเบทเปเบ: เบเบปเบงเปเบ mod_time เบเบฐเปเบเบฑเบ 0 เบชเบฐเปเปเบตเปเบเบเบเปเปเบเปเบฒเบเบถเบเปเบเบดเบเบชเบฐเบเบฒเบเบเปเปเปเบ.
- เบซเบเบถเปเบเปเบเบเบปเบงเปเบเปเบกเปเบ 0: mod_time เบเบฐเปเบเบปเปเบฒเบเบฑเบ 0 (เปเบซเปเบงเปเบฒเบเบปเบงเปเบเบญเบทเปเบเบกเบตเบเปเบฒเบเบตเปเบเปเปเปเบกเปเบเบฅเบปเบ), เปเบเบฒเบฐเบงเปเบฒ MIN เบเบฐเปเบฅเบทเบญเบเปเบญเบปเบฒเบเปเบญเบเบเบงเปเบฒเบเบญเบเบชเบญเบเบเบฒเบเปเบฅเบทเบญเบ.
- เบเบฑเบเบชเบญเบเบเบปเบงเปเบเบเปเปเปเบเบปเปเบฒเบเบฑเบ 0: เปเบฅเบทเบญเบเบเปเบฒเบเปเปเบฒเบชเบธเบ.
เปเบกเบทเปเบญเบเปเบฝเบเปเบเบทเปเบญเบเปเบเบเปเบงเบ write_time && change_time เบเบถเบเบเบดเบเปเบฒเบเบฐเปเบเบดเปเบเบเบทเบเบเปเบญเบ:
- เบเบปเบงเปเบเปเบถเปเบ เบซเบผเบท เบเบฑเบเบชเบญเบเบเปเปเปเบเบปเปเบฒเบเบฑเบ 0: เปเบฅเบทเบญเบเบเปเบฒเบเบตเปเบเปเปเปเบกเปเบเบชเบนเบ.
- เบเบฑเบเบชเบญเบเบเบปเบงเปเบเบเปเปเปเบเบปเปเบฒเบเบฑเบ 0: เปเบฅเบทเบญเบเบเปเบฒเบเปเปเบฒเบชเบธเบ.
เบเบดเปเบ 2
เบเบฒเบเบชเบฐเปเบเบเบญเบญเบเปเบกเปเบเบเบงเบฒเบกเบเบดเบเบชเบฐ เปเปเบต เปเบ. เบญเบฒเบเบเบฐเปเบเปเบเบปเบงเบเบฐเบเบดเบเบฑเบเบเบฒเบ '&&' เบขเบนเปเบเบตเปเบเบตเป. 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' เบเบฐเบเปเบฒเปเบเบชเบนเปเบเบฒเบเบฅเบปเปเบเบเบญเบ buffer 'fullpath'. 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);
....
}เปเบกเบทเปเบญเบเปเบฒเบเปเบเบดเปเบเบซเบเปเบฒเบเบตเปเบขเปเบฒเบเปเบเบฑเบกเบเบตเป, เบกเบฑเบเบเบฐเบเบฒเบเปเบเบฑเบเบเบตเปเบเบฑเบเปเบเบเบงเปเบฒเบฅเบฐเบซเบฑเบเบเบตเปเบเปเปเปเบฎเบฑเบเปเบซเปเปเบเบตเบเบเบฑเบเบซเบฒ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเบญเบฒเบเบเบฐเปเบเบตเบเบเบถเปเบเปเบเบญเบฐเบเบฒเบเบปเบ: เบเบฒเบเบเปเบฝเบเปเบเบเบเบตเปเบเปเปเบชเบปเบเปเบเบซเบเบถเปเบเปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเปเบฎเบฑเบเบเบฒเบ overflow buffer - เปเบฅเปเบ เบเปเปเปเบเปเบเบทเบเบเปเบฒเบเบฑเบเปเบเบเบชเบดเปเบเปเบ, เบเบฑเปเบเบเบฑเปเบเปเบเปเบงเบฅเบฒเบเบตเป concatenating เปเบชเบฑเปเบเบเบฒเบเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบเปเบเบตเบเบเบญเบเปเบเบเบเบญเบ array เปเบเป. เบกเบฑเบเปเบเบฐเบเปเบฒเปเบซเปเบชเบฑเบเปเบเบเปเบซเบฑเบเบเบฒเบเปเบเบเบตเปเบขเบนเปเปเบ snprintf(fullpath, PATH_MAX,โฆ.).
เบชเบฐเบเบฒเบเบเปเบณเบเปเบญเบ
เบชเปเบงเบเบซเบเบถเปเบเบเบญเบเบเบฒเบเบชเบฐเปเบเบเบญเบญเบเบเบตเปเบกเบตเปเบเบทเปเบญเบเปเบเปเบกเปเบเบเบงเบฒเบกเบเบดเบเบชเบฐเปเบซเบกเบต: add > 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 - เบเบธเบเบเบญเบเปเบเปเบงเบต Xorg เบชเปเบฒเบฅเบฑเบเปเบเปเบเบฑเบ xrdp. เปเบเบญเบฐเบเบธเบเบฒเบ - X11 (เบเบทเบเบฑเบ MIT, เปเบเปเบซเปเบฒเบกเปเบเปเปเบเบเบฒเบเปเบเบชเบฐเบเบฒ)
เบเบฒเบเบเบฑเบเบเบฐเบเบฒเปเบเบเบเบฒเบเปเบกเปเบเบญเบตเบเปเบชเปเบเบปเบเปเบเปเบฎเบฑเบเบเบญเบ rdesktop เปเบฅเบฐ FreeRDP. เปเบเปเบเบทเปเบญเบเบเบปเปเบ, เปเบเบทเปเบญเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบฎเบนเบเบเบฒเบ, เบเปเบฒเบเบเปเบญเบเปเบเปเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบ VNC เปเบเบเบเปเบฒเบเบซเบฒเบ, เบซเบผเบทเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบ X11 เบเบดเปเบชเบเบเบตเปเบกเบตเบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบ RDP - X11rdp, เปเบเปเบเบฑเบเบเบฒเบเบกเบฒเปเบเบดเบเบเบญเบ 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, เปเบเบดเปเบเบเบฐเบเบดเบเบฑเบเบเบปเบงเปเบเบเบชเบฑเบเบเบฒเบ jpeg2000 เบชเปเบฒเบฅเบฑเบ RemoteFX. เบเบตเปเบเบตเป, เบเบฒเบเบปเบเบเบทเปเบ, เบเปเบญเบเบเบฒเบเบเปเปเบกเบนเบเบเบฒเบเบดเบเปเบกเปเบเบเบฐเบชเบปเบก - เปเบเบเบเบตเปเบเบฐเปเบเบฑเบเบชเบต "เบชเบตเบเปเบฒ", "เบชเบตเปเบเบ" เบเบทเบเบเบฑเบเบเบถเบเปเบงเป. เบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเบญเบฒเบเบเบฐเบเบฒเบเบปเบเปเบเบฑเบเบเบปเบเบกเบฒเบเบฒเบเบเบฒเบเบชเบณเปเบเบปเบฒ-เบงเบฒเบ.
เบเบฑเบเบซเบฒเบเบฝเบงเบเบฑเบเปเบเบตเบเบเบถเปเบเปเบเบซเบเปเบฒเบเบตเปเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบ 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++;
}เบเบฐเบเบฒเบ Array
เบเบฒเบ overrun Array เปเบกเปเบเปเบเบฑเบเปเบเปเบเป. เบเปเบฒเบเบญเบเบเบฑเบเบเบฐเบเบต '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, เบเบฑเปเบเบเบฑเปเบเบเปเปเบกเบตเบเบญเบเปเบเบ. เบเบฑเปเบเบเบฑเปเบ, เบเบตเปเปเบกเปเบเบเบฝเบเปเบเป bug เบเบตเปเบชเบฒเบกเบฒเบเปเบเปเปเบเปเบเปเบขเปเบฒเบเบเปเบฒเบเบเบฒเบ.
เบเบฒเบเบเบฝเบเบเบฝเบเบเปเปเบเบทเบเบเปเบญเบ
เบชเปเบงเบเบซเบเบถเปเบเบเบญเบเบเบฒเบเบชเบฐเปเบเบเบญเบญเบเบเบตเปเบกเบตเปเบเบทเปเบญเบเปเบเปเบกเปเบเบเปเปเบเบทเบเบเปเบญเบเบชเบฐเปเบซเบกเบต: (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 เบเบฒเบเบเบงเบเปเบฎเบปเบฒ .
เบเปเบฒเบเปเบฒเบเบเปเบญเบเบเบฒเบเปเบเปเบเบเบฑเบเบเบปเบเบเบงเบฒเบกเบเบตเปเบเบฑเบเบเบนเปเบเบปเบกเบเบตเปเปเบงเบปเปเบฒเบเบฒเบชเบฒเบญเบฑเบเบเบดเบ, เบเบฐเบฅเบธเบเบฒเปเบเปเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฒเบเปเบเบเบฒเบชเบฒ: Sergey Larin.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com
