summaryrefslogtreecommitdiffstats
path: root/server
Commit message (Collapse)AuthorAgeFilesLines
* Avoid race conditions reading monitor configs from guestFrediano Ziglio2015-09-081-13/+31
| | | | | | | | | | | | | For security reasons do not assume guest do not change structures it pass to Qemu. Guest could change count field while Qemu is copying QXLMonitorsConfig structure leading to heap corruption. This patch avoid it reading count only once. This patch solves CVE-2015-3247. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
* replay: fix formatting stringFrediano Ziglio2015-09-081-1/+1
| | | | | Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
* improve performances comparing image pixelsFrediano Ziglio2015-09-041-21/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | This patch contains a bit of small optimizations. It avoid boolean operations which could involve branches replacing with binary operations (equal/all_ident -> some_differences). The other optimization avoids the use of ABS. First the way the macro was used (with a large expression) was not easy to optimize by the compiler. Then instead of using ABS a much simpler range check is used so instead of (ABS(n) >= k) a ((n) <= -k || (n) >= k) is used. This looks small but modern compilers can translate this not in range check in a couple of machine instructions (and a single compare). Using operf on same samples (using spice-server-replay) and trying 2 runs I got run 1 2 ------------------------- before 104441 106267 after 92387 91083 So the performance increase is about 13%. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
* avoid to call red_get_streams_timout twice computing timeoutFrediano Ziglio2015-09-031-4/+5
| | | | | | | | | | Due to how the MIN macro is defined the function was called twice unless the compiler could demonstrate that was returning the same value (which actually is impossible as function as clock_gettime are not deterministic). Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
* spice_timer_queue: fix access after freeFrediano Ziglio2015-09-031-1/+6
| | | | | | | | | | | | | Do not access to timer after we call the associated function. Some of these callbacks can call spice_timer_remove making the pointer pointing to freed data. This happen for instance when the client is disconnecting. This does not cause memory corruption on current allocator implementations as all freeing/accessing happen on a single thread quite closely and allocators use different pools for different thread. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
* replay: compatibility with former versionFrediano Ziglio2015-09-011-5/+6
| | | | | | GMutex usage in replay.c was not working so replace with plain pthread. Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
* replay: do not define same type twiceFrediano Ziglio2015-09-011-4/+4
| | | | | | | | | | Avoid to use typedef twice for the same type as some compiler complaints about it. SpiceTimer and SpiceWatch are defined in server/spice-core.h as an abstract type which should be defined by some code (as server/tests/basic_event_loop.c does). Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
* build-sys: Add missing header files to _SOURCESChristophe Fergeau2015-09-011-0/+2
| | | | | | | 2 newly-added header files were not added to _SOURCES, breaking make distcheck. Acked-by: Frediano Ziglio <fziglio@redhat.com>
* Remove useless pack attributeMarc-André Lureau2015-09-011-17/+7
| | | | | Acked-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
* server: remove srand(time(NULL))Marc-André Lureau2015-09-011-2/+0
| | | | | | | This is clearly not a library responsability. Acked-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
* server/red_worker: remove redundant spice_warn_if in validate_surfaceAlon Levy2015-09-011-1/+0
| | | | | Acked-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
* server: remove hardcoded RED_MAX_RENDERERSMarc-André Lureau2015-09-013-6/+6
| | | | | Acked-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
* Simplify set_surface_release_infoFrediano Ziglio2015-08-271-14/+5
| | | | | Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
* replay: fix typo in messageFrediano Ziglio2015-08-271-1/+1
| | | | | Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
* Avoid core calling spice_server_destroyFrediano Ziglio2015-08-261-2/+5
| | | | | | | | | spice_server_destroy calls reds_exit which is called also at exit time (is registered with atexit) so avoid to keep dangling pointers. Currently this does not happen as spice_server_destroy is not called by Qemu. Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
* prevent integer overflow on 32 bitFrediano Ziglio2015-08-261-1/+1
| | | | | | | | | | | On 32 bit machine timespec->tv_sec (time_t) is 32 bit. Also 1000 * 1000 * 1000 is 32 bit. The multiplication of 2 32 bit integers gives a 32 bit integer, however this can overflow. Converting the first factor to 64 bit before the multiplication solves the issue. Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
* remove unused SAME_PIXEL macroFrediano Ziglio2015-08-261-3/+0
| | | | Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
* build-sys: Remove test_spice_version.hChristophe Fergeau2015-08-262-45/+0
| | | | | | | This script was used at make distcheck time to verify consistency of the version number defined in configure.ac and in spice-server headers. Since commit ab12cf414c, these 2 version numbers can no longer be out of sync, so we can drop this script.
* server: Readd spice-experimental.hChristophe Fergeau2015-08-262-0/+7
| | | | | | | | | | | | | | Commit 3c6b4e41 removed spice-experimental.h as this header was not used, nor supposed to be used. However, QEMU had been including it (without using any of its symbols) until commit v2.3.0-rc0~135^2~1 As this is fairly recent (Nov 2014), building older QEMUs with new spice-server releases, or even bisecting QEMU will be broken as they will be looking for a no-longer available header. This commit readds a spice-experimental.h file, however it only contains a #warning indicating this file is deprecated. This means older QEMU will build now, but only if they were configured with --disable-werror.
* remove wrong statement terminator from preprocessor macroFrediano Ziglio2015-08-251-1/+1
| | | | | | | | Actually not causing problems as when used is always followed by another terminator but better to fix the definition. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Pavel Grunt <pgrunt@redhat.com>
* Use MAX macro to compute the maximum valueFrediano Ziglio2015-08-251-1/+1
| | | | Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
* replay: use plain pthread for mutex/conditionFrediano Ziglio2015-08-251-15/+15
| | | | | | | | Mutex/conditional require Glib 2.32 which is not available in RHEL6. Use plain pthread to make this module compatible with RHEL6. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Fabiano Fidencio <ffidenci@redhat.com>
* replay: fix check for QXL_SURF_FLAG_KEEP_DATA flagFrediano Ziglio2015-08-252-2/+2
| | | | | | | | A logical and (&&) was used instead of a bit one (&). Was working just as is the only flag defined. Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Fabiano Fidencio <ffidenci@redhat.com>
* worker: remove unused members from DrawableFrediano Ziglio2015-08-241-3/+0
| | | | | Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
* server/tests/spice-server-replay: introduceAlon Levy2015-08-222-0/+355
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | usage: spice-server-replay -p <port> -c <client command line> <cmdfile> will run the commands from cmdfile ignoring timestamps, right after a connection is established from the client, and will SIGINT the client on end of cmdfile, and exit itself after waiting for the client. spicy-stats from spice-gtk is useful for testing, it prints the summary of the traffic on each channel. You can also run with no client by doing: spice-server-replay <cmdfile> For example, the 300 MB file (compressed to 4 MB with xz -9) available at [1] produces the following output: spicy-stats total bytes read: total bytes read: inputs: 214 display: 1968983 cursor: 390 main: 256373 You could run it directly like so: curl http://annarchy.freedesktop.org/~alon/win7_boot_shutdown.cmd.xz | \ xzcat | server/tests/spice-server-replay -p 12345 -c `which spicy-stats` - Known Problems: * Implementation is wrong. Should do a single device->host conversion (i.e. get_virt), and then marshall/demarshall that (i.e. RedDrawable). * segfault on file read done resulting in the above spicy-stats not being reproducable (well, up to 1% yes). [1] http://annarchy.freedesktop.org/~alon/win7_boot_shutdown.cmd.xz Now based on glib including using an asyncqueue for reading the playback file, and proper freeing of the allocated commands, with --slow, --compression and a progress timer, and doesn't use more then nsurfaces. Signed-off-by: Alon Levy <alon@pobox.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
* server/red_worker: record to SPICE_WORKER_RECORD_FILENAMEAlon Levy2015-08-211-3/+37
| | | | | | | | | | | | | | | | | | if the environment variable in the title is set and can be opened for writing a log of all display commands (no cursor commands yet) and any QXLWorker calls (particularily primary create and destroy) will be logged to that file, and possible to replay using the replay utility introduced later. For an example file (4 MB download, 300 MB after unpack with xz, these 300 MB are themselves reduced from 1.2GB using zlib compression for any chunk): (old file without a header) http://annarchy.freedesktop.org/~alon/win7_boot_shutdown.cmd.xz Signed-off-by: Alon Levy <alon@pobox.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
* server/red_{record, replay}.[ch]: introduceAlon Levy2015-08-216-0/+2144
| | | | | | | | | | | | | | | | | | | Currently hand crafted with some sed scripts and alot of vim macros from red_parse_qxl after considering the logger in qemu/hw/qxl-logger.c and seeing it was incomplete. The only problem with logging from the server and not from qemu is that it requires coordinated shutdown to avoid half a message. Should be automatically generated from a declarative syntax, i.e. qxl.proto. Note: zlib compression is introduced in a disabled state, see ZLIB define Now with a simple versioned header and generated ids by the server instead of based on the recorded file, and doesn't use more then 1024 surfaces (configurable). Signed-off-by: Alon Levy <alon@pobox.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
* server/dispatcher: add extra_dispatcher, hack for red_recordAlon Levy2015-08-202-0/+22
| | | | Signed-off-by: Alon Levy <alon@pobox.com>
* tests: use glib main loopMarc-André Lureau2015-08-202-190/+97
|
* Remove use of INLINEAlon Levy2015-08-205-20/+18
| | | | It's #define'd to 'inline', and only used in the GLZ encoder.
* build-sys: Remove spice-protocol submoduleChristophe Fergeau2015-08-202-0/+2
| | | | | It's seeing regular releases and is API stable, so we don't need to bundle it with spice-server
* mjpeg and jpeg encoder: fix alignment warningsVictor Toso2015-08-202-12/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As the input line could be uint8_t*, uint16_t* or uint32_t*, changing the default from uint8_t* to void* seems the correct choice to deal with upcasting warnings. Regarding chunks->data allocation, I quote Frediano explantion: "Lines came from spice_bitmap_get_line. This function assume that bitmap data is split among chunks each containing some lines (always full lines). If chunk->data is allocated using malloc or similar SHOULD (not 100% sure) be 4 bytes aligned so in our cases (8, 16, 24 or 32 bit images) should be aligned enough. All the casts unfortunately came from the fact we compute based on pixel bytes to make it generic so we use uint8_t*." and "Looking at code looks like these chunks came from the virtual machine. So the question is... why should the virtual machine give use some not-pixel align data? I would put a large comment to state that we assume VM send aligned data, would be stupid for the VM to not align it!" clang output: jpeg_encoder.c:109:26: error: cast from 'uint8_t *' (aka 'unsigned char *') to 'uint16_t *' (aka 'unsigned short *') increases required alignment from 1 to 2 [-Werror,-Wcast-align] uint16_t *src_line = (uint16_t *)line; ^~~~~~~~~~~~~~~~ jpeg_encoder.c:144:26: error: cast from 'uint8_t *' (aka 'unsigned char *') to 'uint32_t *' (aka 'unsigned int *') increases required alignment from 1 to 4 [-Werror,-Wcast-align] uint32_t *src_line = (uint32_t *)line; ^~~~~~~~~~~~~~~~ mjpeg_encoder.c:260:23: error: cast from 'uint8_t *' (aka 'unsigned char *') to 'uint16_t *' (aka 'unsigned short *') increases required alignment from 1 to 2 [-Werror,-Wcast-align] uint16_t pixel = *(uint16_t *)src; ^~~~~~~~~~~~~~~
* glz: WindowImageSegment lines lines_end as void*Victor Toso2015-08-201-2/+2
| | | | | | | | | | | Instead of using uint8_t* which can cause several warnings on casting as the example below: ./glz_encode_tmpl.c:321:29: error: cast from 'uint8_t *' (aka 'unsigned char *') to 'rgb16_pixel_t *' (aka 'unsigned short *') increases required alignment from 1 to 2 [-Werror,-Wcast-align] ref_limit = (PIXEL *)(seg->lines_end); ^~~~~~~~~~~~~~~~~~~~~~~~~
* migration_protocol: use SPICE_MAGIC_CONSTVictor Toso2015-08-201-5/+6
| | | | | spice-protocol has a new define to create the magic constants, let's use that.
* red_parse_qxl: Do not compute abs unsigned intVictor Toso2015-08-121-1/+1
| | | | | | | | | | | SpiceBitmap's stride is uint32_t. from clang: red_parse_qxl.c:452:41: error: taking the absolute value of unsigned type 'uint32_t' (aka 'unsigned int') has no effect bitmap_size = red->u.bitmap.y * abs(red->u.bitmap.stride); ^
* server/inputs_channel: Cope with NULL keyboard in release_keys()Alon Levy2015-08-121-1/+6
| | | | | This fixes a test_display_no_ssl segfault on client disconnect when the keyboard was never initialized.
* red_parse_qxl: remove unused variableVictor Toso2015-08-111-4/+0
|
* Remove unused struct RedsOutItemJonathon Jongsma2015-08-111-5/+0
|
* RedChannel: remove unused BufDescriptor structJonathon Jongsma2015-08-111-5/+0
|
* Remove unused snd_get_playback_compression() methodChristophe Fergeau2015-08-112-6/+0
|
* Fix typo in comment in char_device.hChristophe Fergeau2015-08-111-1/+1
|
* Fix typo in commentsJonathon Jongsma2015-08-111-2/+2
|
* Move RedsMigSpice to main-channel.hJonathon Jongsma2015-08-112-8/+8
| | | | | This is the place that needs the complete type definition. If it is defined in reds.h, it can create circular references.
* Cleanup: move static function declarations out of headerJonathon Jongsma2015-08-112-4/+4
| | | | | It doesn't make much sense to have static function declarations in a header, even a private header. So move them down into the source file.
* worker: remove unused preload_group_idMarc-André Lureau2015-08-111-4/+0
|
* channel: minor simplificationMarc-André Lureau2015-08-111-6/+1
|
* server: remove unused CursorDataMarc-André Lureau2015-08-111-9/+0
|
* server: use more const CoreInterfaceMarc-André Lureau2015-08-112-5/+5
|
* worker: move red_init_*() functionsMarc-André Lureau2015-08-111-8/+10
| | | | | | There is a red_init() methods, we can group all the red_init_*() calls in it rather than calling red_init() followed by all these calls in our main function.
* Adjust to new SpiceImageCompress nameChristophe Fergeau2015-07-2910-57/+65
| | | | | | | | This has been renamed to SpiceImageCompression in order to avoid clashes with older spice-server in the SPICE_IMAGE_COMPRESS_ namespace. This commit is a straight rename of SpiceImageCompress to SpiceImageCompression and SPICE_IMAGE_COMPRESS_ to SPICE_IMAGE_COMPRESSION_