From cf6e2abd416c26105396fa0dd1834e3879fa2e08 Mon Sep 17 00:00:00 2001 From: jsorg71 Date: Tue, 8 Feb 2005 03:45:30 +0000 Subject: [PATCH] added a bunch of error checks --- common/os_calls.c | 48 ++- common/os_calls.h | 1 + vnc/vnc.c | 715 ++++++++++++++++++++---------------------- vnc/vnc.h | 12 +- xrdp/constants.h | 1 + xrdp/xrdp.c | 2 +- xrdp/xrdp_bitmap.c | 12 +- xrdp/xrdp_interface.c | 8 +- xrdp/xrdp_login_wnd.c | 2 +- xrdp/xrdp_painter.c | 12 +- xrdp/xrdp_process.c | 24 +- xrdp/xrdp_tcp.c | 2 + xrdp/xrdp_types.h | 27 +- 13 files changed, 440 insertions(+), 426 deletions(-) diff --git a/common/os_calls.c b/common/os_calls.c index 6d6acaef..e236088c 100644 --- a/common/os_calls.c +++ b/common/os_calls.c @@ -38,6 +38,7 @@ #include #include #include +#include #endif #include #include @@ -68,6 +69,10 @@ static int g_memid = 0; static struct xrdp_list* g_memlist = 0; #endif +/* forward declarations */ +void g_printf(char* format, ...); +void pipe_sig(int sig_num); + /*****************************************************************************/ int g_init_system(void) { @@ -76,13 +81,15 @@ int g_init_system(void) WSAStartup(2, &w); InitializeCriticalSection(&g_term_mutex); +#else + signal(SIGPIPE, pipe_sig); #endif #ifdef MEMLEAK g_memlist = xrdp_list_create(); - printf("some info\n\r"); - printf("sizeof xrdp_bitmap is %d\n\r", sizeof(struct xrdp_bitmap)); - printf("sizeof xrdp_wm is %d\n\r", sizeof(struct xrdp_wm)); - printf("sizeof stream is %d\n\r", sizeof(struct stream)); + g_printf("some info\n\r"); + g_printf("sizeof xrdp_bitmap is %d\n\r", sizeof(struct xrdp_bitmap)); + g_printf("sizeof xrdp_wm is %d\n\r", sizeof(struct xrdp_wm)); + g_printf("sizeof stream is %d\n\r", sizeof(struct stream)); #endif return 0; } @@ -225,7 +232,7 @@ void g_hexdump(char* p, int len) offset = 0; while (offset < len) { - printf("%04x ", offset); + g_printf("%04x ", offset); thisline = len - offset; if (thisline > 16) { @@ -233,17 +240,17 @@ void g_hexdump(char* p, int len) } for (i = 0; i < thisline; i++) { - printf("%02x ", line[i]); + g_printf("%02x ", line[i]); } for (; i < 16; i++) { - printf(" "); + g_printf(" "); } for (i = 0; i < thisline; i++) { - printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.'); + g_printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.'); } - printf("\n\r"); + g_printf("\n\r"); offset += thisline; line += thisline; } @@ -509,8 +516,14 @@ int g_tcp_select(int sck1, int sck2) time.tv_sec = 0; time.tv_usec = 0; FD_ZERO(&rfds); - FD_SET(((unsigned int)sck1), &rfds); - FD_SET(((unsigned int)sck2), &rfds); + if (sck1 > 0) + { + FD_SET(((unsigned int)sck1), &rfds); + } + if (sck2 > 0) + { + FD_SET(((unsigned int)sck2), &rfds); + } max = sck1; if (sck2 > max) { @@ -934,3 +947,16 @@ int g_system(char* aexec) { return system(aexec); } + +/*****************************************************************************/ +void g_signal(int sig_num, void (*func)(int)) +{ + signal(sig_num, func); +} + +/*****************************************************************************/ +void pipe_sig(int sig_num) +{ + /* do nothing */ + g_printf("got SIGPIPE(%d)\n\r", sig_num); +} diff --git a/common/os_calls.h b/common/os_calls.h index 009ed4a4..b2018b67 100644 --- a/common/os_calls.h +++ b/common/os_calls.h @@ -86,3 +86,4 @@ int g_load_library(char* in); int g_free_library(int lib); void* g_get_proc_address(int lib, char* name); int g_system(char* aexec); +void g_signal(int sig_num, void (*func)(int)); diff --git a/vnc/vnc.c b/vnc/vnc.c index 63eda712..63dbfdb8 100644 --- a/vnc/vnc.c +++ b/vnc/vnc.c @@ -22,12 +22,94 @@ #include "vnc.h" +/******************************************************************************/ +/* returns error */ +int lib_recv(struct vnc* v, char* data, int len) +{ + int rcvd; + + if (v->sck_closed) + { + return 1; + } + while (len > 0) + { + rcvd = g_tcp_recv(v->sck, data, len, 0); + if (rcvd == -1) + { + if (g_tcp_last_error_would_block(v->sck)) + { + g_sleep(1); + } + else + { + return 1; + } + } + else if (rcvd == 0) + { + v->sck_closed = 1; + return 1; + } + else + { + data += rcvd; + len -= rcvd; + } + } + return 0; +} + +/*****************************************************************************/ +/* returns error */ +int lib_send(struct vnc* v, char* data, int len) +{ + int sent; + + if (v->sck_closed) + { + return 1; + } + while (len > 0) + { + sent = g_tcp_send(v->sck, data, len, 0); + if (sent == -1) + { + if (g_tcp_last_error_would_block(v->sck)) + { + g_sleep(1); + } + else + { + return 1; + } + } + else if (sent == 0) + { + v->sck_closed = 1; + return 1; + } + else + { + data += sent; + len -= sent; + } + } + return 0; +} + /******************************************************************************/ int lib_mod_event(struct vnc* v, int msg, int param1, int param2) { struct stream* s; int key; + int error; + int x; + int y; + int cx; + int cy; + error = 0; make_stream(s); if (msg >= 15 && msg <= 16) /* key events */ { @@ -81,13 +163,7 @@ int lib_mod_event(struct vnc* v, int msg, int param1, int param2) out_uint8(s, msg == 15); /* down flag */ out_uint8s(s, 2); out_uint32_be(s, key); - if (g_tcp_force_send(v->sck, s->data, 8) != 0) - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - return 1; - } + error = lib_send(v, s->data, 8); } } else if (msg >= 100 && msg <= 110) /* mouse events */ @@ -111,16 +187,26 @@ int lib_mod_event(struct vnc* v, int msg, int param1, int param2) out_uint8(s, v->mod_mouse_state); out_uint16_be(s, param1); out_uint16_be(s, param2); - if (g_tcp_force_send(v->sck, s->data, 6) != 0) - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - return 1; - } + error = lib_send(v, s->data, 6); + } + else if (msg == 200) /* invalidate */ + { + /* FrambufferUpdateRequest */ + init_stream(s, 8192); + out_uint8(s, 3); + out_uint8(s, 0); + x = (param1 >> 16) & 0xffff; + out_uint16_be(s, x); + y = param1 & 0xffff; + out_uint16_be(s, y); + cx = (param2 >> 16) & 0xffff; + out_uint16_be(s, cx); + cy = param2 & 0xffff; + out_uint16_be(s, cy); + error = lib_send(v, s->data, 10); } free_stream(s); - return 0; + return error; } //****************************************************************************** @@ -130,13 +216,21 @@ int get_pixel_safe(char* data, int x, int y, int width, int height, int bpp) int shift; if (x < 0) + { return 0; + } if (y < 0) + { return 0; + } if (x >= width) + { return 0; + } if (y >= height) + { return 0; + } if (bpp == 1) { width = (width + 7) / 8; @@ -150,9 +244,13 @@ int get_pixel_safe(char* data, int x, int y, int width, int height, int bpp) start = y * width + x / 2; shift = x % 2; if (shift == 0) + { return (data[start] & 0xf0) >> 4; + } else + { return data[start] & 0x0f; + } } else if (bpp == 8) { @@ -173,22 +271,34 @@ void set_pixel_safe(char* data, int x, int y, int width, int height, int bpp, int shift; if (x < 0) + { return; + } if (y < 0) + { return; + } if (x >= width) + { return; + } if (y >= height) + { return; + } if (bpp == 1) { width = (width + 7) / 8; start = (y * width) + x / 8; shift = x % 8; if (pixel & 1) + { data[start] = data[start] | (0x80 >> shift); + } else + { data[start] = data[start] & ~(0x80 >> shift); + } } else if (bpp == 15 || bpp == 16) { @@ -259,134 +369,117 @@ int lib_framebuffer_update(struct vnc* v) int b; int data_size; int need_size; + int error; struct stream* s; data_size = 0; data = 0; + num_recs = 0; Bpp = (v->mod_bpp + 7) / 8; make_stream(s); init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 3) != 0) + error = lib_recv(v, s->data, 3); + if (error == 0) { - free_stream(s); - return 1; + in_uint8s(s, 1); + in_uint16_be(s, num_recs); + error = v->server_begin_update(v); } - in_uint8s(s, 1); - in_uint16_be(s, num_recs); - - v->server_begin_update(v); for (i = 0; i < num_recs; i++) { - init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 12) != 0) + if (error != 0) { - free_stream(s); - return 1; + break; } - in_uint16_be(s, x); - in_uint16_be(s, y); - in_uint16_be(s, cx); - in_uint16_be(s, cy); - in_uint32_be(s, encoding); - if (encoding == 0) /* raw */ - { - need_size = cx * cy * Bpp; - if (need_size > data_size) - { - g_free(data); - data = (char*)g_malloc(need_size, 0); - data_size = need_size; - } - if (g_tcp_force_recv(v->sck, data, cx * cy * Bpp) != 0) - { - g_free(data); - free_stream(s); - return 1; - } - if (v->server_paint_rect(v, x, y, cx, cy, data) != 0) - { - g_free(data); - free_stream(s); - return 1; - } - } - else if (encoding == 1) /* copy rect */ - { - init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 4) != 0) - { - g_free(data); - free_stream(s); - return 1; - } - in_uint16_be(s, srcx); - in_uint16_be(s, srcy); - if (v->server_screen_blt(v, x, y, cx, cy, srcx, srcy) != 0) + init_stream(s, 8192); + error = lib_recv(v, s->data, 12); + if (error == 0) + { + in_uint16_be(s, x); + in_uint16_be(s, y); + in_uint16_be(s, cx); + in_uint16_be(s, cy); + in_uint32_be(s, encoding); + if (encoding == 0) /* raw */ { - g_free(data); - free_stream(s); - return 1; + need_size = cx * cy * Bpp; + if (need_size > data_size) + { + g_free(data); + data = (char*)g_malloc(need_size, 0); + data_size = need_size; + } + error = lib_recv(v, data, need_size); + /*g_printf("%d %d\n", i, need_size);*/ + if (error == 0) + { + error = v->server_paint_rect(v, x, y, cx, cy, data); + } } - } - else if (encoding == 0xffffff11) /* cursor */ - { - g_memset(cursor_data, 0, 32 * (32 * 3)); - g_memset(cursor_mask, 0, 32 * (32 / 8)); - init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, - cx * cy * Bpp + ((cx + 7) / 8) * cy) != 0) + else if (encoding == 1) /* copy rect */ { - g_free(data); - free_stream(s); - return 1; + init_stream(s, 8192); + error = lib_recv(v, s->data, 4); + if (error == 0) + { + in_uint16_be(s, srcx); + in_uint16_be(s, srcy); + error = v->server_screen_blt(v, x, y, cx, cy, srcx, srcy); + } } - in_uint8p(s, d1, cx * cy * Bpp); - in_uint8p(s, d2, ((cx + 7) / 8) * cy); - for (j = 0; j < 32; j++) + else if (encoding == 0xffffff11) /* cursor */ { - for (k = 0; k < 32; k++) + g_memset(cursor_data, 0, 32 * (32 * 3)); + g_memset(cursor_mask, 0, 32 * (32 / 8)); + init_stream(s, 8192); + error = lib_recv(v, s->data, cx * cy * Bpp + ((cx + 7) / 8) * cy); + if (error == 0) { - pixel = get_pixel_safe(d2, k, 31 - j, cx, cy, 1); - set_pixel_safe(cursor_mask, k, j, 32, 32, 1, !pixel); - if (pixel) + in_uint8p(s, d1, cx * cy * Bpp); + in_uint8p(s, d2, ((cx + 7) / 8) * cy); + for (j = 0; j < 32; j++) { - pixel = get_pixel_safe(d1, k, 31 - j, cx, cy, v->mod_bpp); - split_color(pixel, &r, &g, &b, v->mod_bpp, v->palette); - pixel = make_color(r, g, b, 24); - set_pixel_safe(cursor_data, k, j, 32, 32, 24, pixel); + for (k = 0; k < 32; k++) + { + pixel = get_pixel_safe(d2, k, 31 - j, cx, cy, 1); + set_pixel_safe(cursor_mask, k, j, 32, 32, 1, !pixel); + if (pixel) + { + pixel = get_pixel_safe(d1, k, 31 - j, cx, cy, v->mod_bpp); + split_color(pixel, &r, &g, &b, v->mod_bpp, v->palette); + pixel = make_color(r, g, b, 24); + set_pixel_safe(cursor_data, k, j, 32, 32, 24, pixel); + } + } } + error = v->server_set_cursor(v, x, y, cursor_data, cursor_mask); } } - if (v->server_set_cursor(v, x, y, cursor_data, cursor_mask) != 0) + else { - g_free(data); - free_stream(s); - return 1; + g_printf("error in lib_framebuffer_update\n\r"); } } - else - { - g_printf("error in lib_framebuffer_update\n\r"); - } } - v->server_end_update(v); + if (error == 0) + { + error = v->server_end_update(v); + } g_free(data); - - /* FrambufferUpdateRequest */ - init_stream(s, 8192); - out_uint8(s, 3); - out_uint8(s, 1); - out_uint16_be(s, 0); - out_uint16_be(s, 0); - out_uint16_be(s, v->mod_width); - out_uint16_be(s, v->mod_height); - if (g_tcp_force_send(v->sck, s->data, 10) != 0) - { - free_stream(s); - return 1; + if (error == 0) + { + /* FrambufferUpdateRequest */ + init_stream(s, 8192); + out_uint8(s, 3); + out_uint8(s, 1); + out_uint16_be(s, 0); + out_uint16_be(s, 0); + out_uint16_be(s, v->mod_width); + out_uint16_be(s, v->mod_height); + error = lib_send(v, s->data, 10); } free_stream(s); - return 0; + return error; } /******************************************************************************/ @@ -394,24 +487,20 @@ int lib_clip_data(struct vnc* v) { struct stream* s; int size; + int error; make_stream(s); init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 7) != 0) - { - free_stream(s); - return 1; - } - in_uint8s(s, 3); - in_uint32_be(s, size); - init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, size) != 0) + error = lib_recv(v, s->data, 7); + if (error == 0) { - free_stream(s); - return 1; + in_uint8s(s, 3); + in_uint32_be(s, size); + init_stream(s, 8192); + error = lib_recv(v, s->data, size); } free_stream(s); - return 0; + return error; } /******************************************************************************/ @@ -424,83 +513,72 @@ int lib_palette_update(struct vnc* v) int r; int g; int b; + int error; make_stream(s); init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 5) != 0) + error = lib_recv(v, s->data, 5); + if (error == 0) { - free_stream(s); - return 1; + in_uint8s(s, 1); + in_uint16_be(s, first_color); + in_uint16_be(s, num_colors); + init_stream(s, 8192); + error = lib_recv(v, s->data, num_colors * 6); } - in_uint8s(s, 1); - in_uint16_be(s, first_color); - in_uint16_be(s, num_colors); - init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, num_colors * 6) != 0) + if (error == 0) { - free_stream(s); - return 1; + for (i = 0; i < num_colors; i++) + { + in_uint16_be(s, r); + in_uint16_be(s, g); + in_uint16_be(s, b); + r = r >> 8; + g = g >> 8; + b = b >> 8; + v->palette[first_color + i] = (r << 16) | (g << 8) | b; + } + error = v->server_begin_update(v); + } + if (error == 0) + { + error = v->server_palette(v, v->palette); } - for (i = 0; i < num_colors; i++) + if (error == 0) { - in_uint16_be(s, r); - in_uint16_be(s, g); - in_uint16_be(s, b); - r = r >> 8; - g = g >> 8; - b = b >> 8; - v->palette[first_color + i] = (r << 16) | (g << 8) | b; + error = v->server_end_update(v); } - v->server_begin_update(v); - v->server_palette(v, v->palette); - v->server_end_update(v); free_stream(s); - return 0; + return error; } /******************************************************************************/ int lib_mod_signal(struct vnc* v) { char type; + int error; - if (g_tcp_force_recv(v->sck, &type, 1) != 0) - { - g_tcp_close(v->sck); - v->sck = 0; - return 1; - } - if (type == 0) /* framebuffer update */ + error = lib_recv(v, &type, 1); + if (error == 0) { - if (lib_framebuffer_update(v) != 0) + if (type == 0) /* framebuffer update */ { - g_tcp_close(v->sck); - v->sck = 0; - return 1; + error = lib_framebuffer_update(v); } - } - else if (type == 1) /* palette */ - { - if (lib_palette_update(v) != 0) + else if (type == 1) /* palette */ { - g_tcp_close(v->sck); - v->sck = 0; - return 1; + error = lib_palette_update(v); } - } - else if (type == 3) /* clipboard */ - { - if (lib_clip_data(v) != 0) + else if (type == 3) /* clipboard */ { - g_tcp_close(v->sck); - v->sck = 0; - return 1; + error = lib_clip_data(v); + } + else + { + g_printf("unknown in lib_mod_signal %d\n\r", type); } } - else - { - g_printf("unknown in lib_mod_signal %d\n\r", type); - } - return 0; + return error; } /******************************************************************************/ @@ -536,7 +614,6 @@ int lib_mod_connect(struct vnc* v) int error; int i; int check_sec_result; - int sck; int version; int size; int code; @@ -554,8 +631,9 @@ int lib_mod_connect(struct vnc* v) i = 0; error = 0; init_stream(s, 8192); - sck = g_tcp_socket(); - if (g_tcp_connect(sck, v->ip, "3350") == 0) + v->sck = g_tcp_socket(); + v->sck_closed = 0; + if (g_tcp_connect(v->sck, v->ip, "3350") == 0) { s_push_layer(s, channel_hdr, 8); out_uint16_be(s, 0); // code @@ -572,49 +650,37 @@ int lib_mod_connect(struct vnc* v) s_pop_layer(s, channel_hdr); out_uint32_be(s, 0); // version out_uint32_be(s, s->end - s->data); // size - if (g_tcp_force_send(sck, s->data, s->end - s->data) != 0) + error = lib_send(v, s->data, s->end - s->data); + if (error == 0) { - g_tcp_close(sck); - free_stream(s); - return 7; + init_stream(s, 8192); + error = lib_recv(v, s->data, 8); } - init_stream(s, 8192); - if (g_tcp_force_recv(sck, s->data, 8) == 0) + if (error == 0) { in_uint32_be(s, version); in_uint32_be(s, size); init_stream(s, 8192); - if (g_tcp_force_recv(sck, s->data, size - 8) == 0) + error = lib_recv(v, s->data, size - 8); + } + if (error == 0) + { + if (version == 0) { - if (version == 0) + in_uint16_be(s, code); + if (code == 3) { - in_uint16_be(s, code); - if (code == 3) + in_uint16_be(s, ok); + in_uint16_be(s, display); + if (ok) { - in_uint16_be(s, ok); - in_uint16_be(s, display); - if (ok) - { - i = display; - } + i = display; } } } - else - { - g_tcp_close(sck); - free_stream(s); - return 7; - } - } - else - { - g_tcp_close(sck); - free_stream(s); - return 7; } } - g_tcp_close(sck); + g_tcp_close(v->sck); if (error != 0 || i == 0) { free_stream(s); @@ -629,128 +695,87 @@ int lib_mod_connect(struct vnc* v) } make_stream(pixel_format); v->sck = g_tcp_socket(); + v->sck_closed = 0; error = g_tcp_connect(v->sck, v->ip, con_port); if (error == 0) { g_tcp_set_non_blocking(v->sck); + g_tcp_set_no_delay(v->sck); /* protocal version */ init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 12) != 0) + error = lib_recv(v, s->data, 12); + if (error == 0) { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } - if (g_tcp_force_send(v->sck, "RFB 003.003\n", 12) != 0) - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; + error = lib_send(v, "RFB 003.003\n", 12); } /* sec type */ - init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 4) != 0) + if (error == 0) { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } - in_uint32_be(s, i); - if (i == 1) /* none */ - { - check_sec_result = 0; + init_stream(s, 8192); + error = lib_recv(v, s->data, 4); } - else if (i == 2) /* dec the password and the server random */ + if (error == 0) { - init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 16) != 0) + in_uint32_be(s, i); + if (i == 1) /* none */ + { + check_sec_result = 0; + } + else if (i == 2) /* dec the password and the server random */ { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; + init_stream(s, 8192); + error = lib_recv(v, s->data, 16); + if (error == 0) + { + rfbEncryptBytes((unsigned char*)s->data, v->password); + error = lib_send(v, s->data, 16); + } } - rfbEncryptBytes((unsigned char*)s->data, v->password); - if (g_tcp_force_send(v->sck, s->data, 16) != 0) + else { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; + error = 1; } } - else - { - error = 1; - } } if (error == 0 && check_sec_result) { /* sec result */ init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 4) != 0) + error = lib_recv(v, s->data, 4); + if (error == 0) { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } - in_uint32_be(s, i); - if (i != 0) - { - error = 2; + in_uint32_be(s, i); + if (i != 0) + { + error = 2; + } } } if (error == 0) { init_stream(s, 8192); s->data[0] = 1; - if (g_tcp_force_send(v->sck, s->data, 1) != 0) /* share flag */ - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } - if (g_tcp_force_recv(v->sck, s->data, 4) != 0) /* server init */ - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } + error = lib_send(v, s->data, 1); /* share flag */ + } + if (error == 0) + { + error = lib_recv(v, s->data, 4); /* server init */ + } + if (error == 0) + { in_uint16_be(s, v->mod_width); in_uint16_be(s, v->mod_height); init_stream(pixel_format, 8192); - if (g_tcp_force_recv(v->sck, pixel_format->data, 16) != 0) - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } + error = lib_recv(v, pixel_format->data, 16); + } + if (error == 0) + { in_uint8(pixel_format, v->mod_bpp); init_stream(s, 8192); - if (g_tcp_force_recv(v->sck, s->data, 4) != 0) /* name len */ - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } + error = lib_recv(v, s->data, 4); /* name len */ + } + if (error == 0) + { in_uint32_be(s, i); if (i > 255 || i < 0) { @@ -758,18 +783,11 @@ int lib_mod_connect(struct vnc* v) } else { - if (g_tcp_force_recv(v->sck, v->mod_name, i) != 0) - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } + error = lib_recv(v, v->mod_name, i); v->mod_name[i] = 0; } - /* should be connected */ } + /* should be connected */ if (error == 0) { /* SetPixelFormat */ @@ -794,14 +812,10 @@ int lib_mod_connect(struct vnc* v) out_uint8s(pixel_format, 3); /* pad */ } out_uint8a(s, pixel_format->data, 16); - if (g_tcp_force_send(v->sck, s->data, 20) != 0) - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } + error = lib_send(v, s->data, 20); + } + if (error == 0) + { /* SetEncodings */ init_stream(s, 8192); out_uint8(s, 2); @@ -810,14 +824,10 @@ int lib_mod_connect(struct vnc* v) out_uint32_be(s, 0); /* raw */ out_uint32_be(s, 1); /* copy rect */ out_uint32_be(s, 0xffffff11); /* cursor */ - if (g_tcp_force_send(v->sck, s->data, 4 + 3 * 4) != 0) - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } + error = lib_send(v, s->data, 4 + 3 * 4); + } + if (error == 0) + { /* FrambufferUpdateRequest */ init_stream(s, 8192); out_uint8(s, 3); @@ -826,14 +836,7 @@ int lib_mod_connect(struct vnc* v) out_uint16_be(s, 0); out_uint16_be(s, v->mod_width); out_uint16_be(s, v->mod_height); - if (g_tcp_force_send(v->sck, s->data, 10) != 0) - { - g_tcp_close(v->sck); - v->sck = 0; - free_stream(s); - free_stream(pixel_format); - return 7; - } + error = lib_send(v, s->data, 10); } if (error == 0) { @@ -843,46 +846,19 @@ int lib_mod_connect(struct vnc* v) error = 4; } } - /* set almost null cursor */ - g_memset(cursor_data, 0, 32 * (32 * 3)); - g_memset(cursor_data + (32 * (32 * 3) - 1 * 32 * 3), 0xff, 9); - g_memset(cursor_data + (32 * (32 * 3) - 2 * 32 * 3), 0xff, 9); - g_memset(cursor_data + (32 * (32 * 3) - 3 * 32 * 3), 0xff, 9); - g_memset(cursor_mask, 0xff, 32 * (32 / 8)); - v->server_set_cursor(v, 0, 0, cursor_data, cursor_mask); - free_stream(s); - free_stream(pixel_format); - if (error != 0) + if (error == 0) { - g_tcp_close(v->sck); - v->sck = 0; - } - return error; -} - -/******************************************************************************/ -int lib_mod_invalidate(struct vnc* v, int x, int y, int cx, int cy) -{ - struct stream* s; - - make_stream(s); - /* FrambufferUpdateRequest */ - init_stream(s, 8192); - out_uint8(s, 3); - out_uint8(s, 0); - out_uint16_be(s, x); - out_uint16_be(s, y); - out_uint16_be(s, cx); - out_uint16_be(s, cy); - if (g_tcp_force_send(v->sck, s->data, 10) != 0) - { - free_stream(s); - g_tcp_close(v->sck); - v->sck = 0; - return 1; + /* set almost null cursor */ + g_memset(cursor_data, 0, 32 * (32 * 3)); + g_memset(cursor_data + (32 * (32 * 3) - 1 * 32 * 3), 0xff, 9); + g_memset(cursor_data + (32 * (32 * 3) - 2 * 32 * 3), 0xff, 9); + g_memset(cursor_data + (32 * (32 * 3) - 3 * 32 * 3), 0xff, 9); + g_memset(cursor_mask, 0xff, 32 * (32 / 8)); + error = v->server_set_cursor(v, 0, 0, cursor_data, cursor_mask); } free_stream(s); - return 0; + free_stream(pixel_format); + return error; } /******************************************************************************/ @@ -924,12 +900,11 @@ int mod_init() v = (struct vnc*)g_malloc(sizeof(struct vnc), 1); /* set client functions */ v->size = sizeof(struct vnc); - v->handle = (int)v; + v->handle = (long)v; v->mod_connect = lib_mod_connect; v->mod_start = lib_mod_start; v->mod_event = lib_mod_event; v->mod_signal = lib_mod_signal; - v->mod_invalidate = lib_mod_invalidate; v->mod_end = lib_mod_end; v->mod_set_param = lib_mod_set_param; return (int)v; @@ -939,7 +914,9 @@ int mod_init() int mod_exit(struct vnc* v) { if (v == 0) + { return 0; + } g_tcp_close(v->sck); g_free(v); return 0; diff --git a/vnc/vnc.h b/vnc/vnc.h index c2963011..9462ec61 100644 --- a/vnc/vnc.h +++ b/vnc/vnc.h @@ -14,7 +14,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. xrdp: A Remote Desktop Protocol server. - Copyright (C) Jay Sorg 2004 + Copyright (C) Jay Sorg 2004-2005 libvnc @@ -35,10 +35,8 @@ struct vnc int (*mod_connect)(struct vnc* v); int (*mod_event)(struct vnc* v, int msg, int param1, int param2); int (*mod_signal)(struct vnc* v); - int (*mod_invalidate)(struct vnc* v, int x, int y, int cx, int cy); int (*mod_end)(struct vnc* v); int (*mod_set_param)(struct vnc* v, char* name, char* value); - int d1[93]; /* server functions */ int (*server_begin_update)(struct vnc* v); int (*server_end_update)(struct vnc* v); @@ -51,11 +49,10 @@ struct vnc int (*server_set_cursor)(struct vnc* v, int x, int y, char* data, char* mask); int (*server_palette)(struct vnc* v, int* palette); int (*server_error_popup)(struct vnc* v, char* error, char* caption); - int d2[92]; /* common */ - int handle; /* pointer to self as int */ - int wm; - int painter; + long handle; /* pointer to self as int */ + long wm; + long painter; int sck; /* mod data */ int server_width; @@ -72,4 +69,5 @@ struct vnc char password[256]; char ip[256]; char port[256]; + int sck_closed; }; diff --git a/xrdp/constants.h b/xrdp/constants.h index dd473ccc..2ee617d8 100644 --- a/xrdp/constants.h +++ b/xrdp/constants.h @@ -428,3 +428,4 @@ #define WM_BUTTON4DOWN 108 #define WM_BUTTON5UP 109 #define WM_BUTTON5DOWN 110 +#define WM_INVALIDATE 200 diff --git a/xrdp/xrdp.c b/xrdp/xrdp.c index 41ec3971..bff20372 100644 --- a/xrdp/xrdp.c +++ b/xrdp/xrdp.c @@ -34,7 +34,7 @@ THREAD_RV THREAD_CC xrdp_listen_run(void* in_val) return 0; } -//#define CLEAN_CLOSE +#define CLEAN_CLOSE /*****************************************************************************/ int main(int argc, char** argv) diff --git a/xrdp/xrdp_bitmap.c b/xrdp/xrdp_bitmap.c index de0c0d57..9080758b 100644 --- a/xrdp/xrdp_bitmap.c +++ b/xrdp/xrdp_bitmap.c @@ -891,14 +891,16 @@ int xrdp_bitmap_invalidate(struct xrdp_bitmap* self, struct xrdp_rect* rect) { if (self->wm->mod != 0) { - if (self->wm->mod->mod_invalidate != 0) + if (self->wm->mod->mod_event != 0) { if (rect != 0) { - self->wm->mod->mod_invalidate(self->wm->mod, - rect->left, rect->top, - rect->right - rect->left, - rect->bottom - rect->top); + x = rect->left; + y = rect->top; + w = rect->right - rect->left; + h = rect->bottom - rect->top; + self->wm->mod->mod_event(self->wm->mod, WM_INVALIDATE, /* 200 */ + MAKELONG(x, y), MAKELONG(w, h)); } } } diff --git a/xrdp/xrdp_interface.c b/xrdp/xrdp_interface.c index 55b1de55..388e017e 100644 --- a/xrdp/xrdp_interface.c +++ b/xrdp/xrdp_interface.c @@ -50,7 +50,7 @@ int server_init(void) g_rdp_process = 0; make_stream(g_s); init_stream(g_s, 8192); - g_mod.handle = (int)(&g_mod); + g_mod.handle = (long)(&g_mod); g_mod.mod_event = mod_event; return 0; } @@ -107,7 +107,7 @@ int server_loop(int sck) } if (g_mod.wm == 0) { - g_mod.wm = (int)(g_rdp_process->wm); + g_mod.wm = (long)(g_rdp_process->wm); } } init_stream(g_s, 8192); @@ -134,7 +134,7 @@ int server_begin_update(void) wm = (struct xrdp_wm*)g_mod.wm; p = xrdp_painter_create(wm); xrdp_painter_begin_update(p); - g_mod.painter = (int)p; + g_mod.painter = (long)p; return 0; } @@ -224,7 +224,7 @@ int server_begin_update(struct xrdp_mod* mod) wm = (struct xrdp_wm*)mod->wm; p = xrdp_painter_create(wm); xrdp_painter_begin_update(p); - mod->painter = (int)p; + mod->painter = (long)p; return 0; } diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index b6fa0d19..e2320dfa 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -101,7 +101,7 @@ int xrdp_wm_setup_mod(struct xrdp_wm* self, } if (self->mod != 0) { - self->mod->wm = (int)self; + self->mod->wm = (long)self; self->mod->server_begin_update = server_begin_update; self->mod->server_end_update = server_end_update; self->mod->server_fill_rect = server_fill_rect; diff --git a/xrdp/xrdp_painter.c b/xrdp/xrdp_painter.c index 7fcb7170..1863db4c 100644 --- a/xrdp/xrdp_painter.c +++ b/xrdp/xrdp_painter.c @@ -555,10 +555,20 @@ int xrdp_painter_draw_text(struct xrdp_painter* self, draw_rect.right--; draw_rect.bottom--; flags = 0x03; /* 0x73; TEXT2_IMPLICIT_X and something else */ + DEBUG(("sending text order \ +font %d flags %d mixmode %d color1 %d color2 %d \ +clip left %d clip top %d clip right %d clip bottom %d \ +box left %d box top %d box right %d box bottom %d \ +x %d y %d len %d rect %d %d %d %d\n\r", + f, flags, 0, font->color, 0, x, y, x + total_width, + y + total_height, 0, 0, 0, 0, x1, y1, len, + draw_rect.left, draw_rect.top, + draw_rect.right, draw_rect.bottom)); xrdp_orders_text(self->orders, f, flags, 0, font->color, 0, x, y, x + total_width, y + total_height, - 0, 0, 0, 0, x1, y1, data, len * 2, &draw_rect); + 0, 0, 0, 0, + x1, y1, data, len * 2, &draw_rect); } } k++; diff --git a/xrdp/xrdp_process.c b/xrdp/xrdp_process.c index 91531688..72c39ff5 100644 --- a/xrdp/xrdp_process.c +++ b/xrdp/xrdp_process.c @@ -105,7 +105,7 @@ int xrdp_process_loop(struct xrdp_process* self, struct stream* s) int xrdp_process_main_loop(struct xrdp_process* self) { #ifndef XRDP_LIB - int i; + int sel_r; struct stream* s; make_stream(s); @@ -117,8 +117,16 @@ int xrdp_process_main_loop(struct xrdp_process* self) { while (!g_is_term() && !self->term) { - i = g_tcp_select(self->sck, self->app_sck); - if (i & 1) + sel_r = g_tcp_select(self->sck, self->app_sck); + if (sel_r == 0) /* no data on any stream */ + { + g_sleep(10); + } + else if (sel_r < 0) + { + break; + } + if (sel_r & 1) { init_stream(s, 8192); if (xrdp_process_loop(self, s) != 0) @@ -126,7 +134,7 @@ int xrdp_process_main_loop(struct xrdp_process* self) break; } } - if (i & 2) /* mod socket fired */ + if (sel_r & 2) /* mod socket fired */ { if (self->wm->mod == 0) { @@ -141,14 +149,6 @@ int xrdp_process_main_loop(struct xrdp_process* self) break; } } - if (i == 0) /* no data on any stream */ - { - g_sleep(10); - } - else if (i < 0) - { - break; - } } } if (self->wm->mod != 0) diff --git a/xrdp/xrdp_tcp.c b/xrdp/xrdp_tcp.c index eed5278e..996e6932 100644 --- a/xrdp/xrdp_tcp.c +++ b/xrdp/xrdp_tcp.c @@ -77,6 +77,7 @@ int xrdp_tcp_recv(struct xrdp_tcp* self, struct stream* s, int len) } else { + self->sck_closed = 1; DEBUG((" error = -1 in xrdp_tcp_recv socket %d\n\r", self->sck)); return 1; } @@ -128,6 +129,7 @@ int xrdp_tcp_send(struct xrdp_tcp* self, struct stream* s) } else { + self->sck_closed = 1; DEBUG((" error = -1 in xrdp_tcp_send socket %d\n\r", self->sck)); return 1; } diff --git a/xrdp/xrdp_types.h b/xrdp/xrdp_types.h index 2036b154..84764abc 100644 --- a/xrdp/xrdp_types.h +++ b/xrdp/xrdp_types.h @@ -29,10 +29,8 @@ struct xrdp_mod int (*mod_connect)(struct xrdp_mod* v); int (*mod_event)(struct xrdp_mod* v, int msg, int param1, int param2); int (*mod_signal)(struct xrdp_mod* v); - int (*mod_invalidate)(struct xrdp_mod* v, int x, int y, int cx, int cy); int (*mod_end)(struct xrdp_mod* v); int (*mod_set_param)(struct xrdp_mod* v, char* name, char* value); - int d1[93]; /* server functions */ int (*server_begin_update)(struct xrdp_mod* v); int (*server_end_update)(struct xrdp_mod* v); @@ -45,11 +43,10 @@ struct xrdp_mod int (*server_set_pointer)(struct xrdp_mod* v, int x, int y, char* data, char* mask); int (*server_palette)(struct xrdp_mod* v, int* palette); int (*server_error_popup)(struct xrdp_mod* v, char* error, char* caption); - int d2[92]; /* common */ - int handle; /* pointer to self as int */ - int wm; /* struct xrdp_wm* */ - int painter; + long handle; /* pointer to self as int */ + long wm; /* struct xrdp_wm* */ + long painter; int sck; }; @@ -63,17 +60,17 @@ struct xrdp_mem /* header for bmp file */ struct xrdp_bmp_header { - long size; - long image_width; - long image_height; + int size; + int image_width; + int image_height; short planes; short bit_count; - long compression; - long image_size; - long x_pels_per_meter; - long y_pels_per_meter; - long clr_used; - long clr_important; + int compression; + int image_size; + int x_pels_per_meter; + int y_pels_per_meter; + int clr_used; + int clr_important; }; /* list */