summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/file.c49
-rw-r--r--keygen/keygen.c2
-rw-r--r--libxrdp/libxrdp.h14
-rw-r--r--libxrdp/xrdp_bitmap32_compress.c416
-rw-r--r--libxrdp/xrdp_mcs.c2
-rw-r--r--libxrdp/xrdp_orders.c38
-rw-r--r--libxrdp/xrdp_rdp.c92
-rw-r--r--libxrdp/xrdp_sec.c164
-rw-r--r--sesman/chansrv/sound.c85
-rw-r--r--sesman/chansrv/sound.h13
-rw-r--r--xorg/server/module/rdpClientCon.c5
-rw-r--r--xrdp/xrdp_wm.c14
12 files changed, 634 insertions, 260 deletions
diff --git a/common/file.c b/common/file.c
index e21ecdb3..a9a06de9 100644
--- a/common/file.c
+++ b/common/file.c
@@ -24,6 +24,8 @@
#include "file.h"
#include "parse.h"
+#define FILE_MAX_LINE_BYTES 2048
+
/*****************************************************************************/
/* returns error
returns 0 if everything is ok
@@ -32,7 +34,7 @@ static int APP_CC
l_file_read_sections(int fd, int max_file_size, struct list *names)
{
struct stream *s;
- char text[256];
+ char text[FILE_MAX_LINE_BYTES];
char c;
int in_it;
int in_it_index;
@@ -44,7 +46,7 @@ l_file_read_sections(int fd, int max_file_size, struct list *names)
g_file_seek(fd, 0);
in_it_index = 0;
in_it = 0;
- g_memset(text, 0, 256);
+ g_memset(text, 0, FILE_MAX_LINE_BYTES);
list_clear(names);
make_stream(s);
init_stream(s, max_file_size);
@@ -67,7 +69,7 @@ l_file_read_sections(int fd, int max_file_size, struct list *names)
list_add_item(names, (tbus)g_strdup(text));
in_it = 0;
in_it_index = 0;
- g_memset(text, 0, 256);
+ g_memset(text, 0, FILE_MAX_LINE_BYTES);
}
else if (in_it)
{
@@ -86,8 +88,9 @@ l_file_read_sections(int fd, int max_file_size, struct list *names)
}
/*****************************************************************************/
+/* returns error */
static int APP_CC
-file_read_line(struct stream *s, char *text)
+file_read_line(struct stream *s, char *text, int text_bytes)
{
int i;
int skip_to_end;
@@ -108,6 +111,7 @@ file_read_line(struct stream *s, char *text)
while (c != 10 && c != 13)
{
+ /* these mean skip the rest of the line */
if (c == '#' || c == '!' || c == ';')
{
skip_to_end = 1;
@@ -117,6 +121,10 @@ file_read_line(struct stream *s, char *text)
{
text[i] = c;
i++;
+ if (i >= text_bytes)
+ {
+ return 1;
+ }
}
if (s_check_rem(s, 1))
@@ -214,9 +222,10 @@ l_file_read_section(int fd, int max_file_size, const char *section,
struct list *names, struct list *values)
{
struct stream *s;
- char text[512];
- char name[512];
- char value[512];
+ char *data;
+ char *text;
+ char *name;
+ char *value;
char *lvalue;
char c;
int in_it;
@@ -224,12 +233,17 @@ l_file_read_section(int fd, int max_file_size, const char *section,
int len;
int index;
int file_size;
+
+ data = (char *) g_malloc(FILE_MAX_LINE_BYTES * 3, 0);
+ text = data;
+ name = text + FILE_MAX_LINE_BYTES;
+ value = name + FILE_MAX_LINE_BYTES;
file_size = 32 * 1024; /* 32 K file size limit */
g_file_seek(fd, 0);
in_it_index = 0;
in_it = 0;
- g_memset(text, 0, 512);
+ g_memset(text, 0, FILE_MAX_LINE_BYTES);
list_clear(names);
list_clear(values);
make_stream(s);
@@ -249,10 +263,13 @@ l_file_read_section(int fd, int max_file_size, const char *section,
in_uint8(s, c);
if ((c == '#') || (c == ';'))
{
- file_read_line(s, text);
+ if (file_read_line(s, text, FILE_MAX_LINE_BYTES) != 0)
+ {
+ break;
+ }
in_it = 0;
in_it_index = 0;
- g_memset(text, 0, 512);
+ g_memset(text, 0, FILE_MAX_LINE_BYTES);
continue;
}
if (c == '[')
@@ -263,8 +280,8 @@ l_file_read_section(int fd, int max_file_size, const char *section,
{
if (g_strcasecmp(section, text) == 0)
{
- file_read_line(s, text);
- while (file_read_line(s, text) == 0)
+ file_read_line(s, text, FILE_MAX_LINE_BYTES);
+ while (file_read_line(s, text, FILE_MAX_LINE_BYTES) == 0)
{
if (g_strlen(text) > 0)
{
@@ -292,21 +309,27 @@ l_file_read_section(int fd, int max_file_size, const char *section,
}
free_stream(s);
+ g_free(data);
return 0;
}
in_it = 0;
in_it_index = 0;
- g_memset(text, 0, 512);
+ g_memset(text, 0, FILE_MAX_LINE_BYTES);
}
else if (in_it)
{
text[in_it_index] = c;
in_it_index++;
+ if (in_it_index >= FILE_MAX_LINE_BYTES)
+ {
+ break;
+ }
}
}
}
free_stream(s);
+ g_free(data);
return 1;
}
diff --git a/keygen/keygen.c b/keygen/keygen.c
index 3cc1a2f3..bd47f73a 100644
--- a/keygen/keygen.c
+++ b/keygen/keygen.c
@@ -32,7 +32,7 @@
#include "file.h"
/* this is the signature size in bytes */
-#define TSSK_KEY_LENGTH 64
+#define TSSK_KEY_LENGTH 64
/* default to 512 bit key size, can set changed, set */
static int g_key_size_bits = 512;
diff --git a/libxrdp/libxrdp.h b/libxrdp/libxrdp.h
index 2ea8b61d..e56f70dd 100644
--- a/libxrdp/libxrdp.h
+++ b/libxrdp/libxrdp.h
@@ -100,8 +100,8 @@ struct xrdp_sec
struct xrdp_fastpath *fastpath_layer;
struct xrdp_channel *chan_layer;
char server_random[32];
- char client_random[64];
- char client_crypt_random[72];
+ char client_random[256];
+ char client_crypt_random[256 + 8]; /* 64 + 8, 256 + 8 */
struct stream client_mcs_data;
struct stream server_mcs_data;
int decrypt_use_count;
@@ -117,9 +117,10 @@ struct xrdp_sec
void *decrypt_rc4_info;
void *encrypt_rc4_info;
char pub_exp[4];
- char pub_mod[64];
+ char pub_mod[256];
char pub_sig[64];
- char pri_exp[64];
+ char pri_exp[256];
+ int rsa_key_bytes; /* 64 or 256 */
int channel_code;
int multimon;
char fips_encrypt_key[24];
@@ -264,6 +265,9 @@ struct xrdp_orders
struct xrdp_orders_state orders_state;
void *jpeg_han;
int rfx_min_pixel;
+ /* shared */
+ struct stream *s;
+ struct stream *temp_s;
};
#define PROTO_RDP_40 1
@@ -509,7 +513,7 @@ int APP_CC
xrdp_bitmap32_compress(char *in_data, int width, int height,
struct stream *s, int bpp, int byte_limit,
int start_line, struct stream *temp_s,
- int e);
+ int e, int flags);
int APP_CC
xrdp_jpeg_compress(void *handle, char *in_data, int width, int height,
struct stream *s, int bpp, int byte_limit,
diff --git a/libxrdp/xrdp_bitmap32_compress.c b/libxrdp/xrdp_bitmap32_compress.c
index 1bcf5db9..083c4409 100644
--- a/libxrdp/xrdp_bitmap32_compress.c
+++ b/libxrdp/xrdp_bitmap32_compress.c
@@ -36,84 +36,212 @@ http://msdn.microsoft.com/en-us/library/cc241877.aspx
do { if (_level < LLOG_LEVEL) { g_hexdump _args ; } } while (0)
/*****************************************************************************/
+/* split RGB */
static int APP_CC
-fsplit(char *in_data, int start_line, int width, int e,
- char *alpha_data, char *red_data, char *green_data, char *blue_data)
+fsplit3(char *in_data, int start_line, int width, int e,
+ char *r_data, char *g_data, char *b_data)
{
+#if defined(L_ENDIAN)
+ int rp;
+ int gp;
+ int bp;
+#endif
int index;
+ int out_index;
int pixel;
int cy;
- int alpha_bytes;
- int red_bytes;
- int green_bytes;
- int blue_bytes;
int *ptr32;
cy = 0;
- alpha_bytes = 0;
- red_bytes = 0;
- green_bytes = 0;
- blue_bytes = 0;
+ out_index = 0;
while (start_line >= 0)
{
ptr32 = (int *) (in_data + start_line * width * 4);
- for (index = 0; index < width; index++)
+ index = 0;
+#if defined(L_ENDIAN)
+ while (index + 4 <= width)
{
pixel = *ptr32;
ptr32++;
- alpha_data[alpha_bytes] = pixel >> 24;
- alpha_bytes++;
- red_data[red_bytes] = pixel >> 16;
- red_bytes++;
- green_data[green_bytes] = pixel >> 8;
- green_bytes++;
- blue_data[blue_bytes] = pixel >> 0;
- blue_bytes++;
+ rp = (pixel >> 16) & 0x000000ff;
+ gp = (pixel >> 8) & 0x000000ff;
+ bp = (pixel >> 0) & 0x000000ff;
+ pixel = *ptr32;
+ ptr32++;
+ rp |= (pixel >> 8) & 0x0000ff00;
+ gp |= (pixel << 0) & 0x0000ff00;
+ bp |= (pixel << 8) & 0x0000ff00;
+ pixel = *ptr32;
+ ptr32++;
+ rp |= (pixel >> 0) & 0x00ff0000;
+ gp |= (pixel << 8) & 0x00ff0000;
+ bp |= (pixel << 16) & 0x00ff0000;
+ pixel = *ptr32;
+ ptr32++;
+ rp |= (pixel << 8) & 0xff000000;
+ gp |= (pixel << 16) & 0xff000000;
+ bp |= (pixel << 24) & 0xff000000;
+ *((int*)(r_data + out_index)) = rp;
+ *((int*)(g_data + out_index)) = gp;
+ *((int*)(b_data + out_index)) = bp;
+ out_index += 4;
+ index += 4;
+ }
+#endif
+ while (index < width)
+ {
+ pixel = *ptr32;
+ ptr32++;
+ r_data[out_index] = pixel >> 16;
+ g_data[out_index] = pixel >> 8;
+ b_data[out_index] = pixel >> 0;
+ out_index++;
+ index++;
}
for (index = 0; index < e; index++)
{
- alpha_data[alpha_bytes] = 0;
- alpha_bytes++;
- red_data[red_bytes] = 0;
- red_bytes++;
- green_data[green_bytes] = 0;
- green_bytes++;
- blue_data[blue_bytes] = 0;
- blue_bytes++;
+ r_data[out_index] = r_data[out_index - 1];
+ g_data[out_index] = g_data[out_index - 1];
+ b_data[out_index] = b_data[out_index - 1];
+ out_index++;
}
start_line--;
cy++;
+ if (out_index > 64 * 64)
+ {
+ break;
+ }
}
return cy;
}
/*****************************************************************************/
+/* split ARGB */
static int APP_CC
-fdelta(char *plane, int cx, int cy)
+fsplit4(char *in_data, int start_line, int width, int e,
+ char *a_data, char *r_data, char *g_data, char *b_data)
{
- char delta;
- char *ptr8;
+#if defined(L_ENDIAN)
+ int ap;
+ int rp;
+ int gp;
+ int bp;
+#endif
int index;
- int jndex;
+ int out_index;
+ int pixel;
+ int cy;
+ int *ptr32;
- for (jndex = cy - 2; jndex >= 0; jndex--)
+ cy = 0;
+ out_index = 0;
+ while (start_line >= 0)
{
- ptr8 = plane + jndex * cx;
- for (index = 0; index < cx; index++)
+ ptr32 = (int *) (in_data + start_line * width * 4);
+ index = 0;
+#if defined(L_ENDIAN)
+ while (index + 4 <= width)
{
- delta = ptr8[cx] - ptr8[0];
- if (delta & 0x80)
- {
- delta = (((~delta) + 1) << 1) - 1;
- }
- else
- {
- delta = delta << 1;
- }
- ptr8[cx] = delta;
- ptr8++;
+ pixel = *ptr32;
+ ptr32++;
+ ap = (pixel >> 24) & 0x000000ff;
+ rp = (pixel >> 16) & 0x000000ff;
+ gp = (pixel >> 8) & 0x000000ff;
+ bp = (pixel >> 0) & 0x000000ff;
+ pixel = *ptr32;
+ ptr32++;
+ ap |= (pixel >> 16) & 0x0000ff00;
+ rp |= (pixel >> 8) & 0x0000ff00;
+ gp |= (pixel << 0) & 0x0000ff00;
+ bp |= (pixel << 8) & 0x0000ff00;
+ pixel = *ptr32;
+ ptr32++;
+ ap |= (pixel >> 8) & 0x00ff0000;
+ rp |= (pixel >> 0) & 0x00ff0000;
+ gp |= (pixel << 8) & 0x00ff0000;
+ bp |= (pixel << 16) & 0x00ff0000;
+ pixel = *ptr32;
+ ptr32++;
+ ap |= (pixel << 0) & 0xff000000;
+ rp |= (pixel << 8) & 0xff000000;
+ gp |= (pixel << 16) & 0xff000000;
+ bp |= (pixel << 24) & 0xff000000;
+ *((int*)(a_data + out_index)) = ap;
+ *((int*)(r_data + out_index)) = rp;
+ *((int*)(g_data + out_index)) = gp;
+ *((int*)(b_data + out_index)) = bp;
+ out_index += 4;
+ index += 4;
+ }
+#endif
+ while (index < width)
+ {
+ pixel = *ptr32;
+ ptr32++;
+ a_data[out_index] = pixel >> 24;
+ r_data[out_index] = pixel >> 16;
+ g_data[out_index] = pixel >> 8;
+ b_data[out_index] = pixel >> 0;
+ out_index++;
+ index++;
+ }
+ for (index = 0; index < e; index++)
+ {
+ a_data[out_index] = a_data[out_index - 1];
+ r_data[out_index] = r_data[out_index - 1];
+ g_data[out_index] = g_data[out_index - 1];
+ b_data[out_index] = b_data[out_index - 1];
+ out_index++;
+ }
+ start_line--;
+ cy++;
+ if (out_index > 64 * 64)
+ {
+ break;
}
}
+ return cy;
+}
+
+/*****************************************************************************/
+#define DELTA_ONE \
+do { \
+ delta = src8[cx] - src8[0]; \
+ is_neg = (delta >> 7) & 1; \
+ dst8[cx] = (((delta ^ -is_neg) + is_neg) << 1) - is_neg; \
+ src8++; \
+ dst8++; \
+} while (0)
+
+/*****************************************************************************/
+static int APP_CC
+fdelta(char *in_plane, char *out_plane, int cx, int cy)
+{
+ char delta;
+ char is_neg;
+ char *src8;
+ char *dst8;
+ char *src8_end;
+
+ g_memcpy(out_plane, in_plane, cx);
+ src8 = in_plane;
+ dst8 = out_plane;
+ src8_end = src8 + (cx * cy - cx);
+ while (src8 + 8 <= src8_end)
+ {
+ DELTA_ONE;
+ DELTA_ONE;
+ DELTA_ONE;
+ DELTA_ONE;
+ DELTA_ONE;
+ DELTA_ONE;
+ DELTA_ONE;
+ DELTA_ONE;
+ }
+ while (src8 < src8_end)
+ {
+ DELTA_ONE;
+ }
return 0;
}
@@ -156,6 +284,8 @@ fout(int collen, int replen, char *colptr, struct stream *s)
LLOGLN(10, ("fout: big run lreplen %d", lreplen));
replen -= lreplen;
code = ((lreplen & 0xF) << 4) | ((lreplen & 0xF0) >> 4);
+ out_uint8(s, code);
+ colptr += lreplen;
}
else
{
@@ -170,11 +300,11 @@ fout(int collen, int replen, char *colptr, struct stream *s)
lreplen = 0;
}
code = (collen << 4) | lreplen;
+ out_uint8(s, code);
+ out_uint8a(s, colptr, collen);
+ colptr += collen + lreplen;
+ collen = 0;
}
- out_uint8(s, code);
- out_uint8a(s, colptr, collen);
- colptr += collen + lreplen;
- collen = 0;
cont = replen > 0;
}
return 0;
@@ -248,97 +378,159 @@ fpack(char *plane, int cx, int cy, struct stream *s)
}
/*****************************************************************************/
+static int APP_CC
+foutraw3(struct stream *s, int bytes, int header,
+ char *r_data, char *g_data, char *b_data)
+{
+ out_uint8(s, header);
+ out_uint8a(s, r_data, bytes);
+ out_uint8a(s, g_data, bytes);
+ out_uint8a(s, b_data, bytes);
+ /* pad if no RLE */
+ out_uint8(s, 0x00);
+ return 0;
+}
+
+/*****************************************************************************/
+static int APP_CC
+foutraw4(struct stream *s, int bytes, int header,
+ char *a_data, char *r_data, char *g_data, char *b_data)
+{
+ out_uint8(s, header);
+ out_uint8a(s, a_data, bytes);
+ out_uint8a(s, r_data, bytes);
+ out_uint8a(s, g_data, bytes);
+ out_uint8a(s, b_data, bytes);
+ /* pad if no RLE */
+ out_uint8(s, 0x00);
+ return 0;
+}
+
+/*****************************************************************************/
/* returns the number of lines compressed */
int APP_CC
xrdp_bitmap32_compress(char *in_data, int width, int height,
struct stream *s, int bpp, int byte_limit,
int start_line, struct stream *temp_s,
- int e)
+ int e, int flags)
{
- char *alpha_data;
- char *red_data;
- char *green_data;
- char *blue_data;
- int alpha_bytes;
- int red_bytes;
- int green_bytes;
- int blue_bytes;
+ char *a_data;
+ char *r_data;
+ char *g_data;
+ char *b_data;
+ char *sa_data;
+ char *sr_data;
+ char *sg_data;
+ char *sb_data;
+ int a_bytes;
+ int r_bytes;
+ int g_bytes;
+ int b_bytes;
int cx;
int cy;
- int header;
int max_bytes;
+ int total_bytes;
+ int header;
LLOGLN(10, ("xrdp_bitmap32_compress:"));
-
- //header = FLAGS_NOALPHA | FLAGS_RLE;
- //header = FLAGS_NOALPHA;
- header = FLAGS_RLE;
-
+ max_bytes = 4 * 1024;
+ /* need max 8, 4K planes for work */
+ if (max_bytes * 8 > temp_s->size)
+ {
+ return 0;
+ }
+ header = flags & 0xFF;
cx = width + e;
- alpha_data = temp_s->data;
- red_data = alpha_data + cx * height;
- green_data = red_data + cx * height;
- blue_data = green_data + cx * height;
+ sa_data = temp_s->data;
+ sr_data = sa_data + max_bytes;
+ sg_data = sr_data + max_bytes;
+ sb_data = sg_data + max_bytes;
+ a_data = sb_data + max_bytes;
+ r_data = a_data + max_bytes;
+ g_data = r_data + max_bytes;
+ b_data = g_data + max_bytes;
- /* split planes */
- cy = fsplit(in_data, start_line, width, e,
- alpha_data, red_data, green_data, blue_data);
-
- if (header & FLAGS_RLE)
+ if (header & FLAGS_NOALPHA)
{
- out_uint8(s, header);
- if (header & FLAGS_NOALPHA)
+ cy = fsplit3(in_data, start_line, width, e,
+ sr_data, sg_data, sb_data);
+ if (header & FLAGS_RLE)
{
- fdelta(red_data, cx, cy);
- fdelta(green_data, cx, cy);
- fdelta(blue_data, cx, cy);
- red_bytes = fpack(red_data, cx, cy, s);
- green_bytes = fpack(green_data, cx, cy, s);
- blue_bytes = fpack(blue_data, cx, cy, s);
+ fdelta(sr_data, r_data, cx, cy);
+ fdelta(sg_data, g_data, cx, cy);
+ fdelta(sb_data, b_data, cx, cy);
+ out_uint8(s, header);
+ r_bytes = fpack(r_data, cx, cy, s);
+ g_bytes = fpack(g_data, cx, cy, s);
+ b_bytes = fpack(b_data, cx, cy, s);
+ total_bytes = r_bytes + g_bytes + b_bytes;
+ if (1 + total_bytes > byte_limit)
+ {
+ /* failed */
+ LLOGLN(0, ("xrdp_bitmap32_compress: too big, rgb "
+ "bytes %d %d %d total_bytes %d cx %d cy %d "
+ "byte_limit %d", r_bytes, g_bytes, b_bytes,
+ total_bytes, cx, cy, byte_limit));
+ return 0;
+ }
max_bytes = cx * cy * 3;
+ if (total_bytes > max_bytes)
+ {
+ /* raw is better */
+ LLOGLN(10, ("xrdp_bitmap32_compress: too big, rgb "
+ "bytes %d %d %d total_bytes %d cx %d cy %d "
+ "max_bytes %d", r_bytes, g_bytes, b_bytes,
+ total_bytes, cx, cy, max_bytes));
+ init_stream(s, 0);
+ foutraw3(s, cx * cy, FLAGS_NOALPHA, sr_data, sg_data, sb_data);
+ }
}
else
{
- fdelta(alpha_data, cx, cy);
- fdelta(red_data, cx, cy);
- fdelta(green_data, cx, cy);
- fdelta(blue_data, cx, cy);
- alpha_bytes = fpack(alpha_data, cx, cy, s);
- red_bytes = fpack(red_data, cx, cy, s);
- green_bytes = fpack(green_data, cx, cy, s);
- blue_bytes = fpack(blue_data, cx, cy, s);
- max_bytes = cx * cy * 4;
- }
- if (alpha_bytes + red_bytes + green_bytes + blue_bytes > max_bytes)
- {
- LLOGLN(10, ("xrdp_bitmap32_compress: too big, argb "
- "bytes %d %d %d %d cx %d cy %d", alpha_bytes, red_bytes,
- green_bytes, blue_bytes, cx, cy));
+ foutraw3(s, cx * cy, FLAGS_NOALPHA, sr_data, sg_data, sb_data);
}
}
else
{
- out_uint8(s, header);
- red_bytes = cx * cy;
- green_bytes = cx * cy;
- blue_bytes = cx * cy;
- if (header & FLAGS_NOALPHA)
+ cy = fsplit4(in_data, start_line, width, e,
+ sa_data, sr_data, sg_data, sb_data);
+ if (header & FLAGS_RLE)
{
- out_uint8a(s, red_data, red_bytes);
- out_uint8a(s, green_data, green_bytes);
- out_uint8a(s, blue_data, blue_bytes);
+ fdelta(sa_data, a_data, cx, cy);
+ fdelta(sr_data, r_data, cx, cy);
+ fdelta(sg_data, g_data, cx, cy);
+ fdelta(sb_data, b_data, cx, cy);
+ out_uint8(s, header);
+ a_bytes = fpack(a_data, cx, cy, s);
+ r_bytes = fpack(r_data, cx, cy, s);
+ g_bytes = fpack(g_data, cx, cy, s);
+ b_bytes = fpack(b_data, cx, cy, s);
+ max_bytes = cx * cy * 4;
+ total_bytes = a_bytes + r_bytes + g_bytes + b_bytes;
+ if (1 + total_bytes > byte_limit)
+ {
+ /* failed */
+ LLOGLN(0, ("xrdp_bitmap32_compress: too big, argb "
+ "bytes %d %d %d %d total_bytes %d cx %d cy %d "
+ "byte_limit %d", a_bytes, r_bytes, g_bytes, b_bytes,
+ total_bytes, cx, cy, byte_limit));
+ return 0;
+ }
+ if (total_bytes > max_bytes)
+ {
+ /* raw is better */
+ LLOGLN(10, ("xrdp_bitmap32_compress: too big, argb "
+ "bytes %d %d %d %d total_bytes %d cx %d cy %d "
+ "max_bytes %d", a_bytes, r_bytes, g_bytes, b_bytes,
+ total_bytes, cx, cy, max_bytes));
+ init_stream(s, 0);
+ foutraw4(s, cx * cy, 0, sa_data, sr_data, sg_data, sb_data);
+ }
}
else
{
- alpha_bytes = cx * cy;
- out_uint8a(s, alpha_data, alpha_bytes);
- out_uint8a(s, red_data, red_bytes);
- out_uint8a(s, green_data, green_bytes);
- out_uint8a(s, blue_data, blue_bytes);
+ foutraw4(s, cx * cy, 0, sa_data, sr_data, sg_data, sb_data);
}
- /* pad if no RLE */
- out_uint8(s, 0x00);
}
-
return cy;
}
diff --git a/libxrdp/xrdp_mcs.c b/libxrdp/xrdp_mcs.c
index ba5ea73e..c1b0b908 100644
--- a/libxrdp/xrdp_mcs.c
+++ b/libxrdp/xrdp_mcs.c
@@ -718,7 +718,7 @@ xrdp_mcs_send_connect_response(struct xrdp_mcs *self)
DEBUG((" in xrdp_mcs_send_connect_response"));
make_stream(s);
init_stream(s, 8192);
- data_len = self->server_mcs_data->end - self->server_mcs_data->data;
+ data_len = (int) (self->server_mcs_data->end - self->server_mcs_data->data);
xrdp_iso_init(self->iso_layer, s);
xrdp_mcs_ber_out_header(self, s, MCS_CONNECT_RESPONSE, data_len + 38);
xrdp_mcs_ber_out_header(self, s, BER_TAG_RESULT, 1);
diff --git a/libxrdp/xrdp_orders.c b/libxrdp/xrdp_orders.c
index 1412386e..51eac9ca 100644
--- a/libxrdp/xrdp_orders.c
+++ b/libxrdp/xrdp_orders.c
@@ -55,6 +55,8 @@ xrdp_orders_create(struct xrdp_session *session, struct xrdp_rdp *rdp_layer)
{
self->rfx_min_pixel = 64 * 32;
}
+ make_stream(self->s);
+ make_stream(self->temp_s);
return self;
}
@@ -68,6 +70,8 @@ xrdp_orders_delete(struct xrdp_orders *self)
}
xrdp_jpeg_deinit(self->jpeg_han);
free_stream(self->out_s);
+ free_stream(self->s);
+ free_stream(self->temp_s);
g_free(self->orders_state.text_data);
g_free(self);
}
@@ -2321,16 +2325,17 @@ xrdp_orders_send_bitmap(struct xrdp_orders *self,
e = 4 - e;
}
- make_stream(s);
- init_stream(s, 16384);
- make_stream(temp_s);
- init_stream(temp_s, 16384);
+ s = self->s;
+ init_stream(s, 16384 * 2);
+ temp_s = self->temp_s;
+ init_stream(temp_s, 16384 * 2);
p = s->p;
i = height;
if (bpp > 24)
{
- lines_sending = xrdp_bitmap32_compress(data, width, height, s, bpp, 16384,
- i - 1, temp_s, e);
+ lines_sending = xrdp_bitmap32_compress(data, width, height, s,
+ bpp, 16384,
+ i - 1, temp_s, e, 0x30);
}
else
{
@@ -2340,8 +2345,6 @@ xrdp_orders_send_bitmap(struct xrdp_orders *self,
if (lines_sending != height)
{
- free_stream(s);
- free_stream(temp_s);
g_writeln("error in xrdp_orders_send_bitmap, lines_sending(%d) != \
height(%d)", lines_sending, height);
return 1;
@@ -2389,8 +2392,6 @@ height(%d)", lines_sending, height);
}
out_uint8a(self->out_s, s->data, bufsize);
- free_stream(s);
- free_stream(temp_s);
return 0;
}
@@ -2589,16 +2590,17 @@ xrdp_orders_send_bitmap2(struct xrdp_orders *self,
e = 4 - e;
}
- make_stream(s);
- init_stream(s, 16384);
- make_stream(temp_s);
- init_stream(temp_s, 16384);
+ s = self->s;
+ init_stream(s, 16384 * 2);
+ temp_s = self->temp_s;
+ init_stream(temp_s, 16384 * 2);
p = s->p;
i = height;
if (bpp > 24)
{
- lines_sending = xrdp_bitmap32_compress(data, width, height, s, bpp, 16384,
- i - 1, temp_s, e);
+ lines_sending = xrdp_bitmap32_compress(data, width, height, s,
+ bpp, 16384,
+ i - 1, temp_s, e, 0x30);
}
else
{
@@ -2608,8 +2610,6 @@ xrdp_orders_send_bitmap2(struct xrdp_orders *self,
if (lines_sending != height)
{
- free_stream(s);
- free_stream(temp_s);
g_writeln("error in xrdp_orders_send_bitmap2, lines_sending(%d) != \
height(%d)", lines_sending, height);
return 1;
@@ -2638,8 +2638,6 @@ height(%d)", lines_sending, height);
i = cache_idx & 0xff;
out_uint8(self->out_s, i);
out_uint8a(self->out_s, s->data, bufsize);
- free_stream(s);
- free_stream(temp_s);
return 0;
}
diff --git a/libxrdp/xrdp_rdp.c b/libxrdp/xrdp_rdp.c
index e6a2f622..5ece71d4 100644
--- a/libxrdp/xrdp_rdp.c
+++ b/libxrdp/xrdp_rdp.c
@@ -551,14 +551,22 @@ xrdp_rdp_send_fastpath(struct xrdp_rdp *self, struct stream *s,
int updateCode;
int fragmentation;
int compression;
- int ctype;
- int len;
+ int comp_type;
+ int comp_len;
+ int no_comp_len;
+ int send_len;
int cont;
int header_bytes;
int sec_bytes;
- struct stream ls;
+ int to_comp_len;
+ int sec_offset;
+ int rdp_offset;
+ struct stream frag_s;
+ struct stream comp_s;
+ struct stream *send_s;
char *holdp;
char *holdend;
+ struct xrdp_mppc_enc *mppc_enc;
LLOGLN(10, ("xrdp_rdp_send_fastpath:"));
s_pop_layer(s, rdp_hdr);
@@ -575,14 +583,18 @@ xrdp_rdp_send_fastpath(struct xrdp_rdp *self, struct stream *s,
}
sec_bytes = xrdp_sec_get_fastpath_bytes(self->sec_layer);
fragmentation = 0;
- ls = *s;
+ frag_s = *s;
+ sec_offset = (int)(frag_s.sec_hdr - frag_s.data);
+ rdp_offset = (int)(frag_s.rdp_hdr - frag_s.data);
cont = 1;
while (cont)
{
- len = (int)(ls.end - ls.p);
- if (len > FASTPATH_FRAG_SIZE)
+ comp_type = 0;
+ send_s = &frag_s;
+ no_comp_len = (int)(frag_s.end - frag_s.p);
+ if (no_comp_len > FASTPATH_FRAG_SIZE)
{
- len = FASTPATH_FRAG_SIZE;
+ no_comp_len = FASTPATH_FRAG_SIZE;
if (fragmentation == 0)
{
fragmentation = 2; /* FASTPATH_FRAGMENT_FIRST */
@@ -599,34 +611,64 @@ xrdp_rdp_send_fastpath(struct xrdp_rdp *self, struct stream *s,
fragmentation = 1; /* FASTPATH_FRAGMENT_LAST */
}
}
- LLOGLN(10, ("xrdp_rdp_send_fastpath: len %d fragmentation %d",
- len, fragmentation));
+ send_len = no_comp_len;
+ LLOGLN(10, ("xrdp_rdp_send_fastpath: no_comp_len %d fragmentation %d",
+ no_comp_len, fragmentation));
+ if (compression != 0)
+ {
+ to_comp_len = no_comp_len - header_bytes;
+ mppc_enc = self->mppc_enc;
+ if (compress_rdp(mppc_enc, (tui8 *)(frag_s.p + header_bytes),
+ to_comp_len))
+ {
+ comp_len = mppc_enc->bytes_in_opb + header_bytes;
+ LLOGLN(10, ("xrdp_rdp_send_fastpath: no_comp_len %d "
+ "comp_len %d", no_comp_len, comp_len));
+ send_len = comp_len;
+ comp_type = mppc_enc->flags;
+ /* outputBuffer has 64 bytes preceding it */
+ g_memset(&comp_s, 0, sizeof(comp_s));
+ comp_s.data = mppc_enc->outputBuffer -
+ (rdp_offset + header_bytes);
+ comp_s.p = comp_s.data + rdp_offset;
+ comp_s.end = comp_s.p + send_len;
+ comp_s.size = send_len;
+ comp_s.sec_hdr = comp_s.data + sec_offset;
+ comp_s.rdp_hdr = comp_s.data + rdp_offset;
+ send_s = &comp_s;
+ }
+ else
+ {
+ LLOGLN(0, ("xrdp_rdp_send_fastpath: mppc_encode not ok "
+ "type %d flags %d", mppc_enc->protocol_type,
+ mppc_enc->flags));
+ return 1;
+ }
+ }
+ holdp = frag_s.p;
+ holdend = frag_s.end;
updateHeader = (updateCode & 15) |
((fragmentation & 3) << 4) |
((compression & 3) << 6);
- out_uint8(&ls, updateHeader);
+ out_uint8(send_s, updateHeader);
if (compression != 0)
{
- /* TODO: */
- ctype = 0;
- out_uint8(&ls, ctype);
+ out_uint8(send_s, comp_type);
}
- len -= header_bytes;
- out_uint16_le(&ls, len);
- holdp = ls.p;
- holdend = ls.end;
- ls.end = ls.p + len;
- if (xrdp_sec_send_fastpath(self->sec_layer, &ls) != 0)
+ send_len -= header_bytes;
+ out_uint16_le(send_s, send_len);
+ send_s->end = send_s->p + send_len;
+ if (xrdp_sec_send_fastpath(self->sec_layer, send_s) != 0)
{
LLOGLN(0, ("xrdp_rdp_send_fastpath: xrdp_fastpath_send failed"));
return 1;
}
- ls.p = holdp + len;
- ls.end = holdend;
- cont = ls.p < ls.end;
- ls.p -= header_bytes;
- ls.sec_hdr = ls.p - sec_bytes;
- ls.data = ls.sec_hdr;
+ frag_s.p = holdp + no_comp_len;
+ frag_s.end = holdend;
+ cont = frag_s.p < frag_s.end;
+ frag_s.p -= header_bytes;
+ frag_s.sec_hdr = frag_s.p - sec_bytes;
+ frag_s.data = frag_s.sec_hdr;
}
return 0;
}
diff --git a/libxrdp/xrdp_sec.c b/libxrdp/xrdp_sec.c
index 8f46ba3d..d726f3e8 100644
--- a/libxrdp/xrdp_sec.c
+++ b/libxrdp/xrdp_sec.c
@@ -26,6 +26,8 @@
do { if (_level < LOG_LEVEL) { g_write _args ; } } while (0)
#define LLOGLN(_level, _args) \
do { if (_level < LOG_LEVEL) { g_writeln _args ; } } while (0)
+#define LHEXDUMP(_level, _args) \
+ do { if (_level < LOG_LEVEL) { g_hexdump _args ; } } while (0)
/* some compilers need unsigned char to avoid warnings */
static tui8 g_pad_54[40] =
@@ -269,8 +271,9 @@ xrdp_sec_create(struct xrdp_rdp *owner, struct trans *trans, int crypt_level,
}
self->encrypt_rc4_info = ssl_rc4_info_create();
- self->mcs_layer = xrdp_mcs_create(self, trans, &self->client_mcs_data,
- &self->server_mcs_data);
+ self->mcs_layer = xrdp_mcs_create(self, trans,
+ &(self->client_mcs_data),
+ &(self->server_mcs_data));
self->fastpath_layer = xrdp_fastpath_create(self, trans);
self->chan_layer = xrdp_channel_create(self, self->mcs_layer);
DEBUG((" out xrdp_sec_create"));
@@ -768,9 +771,12 @@ xrdp_sec_send_media_lic_response(struct xrdp_sec *self)
/*****************************************************************************/
static void APP_CC
-xrdp_sec_rsa_op(char *out, char *in, char *mod, char *exp)
+xrdp_sec_rsa_op(struct xrdp_sec *self, char *out, char *in, int in_bytes,
+ char *mod, char *exp)
{
- ssl_mod_exp(out, 64, in, 64, mod, 64, exp, 64);
+ ssl_mod_exp(out, self->rsa_key_bytes, in, in_bytes,
+ mod, self->rsa_key_bytes,
+ exp, self->rsa_key_bytes);
}
/*****************************************************************************/
@@ -1073,14 +1079,26 @@ xrdp_sec_recv(struct xrdp_sec *self, struct stream *s, int *chan)
if (flags & SEC_CLIENT_RANDOM) /* 0x01 */
{
- if (!s_check_rem(s, 4 + 64))
+ if (!s_check_rem(s, 4))
{
return 1;
}
in_uint32_le(s, len);
- in_uint8a(s, self->client_crypt_random, 64);
- xrdp_sec_rsa_op(self->client_random, self->client_crypt_random,
- self->pub_mod, self->pri_exp);
+ /* 512, 2048 bit */
+ if ((len != 64 + 8) && (len != 256 + 8))
+ {
+ return 1;
+ }
+ if (!s_check_rem(s, len - 8))
+ {
+ return 1;
+ }
+ in_uint8a(s, self->client_crypt_random, len - 8);
+ xrdp_sec_rsa_op(self, self->client_random, self->client_crypt_random,
+ len - 8, self->pub_mod, self->pri_exp);
+ LLOGLN(10, ("xrdp_sec_recv: client random - len %d", len));
+ LHEXDUMP(10, (self->client_random, 256));
+ LHEXDUMP(10, (self->client_crypt_random, len - 8));
if (self->crypt_level == CRYPT_LEVEL_FIPS)
{
xrdp_sec_fips_establish_keys(self);
@@ -1805,11 +1823,14 @@ xrdp_sec_out_mcs_data(struct xrdp_sec *self)
int num_channels;
int index;
int channel;
+ int gcc_size;
+ char* gcc_size_ptr;
+ char* ud_ptr;
num_channels = self->mcs_layer->channel_list->count;
num_channels_even = num_channels + (num_channels & 1);
- s = &self->server_mcs_data;
- init_stream(s, 512);
+ s = &(self->server_mcs_data);
+ init_stream(s, 8192);
out_uint16_be(s, 5);
out_uint16_be(s, 0x14);
out_uint8(s, 0x7c);
@@ -1827,14 +1848,11 @@ xrdp_sec_out_mcs_data(struct xrdp_sec *self)
out_uint8(s, 0x63); /* c */
out_uint8(s, 0x44); /* D */
out_uint8(s, 0x6e); /* n */
- if (self->mcs_layer->iso_layer->selectedProtocol != -1)
- { // Check for RDPNEGDATA availability
- out_uint16_be(s, 0x80fc + (num_channels_even * 2) + 4);
- }
- else
- {
- out_uint16_be(s, 0x80fc + (num_channels_even * 2));
- }
+ /* GCC Response Total Length - 2 bytes , set later */
+ gcc_size_ptr = s->p; /* RDPGCCUserDataResponseLength */
+ out_uint8s(s, 2);
+ ud_ptr = s->p; /* User Data */
+
out_uint16_le(s, SEC_TAG_SRV_INFO);
if (self->mcs_layer->iso_layer->selectedProtocol != -1)
{
@@ -1848,9 +1866,9 @@ xrdp_sec_out_mcs_data(struct xrdp_sec *self)
out_uint8(s, 0);
out_uint8(s, 8);
out_uint8(s, 0);
- if (self->mcs_layer->iso_layer->selectedProtocol != -1)
+ if (self->mcs_layer->iso_layer->selectedProtocol != -1)
{
- /* clientReqeustedProtocol */
+ /* ReqeustedProtocol */
out_uint32_le(s, self->mcs_layer->iso_layer->selectedProtocol);
}
out_uint16_le(s, SEC_TAG_SRV_CHANNELS);
@@ -1871,34 +1889,77 @@ xrdp_sec_out_mcs_data(struct xrdp_sec *self)
}
}
- out_uint16_le(s, SEC_TAG_SRV_CRYPT);
- out_uint16_le(s, 0x00ec); /* len is 236 */
- out_uint32_le(s, self->crypt_method);
- out_uint32_le(s, self->crypt_level);
- out_uint32_le(s, 32); /* 32 bytes random len */
- out_uint32_le(s, 0xb8); /* 184 bytes rsa info(certificate) len */
- out_uint8a(s, self->server_random, 32);
- /* here to end is certificate */
- /* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ */
- /* TermService\Parameters\Certificate */
- out_uint32_le(s, 1);
- out_uint32_le(s, 1);
- out_uint32_le(s, 1);
- out_uint16_le(s, SEC_TAG_PUBKEY);
- out_uint16_le(s, 0x005c); /* 92 bytes length of SEC_TAG_PUBKEY */
- out_uint32_le(s, SEC_RSA_MAGIC);
- out_uint32_le(s, 0x48); /* 72 bytes modulus len */
- out_uint32_be(s, 0x00020000);
- out_uint32_be(s, 0x3f000000);
- out_uint8a(s, self->pub_exp, 4); /* pub exp */
- out_uint8a(s, self->pub_mod, 64); /* pub mod */
- out_uint8s(s, 8); /* pad */
- out_uint16_le(s, SEC_TAG_KEYSIG);
- out_uint16_le(s, 72); /* len */
- out_uint8a(s, self->pub_sig, 64); /* pub sig */
- out_uint8s(s, 8); /* pad */
+ if (self->rsa_key_bytes == 64)
+ {
+ g_writeln("xrdp_sec_out_mcs_data: using 512 bit RSA key");
+ out_uint16_le(s, SEC_TAG_SRV_CRYPT);
+ out_uint16_le(s, 0x00ec); /* len is 236 */
+ out_uint32_le(s, self->crypt_method);
+ out_uint32_le(s, self->crypt_level);
+ out_uint32_le(s, 32); /* 32 bytes random len */
+ out_uint32_le(s, 0xb8); /* 184 bytes rsa info(certificate) len */
+ out_uint8a(s, self->server_random, 32);
+ /* here to end is certificate */
+ /* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ */
+ /* TermService\Parameters\Certificate */
+ out_uint32_le(s, 1);
+ out_uint32_le(s, 1);
+ out_uint32_le(s, 1);
+ out_uint16_le(s, SEC_TAG_PUBKEY); /* 0x0006 */
+ out_uint16_le(s, 0x005c); /* 92 bytes length of SEC_TAG_PUBKEY */
+ out_uint32_le(s, SEC_RSA_MAGIC); /* 0x31415352 'RSA1' */
+ out_uint32_le(s, 0x0048); /* 72 bytes modulus len */
+ out_uint32_be(s, 0x00020000); /* bit len */
+ out_uint32_be(s, 0x3f000000); /* data len */
+ out_uint8a(s, self->pub_exp, 4); /* pub exp */
+ out_uint8a(s, self->pub_mod, 64); /* pub mod */
+ out_uint8s(s, 8); /* pad */
+ out_uint16_le(s, SEC_TAG_KEYSIG); /* 0x0008 */
+ out_uint16_le(s, 72); /* len */
+ out_uint8a(s, self->pub_sig, 64); /* pub sig */
+ out_uint8s(s, 8); /* pad */
+ }
+ else if (self->rsa_key_bytes == 256)
+ {
+ g_writeln("xrdp_sec_out_mcs_data: using 2048 bit RSA key");
+ out_uint16_le(s, SEC_TAG_SRV_CRYPT);
+ out_uint16_le(s, 0x01ac); /* len is 428 */
+ out_uint32_le(s, self->crypt_method);
+ out_uint32_le(s, self->crypt_level);
+ out_uint32_le(s, 32); /* 32 bytes random len */
+ out_uint32_le(s, 0x178); /* 376 bytes rsa info(certificate) len */
+ out_uint8a(s, self->server_random, 32);
+ /* here to end is certificate */
+ /* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ */
+ /* TermService\Parameters\Certificate */
+ out_uint32_le(s, 1);
+ out_uint32_le(s, 1);
+ out_uint32_le(s, 1);
+ out_uint16_le(s, SEC_TAG_PUBKEY); /* 0x0006 */
+ out_uint16_le(s, 0x011c); /* 284 bytes length of SEC_TAG_PUBKEY */
+ out_uint32_le(s, SEC_RSA_MAGIC); /* 0x31415352 'RSA1' */
+ out_uint32_le(s, 0x0108); /* 264 bytes modulus len */
+ out_uint32_be(s, 0x00080000); /* bit len */
+ out_uint32_be(s, 0xff000000); /* data len */
+ out_uint8a(s, self->pub_exp, 4); /* pub exp */
+ out_uint8a(s, self->pub_mod, 256); /* pub mod */
+ out_uint8s(s, 8); /* pad */
+ out_uint16_le(s, SEC_TAG_KEYSIG); /* 0x0008 */
+ out_uint16_le(s, 72); /* len */
+ out_uint8a(s, self->pub_sig, 64); /* pub sig */
+ out_uint8s(s, 8); /* pad */
+ }
+ else
+ {
+ LLOGLN(0, ("xrdp_sec_out_mcs_data: error"));
+ }
/* end certificate */
s_mark_end(s);
+
+ gcc_size = (int)(s->end - ud_ptr) | 0x8000;
+ gcc_size_ptr[0] = gcc_size >> 8;
+ gcc_size_ptr[1] = gcc_size;
+
return 0;
}
@@ -1976,7 +2037,6 @@ xrdp_sec_incoming(struct xrdp_sec *self)
char *value = NULL;
char key_file[256];
- LLOGLN(10, ("xrdp_sec_incoming:"));
g_memset(key_file, 0, sizeof(char) * 256);
DEBUG((" in xrdp_sec_incoming"));
g_random(self->server_random, 32);
@@ -2000,14 +2060,16 @@ xrdp_sec_incoming(struct xrdp_sec *self)
{
item = (char *)list_get_item(items, index);
value = (char *)list_get_item(values, index);
-
+
if (g_strcasecmp(item, "pub_exp") == 0)
{
hex_str_to_bin(value, self->pub_exp, 4);
}
else if (g_strcasecmp(item, "pub_mod") == 0)
{
- hex_str_to_bin(value, self->pub_mod, 64);
+ self->rsa_key_bytes = (g_strlen(value) + 1) / 5;
+ g_writeln("pub_mod bytes %d", self->rsa_key_bytes);
+ hex_str_to_bin(value, self->pub_mod, self->rsa_key_bytes);
}
else if (g_strcasecmp(item, "pub_sig") == 0)
{
@@ -2015,7 +2077,9 @@ xrdp_sec_incoming(struct xrdp_sec *self)
}
else if (g_strcasecmp(item, "pri_exp") == 0)
{
- hex_str_to_bin(value, self->pri_exp, 64);
+ self->rsa_key_bytes = (g_strlen(value) + 1) / 5;
+ g_writeln("pri_exp %d", self->rsa_key_bytes);
+ hex_str_to_bin(value, self->pri_exp, self->rsa_key_bytes);
}
}
diff --git a/sesman/chansrv/sound.c b/sesman/chansrv/sound.c
index d95d1afa..cc64a558 100644
--- a/sesman/chansrv/sound.c
+++ b/sesman/chansrv/sound.c
@@ -146,6 +146,25 @@ static struct xr_wave_format_ex *g_wave_inp_formats[SND_NUM_INP_FORMATS] =
static int g_client_input_format_index = 0;
static int g_server_input_format_index = 0;
+/* microphone related */
+static int APP_CC
+sound_send_server_input_formats(void);
+static int APP_CC
+sound_process_input_format(int aindex, int wFormatTag,
+ int nChannels, int nSamplesPerSec,
+ int nAvgBytesPerSec, int nBlockAlign,
+ int wBitsPerSample, int cbSize, char *data);
+static int APP_CC
+sound_process_input_formats(struct stream *s, int size);
+static int APP_CC
+sound_input_start_recording(void);
+static int APP_CC
+sound_input_stop_recording(void);
+static int APP_CC
+sound_process_input_data(struct stream *s, int bytes);
+static int DEFAULT_CC
+sound_sndsrvr_source_data_in(struct trans *trans);
+
/*****************************************************************************/
static int APP_CC
sound_send_server_output_formats(void)
@@ -215,7 +234,6 @@ sound_send_server_output_formats(void)
}
/*****************************************************************************/
-
static int
sound_send_training(void)
{
@@ -356,7 +374,7 @@ sound_send_wave_data_chunk(char *data, int data_bytes)
if ((data_bytes < 4) || (data_bytes > 128 * 1024))
{
LOG(0, ("sound_send_wave_data_chunk: bad data_bytes %d", data_bytes));
- return 0;
+ return 1;
}
LOG(20, ("sound_send_wave_data_chunk: g_sent_flag[%d] = %d",
@@ -364,7 +382,7 @@ sound_send_wave_data_chunk(char *data, int data_bytes)
if (g_sent_flag[(g_cBlockNo + 1) & 0xff] & 1)
{
LOG(10, ("sound_send_wave_data_chunk: no room"));
- return 0;
+ return 1;
}
else
{
@@ -423,9 +441,11 @@ sound_send_wave_data(char *data, int data_bytes)
int space_left;
int chunk_bytes;
int data_index;
+ int error;
LOG(10, ("sound_send_wave_data: sending %d bytes", data_bytes));
data_index = 0;
+ error = 0;
while (data_bytes > 0)
{
space_left = BBUF_SIZE - g_buf_index;
@@ -433,19 +453,26 @@ sound_send_wave_data(char *data, int data_bytes)
if (chunk_bytes < 1)
{
LOG(10, ("sound_send_wave_data: error"));
+ error = 1;
break;
}
g_memcpy(g_buffer + g_buf_index, data + data_index, chunk_bytes);
g_buf_index += chunk_bytes;
if (g_buf_index >= BBUF_SIZE)
{
- sound_send_wave_data_chunk(g_buffer, BBUF_SIZE);
+ if (sound_send_wave_data_chunk(g_buffer, BBUF_SIZE) != 0)
+ {
+ LOG(10, ("sound_send_wave_data: error"));
+ error = 1;
+ break;
+ }
g_buf_index = 0;
}
data_bytes -= chunk_bytes;
data_index += chunk_bytes;
}
- return 0;
+
+ return error;
}
/*****************************************************************************/
@@ -460,10 +487,15 @@ sound_send_close(void)
LOG(10, ("sound_send_close:"));
/* send any left over data */
- sound_send_wave_data_chunk(g_buffer, g_buf_index);
+ if (sound_send_wave_data_chunk(g_buffer, g_buf_index) != 0)
+ {
+ LOG(10, ("sound_send_close: sound_send_wave_data_chunk failed"));
+ return 1;
+ }
g_buf_index = 0;
g_memset(g_sent_flag, 0, sizeof(g_sent_flag));
+ /* send close msg */
make_stream(s);
init_stream(s, 8182);
out_uint16_le(s, SNDC_CLOSE);
@@ -516,23 +548,23 @@ sound_process_wave_confirm(struct stream *s, int size)
/*****************************************************************************/
/* process message in from the audio source, eg pulse, alsa
- on it's way to the client */
+ on it's way to the client. returns error */
static int APP_CC
process_pcm_message(int id, int size, struct stream *s)
{
switch (id)
{
case 0:
- sound_send_wave_data(s->p, size);
+ return sound_send_wave_data(s->p, size);
break;
case 1:
- sound_send_close();
+ return sound_send_close();
break;
default:
LOG(10, ("process_pcm_message: unknown id %d", id));
break;
}
- return 0;
+ return 1;
}
/*****************************************************************************/
@@ -793,24 +825,45 @@ sound_get_wait_objs(tbus *objs, int *count, int *timeout)
int APP_CC
sound_check_wait_objs(void)
{
+
if (g_audio_l_trans_out != 0)
{
- trans_check_wait_objs(g_audio_l_trans_out);
+ if (trans_check_wait_objs(g_audio_l_trans_out) != 0)
+ {
+ LOG(10, ("sound_check_wait_objs: g_audio_l_trans_out returned non-zero"));
+ trans_delete(g_audio_l_trans_out);
+ g_audio_l_trans_out = 0;
+ }
}
if (g_audio_c_trans_out != 0)
{
- trans_check_wait_objs(g_audio_c_trans_out);
+ if (trans_check_wait_objs(g_audio_c_trans_out) != 0)
+ {
+ LOG(10, ("sound_check_wait_objs: g_audio_c_trans_out returned non-zero"));
+ trans_delete(g_audio_c_trans_out);
+ g_audio_c_trans_out = 0;
+ }
}
if (g_audio_l_trans_in != 0)
{
- trans_check_wait_objs(g_audio_l_trans_in);
+ if (trans_check_wait_objs(g_audio_l_trans_in) != 0)
+ {
+ LOG(10, ("sound_check_wait_objs: g_audio_l_trans_in returned non-zero"));
+ trans_delete(g_audio_l_trans_in);
+ g_audio_l_trans_in = 0;
+ }
}
if (g_audio_c_trans_in != 0)
{
- trans_check_wait_objs(g_audio_c_trans_in);
+ if (trans_check_wait_objs(g_audio_c_trans_in) != 0)
+ {
+ LOG(10, ("sound_check_wait_objs: g_audio_c_trans_in returned non-zero"));
+ trans_delete(g_audio_c_trans_in);
+ g_audio_c_trans_in = 0;
+ }
}
return 0;
@@ -979,7 +1032,7 @@ sound_process_input_formats(struct stream *s, int size)
*****************************************************************************/
static int APP_CC
-sound_input_start_recording()
+sound_input_start_recording(void)
{
struct stream* s;
@@ -1013,7 +1066,7 @@ sound_input_start_recording()
*****************************************************************************/
static int APP_CC
-sound_input_stop_recording()
+sound_input_stop_recording(void)
{
struct stream* s;
diff --git a/sesman/chansrv/sound.h b/sesman/chansrv/sound.h
index b443f0e3..f3563dab 100644
--- a/sesman/chansrv/sound.h
+++ b/sesman/chansrv/sound.h
@@ -58,17 +58,4 @@ int APP_CC sound_check_wait_objs(void);
int APP_CC sound_data_in(struct stream* s, int chan_id, int chan_flags,
int length, int total_length);
-/* microphone related */
-static int APP_CC sound_send_server_input_formats(void);
-
-static int APP_CC sound_process_input_format(int aindex, int wFormatTag,
- int nChannels, int nSamplesPerSec, int nAvgBytesPerSec,
- int nBlockAlign, int wBitsPerSample, int cbSize, char *data);
-
-static int APP_CC sound_process_input_formats(struct stream *s, int size);
-static int APP_CC sound_input_start_recording();
-static int APP_CC sound_input_stop_recording();
-static int APP_CC sound_process_input_data(struct stream *s, int bytes);
-static int DEFAULT_CC sound_sndsrvr_source_data_in(struct trans *trans);
-
#endif
diff --git a/xorg/server/module/rdpClientCon.c b/xorg/server/module/rdpClientCon.c
index e375b4e2..24870557 100644
--- a/xorg/server/module/rdpClientCon.c
+++ b/xorg/server/module/rdpClientCon.c
@@ -259,6 +259,11 @@ rdpClientConDisconnect(rdpPtr dev, rdpClientCon *clientCon)
}
rdpRegionDestroy(clientCon->dirtyRegion);
rdpRegionDestroy(clientCon->shmRegion);
+ if (clientCon->updateTimer != NULL)
+ {
+ TimerCancel(clientCon->updateTimer);
+ TimerFree(clientCon->updateTimer);
+ }
g_free(clientCon);
return 0;
}
diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c
index 13156ebe..caf55a7d 100644
--- a/xrdp/xrdp_wm.c
+++ b/xrdp/xrdp_wm.c
@@ -259,8 +259,11 @@ xrdp_wm_load_pointer(struct xrdp_wm *self, char *file_name, char *data,
{
if (bpp == 1)
{
- in_uint8a(fs, palette, 8);
-
+ for (i = 0; i < 2; i++)
+ {
+ in_uint32_le(fs, pixel);
+ palette[i] = pixel;
+ }
for (i = 0; i < 32; i++)
{
for (j = 0; j < 32; j++)
@@ -279,8 +282,11 @@ xrdp_wm_load_pointer(struct xrdp_wm *self, char *file_name, char *data,
}
else if (bpp == 4)
{
- in_uint8a(fs, palette, 64);
-
+ for (i = 0; i < 16; i++)
+ {
+ in_uint32_le(fs, pixel);
+ palette[i] = pixel;
+ }
for (i = 0; i < 32; i++)
{
for (j = 0; j < 32; j++)