diff --git a/module-xrdp-source.c b/module-xrdp-source.c index 3d73fd0..37c0bb4 100644 --- a/module-xrdp-source.c +++ b/module-xrdp-source.c @@ -174,6 +174,7 @@ static int data_get(struct userdata *u, pa_memchunk *chunk) { int fd; int bytes; + int read_bytes; struct sockaddr_un s; char *data; char buf[11]; @@ -216,7 +217,12 @@ static int data_get(struct userdata *u, pa_memchunk *chunk) { buf[9] = 0; buf[10] = 0; - lsend(u->fd, buf, 11); + if (lsend(u->fd, buf, 11) != 11) { + close(u->fd); + u->fd = 0; + pa_memblock_release(chunk->memblock); + return -1; + } u->want_src_data = 1; pa_log_debug("###### started recording"); } @@ -234,10 +240,22 @@ static int data_get(struct userdata *u, pa_memchunk *chunk) { buf[9] = (unsigned char) chunk->length; buf[10] = (unsigned char) ((chunk->length >> 8) & 0xff); - lsend(u->fd, buf, 11); + if (lsend(u->fd, buf, 11) != 11) { + close(u->fd); + u->fd = 0; + pa_memblock_release(chunk->memblock); + u->want_src_data = 0; + return -1; + } /* read length of data available */ - lrecv(u->fd, (char *) ubuf, 2); + if (lrecv(u->fd, (char *) ubuf, 2) != 2) { + close(u->fd); + u->fd = 0; + pa_memblock_release(chunk->memblock); + u->want_src_data = 0; + return -1; + } bytes = ((ubuf[1] << 8) & 0xff00) | (ubuf[0] & 0xff); if (bytes == 0) { @@ -246,15 +264,22 @@ static int data_get(struct userdata *u, pa_memchunk *chunk) { } /* get data */ - bytes = lrecv(u->fd, data, bytes); - + read_bytes = lrecv(u->fd, data, bytes); + if (read_bytes != bytes) { + close(u->fd); + u->fd = 0; + pa_memblock_release(chunk->memblock); + u->want_src_data = 0; + return -1; + } pa_memblock_release(chunk->memblock); - return bytes; + return read_bytes; } static void thread_func(void *userdata) { struct userdata *u = userdata; + int bytes; pa_assert(u); pa_thread_mq_install(&u->thread_mq); @@ -271,10 +296,15 @@ static void thread_func(void *userdata) { now = pa_rtclock_now(); if ((chunk.length = pa_usec_to_bytes(now - u->timestamp, &u->source->sample_spec)) > 0) { - chunk.memblock = pa_memblock_new(u->core->mempool, (size_t) -1); /* or chunk.length? */ + chunk.length *= 4; + chunk.memblock = pa_memblock_new(u->core->mempool, chunk.length); chunk.index = 0; - data_get(u, &chunk); - pa_source_post(u->source, &chunk); + bytes = data_get(u, &chunk); + if (bytes > 0) + { + chunk.length = bytes; + pa_source_post(u->source, &chunk); + } pa_memblock_unref(chunk.memblock); u->timestamp = now; } @@ -298,7 +328,10 @@ static void thread_func(void *userdata) { buf[9] = 0; buf[10] = 0; - lsend(u->fd, buf, 11); + if (lsend(u->fd, buf, 11) != 11) { + close(u->fd); + u->fd = 0; + } u->want_src_data = 0; pa_log_debug("###### stopped recording"); } @@ -338,7 +371,7 @@ int pa__init(pa_module *m) { goto fail; } -#if 0 +#if 1 ss = m->core->default_sample_spec; #else ss.format = PA_SAMPLE_S16LE;