αααβααΆβααΆαβαα·αα·αααβααΎαβααΈβααΈαβαααα»αβα’αααααβααΆβαααααααααΆααβα’αααΈβααΆαβααΆαααααβαααααα·ααΈβαααααβααΎαα
αα βαααααΆααβααΆαβααααΎβααΆαβααΆαα½αβαα·ααΈααΆαβ RDP α αα
αααα»αααΆ ααΎαααΉααα·αα·αααααΎααααΆαααΈαααααα rdesktop αα·ααααΆαααΈααα xrdp α
ααααΎααΆα§αααααααΎααααΈαααααα’ααααααααΆαααα α»α
α’ααααααααα αΆαααααα α»αααΆααααααααααΎααα αα½αα’ααα αΆααα’αΆααααααα αααααααα»αα ααααααΆαααΆααααα ααααααααΌα ααΆα ααΌα ααααααΆαααα α»ααα·α αα½α :) α
ααΆαααααααααΆαα. α’ααααααα»αα’αααΈααΆααααααααααΆαααααααα FreeRDP α’αΆα
ααααΆα
αα»αααααΌαααααΎαα»
αααΆαααΈαααααααααααΆααααααΆαααα·αααΆαααααΆααααΆαα - ααΆααααΌαααΆαααααΎααΆαααααΆαααΎααα αααα»α ReactOS α αΎαα’αααααα’αΆα ααααααααααααααΆαααααΆα ααα·α ααΆααΈααΈααΈαααααΆααααΆαααααα αααααΆαααΆαααΆαααααααΆααααΆαα’αΆαα»α αααΎαα αΎα: ααΆαα ααααααΆαααΎαααααΌαααααααΆααααΆαααααΎα‘αΎααα ααααααΈ 4 ααααααΆααααΆα 2001 - αα ααααααααααΆααααΆαα’αΆαα» 17 ααααΆαα
ααΌα ααααααα»αααΆαααααααααΆααααΈαα»α αααααααααααΊααΌα ααΆααα ααΆααΆαααΌααααα αα 30 αααααΆαα αααα αααααααααα·α ααΎαα·αααΈα’αΆαα»ααααααΆα αααααΆααααΆααααααααα FreeRDP ααΆα 320 ααΆαααααααΆααα αααααΊααΆαααααααααααααα·ααΈ Clocα
αααααΌααα·αα’αΆα α αΌαααΆαα
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);
}
ααα α»ααα½ααααααααΎαααααΆαααα αααα»ααα»αααΆα ααααΆααα ααΎαααΎααααααΌααααααααααααα·ααααα·αα αααα‘αααααα·α - ααααααααααααΎααΆααααα’αΆαα’αααα αα αΆαα αααααΆαααΆαααΆααααα ααα α»ααα·αααααααΆαααααΆαααα ααααα α’αααα αα αΆααααααΆαααααα»ααα»αααΆααα’ααααΉαααααΌαααΆααααα’αΆααααααααααααααααα·ααααα·ααΆααααααΆααααΈαααααα·ααΈααΆαα αΆαα ααα
ααααΆαβαααα αΆβαααα»αβααΆαβαααααααΆα
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 αααα»ααααααα 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++;
}
....
}
αα ααΈαααααΎαααΎαααΆαααααααααααα·αααααΉαααααΌαααααΆαααΆααααα α»ααααα ααααα―αααΆα: ααααα·αααΎ fgetc αααα‘αααα½α’ααααααααααααΌαααΊ 0xFF ααΆααΉαααααΌαααΆαααααααΆαααΆααΆα α»ααααα ααααα―αααΆα (EOF).
EOF ααΆβααΊβααΆβααα αααβααΆβααααααΆβααΆαβαααααβααΆ -1 α α§ααΆα ααα αα αααα»αααΆαα’αα·αααΌα CP1251 α’ααααα α»ααααααααα’αααααααααα»αααααΈααΆααααααΌα 0xFF αααααααΌαααΉαααα -1 ααααα·αααΎααΎααααα»ααα·ααΆαα’αααΈα’αααααΌα ααΆ αα½α’αααα. ααΆααααααΆαα·αα·ααααααααΆ 0xFF ααΌα ααΆ EOF (-1) ααααΌαααΆαααααααΆαααΆααΆα α»ααααα ααααα―αααΆαα ααΎααααΈαααααΆαααα α»ααααααααααααααααα»αααΆαααΊ fgetc αα½αααααααΌαααΆααααααΆαα»ααα αααα»αα’αααααΌα int.
Typos
ααααα 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; // <=
....
}
αααα ααααΆα’ααααα·ααααααΌααααααααα»αα αΎαα || ΠΈ && αα αααα»αααααααααα α αΌαααΎααα·α αΆαααΆααΈαααααΎααααα’αΆα ααΆααααααΆααααααα ααααα_αααα ΠΈ αααααααΆααααΆααααααΌα:
- α’αααααΆααααΈαααΊααααΎααΉα 0α αααα»αααααΈαααααΎαααΉααααα αααα αααα»αααΆααΆαα½αα ααααααααα αααααααα½α mod_time ααΉααααααααΆ 0 ααααα·ααα·αααΈααααααααααΆαααααααααΆααα
- α’ααααα½ααααα»αα ααααα’αααααΊ α α mod_time ααΉαααααΎααΉα 0 (αααααααΆα’αααααααααααααΆαααααααα·αα’αα·αααααΆα) ααΈααααα MIN ααΉαααααΎαααΎααααααΎαααΌα ααΆααααααααΎαααΆααααΈαα
- α’αααααΆααααΈααα·αααααΎααΉα 0α ααααΎαααΎααααααα’αααααααΆα
αα ααααααα½αααααααααααΆαα½α write_time && change_time α₯αα·ααΆααααΉαααΎααα ααααΉαααααΌαα
- α’ααααα½α α¬ααΆααααΈααα·αααααΎααΉα 0α ααααΎαααΎααααααααααα·ααααααΆααΌαααα
- α’αααααΆααααΈααα·αααααΎααΉα 0α ααααΎαααΎααααααα’αααααααΆα
ααααα 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;
....
}
ααΆααααααα ααααα·ααααα·ααααααΌαααΆαααΆααααα αΌαααααΆαα ααΈααααααααα || ΠΈ &&, α¬ == ΠΈ !=α α’ααααα·αα’αΆα ααΆαααααα 20 αα·α 9 αααα»αααααααα½αααΆαααα
ααΆαα αααααααααΆααααααΆααααααααα
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, ... ).
αααααααααααααααΌαααΆαααα αααα
static void
inRepos(STREAM in, unsigned int read)
{
SERVER_DWORD add = 4 - read % 4;
if (add < 4 && add > 0)
{
....
}
}
ααΆααααα½ααα·αα·ααα αααααα > 0 αα·αα αΆαααΆα ααα ααΈαααααα α’αααααΉααααααααααΆαααΌααα ααΈααααα α’αΆα % 4 ααΉααααα‘αααααααααααα ααα ααα»ααααααΆααΉααα·αααααΎααΉα 4 α‘αΎαα
xrdp α
- xrdp - ααΆαα’αα»αααααα·ααΈααΆαα α ααα αΆααααααα’αΆααααΆααααα Apache 2.0 α
- xorgxrdp - αααα»ααααααααα·ααΈαααααΆ Xorg αααααΆααααααΎααΆαα½α xrdp α α’αΆααααΆααααα - X11 (ααΌα ααΆ MIT ααα»ααααα αΆαααααΎαααα»αααΆαααααΆαααΆαα·ααααααα)
ααΆαα’αα·ααααααααααααααΊααα’ααααΎαααααααα rdesktop αα·α FreeRDP α ααααΌα ααΎααααΈααααΎααΆαααΆαα½αααααΆα ααα·α α’αααααααΌαααααΎαααΆαααΈααα VNC ααΆα ααααα‘αα α¬αααΆαααΈααα X11 αα·ααααααααΆαααΆαααΆαααα RDP - X11rdp ααα»ααααααΆαα½αααΉαααΆαααααααα xorgxrdp αααααΌαααΆααααααΆαααα½αααΆααΆαααΆαααα αα·αα
αα αααα»αα’ααααααααααΎαααΉααα·ααααααααααα xorgxrdp ααα
αααααα xrdp ααΌα αααααααα»αααα ααΊααΌα ααΆαα α αΎαααΆααααα αα 80 ααΆαααααααΆααα
ααΆαα’ααααααααααααα
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αααα’ααααα·ααΆαααααΆαααααΆααααΎαααΆα
while (x < 64)
{
*la_buf++ = a;
*lr_buf++ = r;
*lg_buf++ = g;
*lb_buf++ = r;
x++;
}
ααα ααααΈαααααΆαα’αΆαα
// 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 ααΌα ααααααααΆααααααααααα ααΌα ααααβαααβααααΆααβααβααΆβααα α»αβαααβα’αΆα βαα½ααα»αβααΆαβαααΆαβααΆαα
ααΆααααααααααα·αααααΉαααααΌα
// 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. ααΆααα·αα·αααααΎααα·αα αΆαααΆα ααα ααΈααααα αααααΆαααΎααααα»αα’αΆαα’αααααααα·αααΆαα α»αα αααααααΆ α αΎαααααααααααααα α’αααααααΆα ααΌα ααααα’ααααα·αα’αΆα αααααααα’αα·αααααΆαααΆαααα
ααΆααααα½ααα·αα·ααααα·αα αΆαααΆα α
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