Commit Graph

1143 Commits

Author SHA1 Message Date
Uri Lublin
2d1c00a659 migration: Don't assert() if MIGRATE_DATA comes before attaching the agent
During seamless migration, after switching host, if a client was connected
during the migration, it will have data to send back to the new
qemu/spice-server instance. This is handled through MIGRATE_DATA messages.
SPICE char devices use such MIGRATE_DATA messages to restore their state.

However, the MIGRATE_DATA message can arrive any time after the new qemu
instance has started, this can happen before or after the SPICE char
devices have been created. In order to handle this, if the migrate data
arrives early, it's stored in reds->agent_state.mig_data, and
attach_to_red_agent() will restore the agent state as appropriate.

Unfortunately this does not work as expected, for main
channel (agent messages).
If attach_to_red_agent() is called before the MIGRATE_DATA
message reaches the server, all goes well,
but if MIGRATE_DATA reaches the server before
attach_to_red_agent() gets called, then some assert() gets
triggered in spice_char_device_state_restore():

((null):32507): Spice-ERROR **: char_device.c:937:spice_char_device_state_restore: assertion `dev->num_clients == 1 && dev->wait_for_migrate_data' failed
Thread 3 (Thread 0x7f406b543700 (LWP 32543)):
Thread 2 (Thread 0x7f40697ff700 (LWP 32586)):
Thread 1 (Thread 0x7f4079b45a40 (LWP 32507)):

When restoring state, a client must already be added to the
spice-char-device.
What happens is that a client is not being added to the char-device
when when MIGRATE_DATA arrives first, which leaves both
dev->num_clients and dev->wait_for_migrate_data value at 0.

This commit changes the logic in spice_server_char_device_add_interface(),
such that if there is migrate data pending in reds->agent_state.mig_data
but no client was added to the spice-char-device yet,
then first the client is added to the device by calling
spice_char_device_client_add(), and only then the state is restored.

=== How to Reproduce
To reproduce, add delays to the migration connection between
qmeu-kvm on the source host (SRC) and on the destination (DST).

Specifically I added a man in the middle DLY host between
migration ports from SRC to DST.

+-----+    +-----+     +-----+
| SRC |--> | DLY | --> | DST |
+-----+    +-----+     +-----+

DLY listens on port P1 (e.g. 4444) and DST listens on port
PINCOMING (e.g. 4444, from qemu-kvm '-incoming' command line option)

Precondition: make sure port P1 on DLY is accessible in iptables.
Option 1: use ssh tcp port forwarding
On DLY host run ssh:
  ssh DLY:P1:DST:PINCOMING DST
Then use the following migration command (on qemu-kvm monitor):
  client_migrate_info spice DST PSPICE
  migrate -d tcp:DLY:P1

Option 2: Use a simple proxy program that forwards
packets from SRC to DST while adding some delays.
The program runs on DLY, listens to port D1, upon
accept connects to DST:PINCOMING and forward all
packets from DLY:D1 to DST:PINCOMING.
Then use the same migrate command as in option 1:
  client_migrate_info spice DST PSPICE
  migrate -d tcp:DLY:P1

=== How to Reproduce Ends

This fixes https://bugzilla.redhat.com/show_bug.cgi?id=1035184

Based-on-a-patch-by: Christophe Fergeau <cfergeau@redhat.com>
2014-10-14 15:48:02 +03:00
Christophe Fergeau
e270edcbfd Validate surface bounding box before using it
It's possible for a buggy guest driver to pass invalid bounding box
dimensions in QXL commands, which would then cause spice-server to
segfault. This patch checks the size of the bounding box of the QXL
command right after it has been parsed.

This fixes rhbz#1135372
2014-09-18 14:06:55 +02:00
Christophe Fergeau
2cc42d9358 Fix 'abberiviations' typo in comment 2014-09-18 14:06:55 +02:00
Christophe Fergeau
30273776ed Fix indentation in red_get_opaque_ptr
This removes one extra space
2014-09-18 14:06:55 +02:00
Christophe Fergeau
504d027bb2 server/tests/Makefile.am: White-space cleanup
Make sure the \ at the end of lines are nicely aligned
2014-09-18 14:06:55 +02:00
Fabiano Fidêncio
93b4f4050c Fix -Wunused-function 2014-09-12 18:00:30 +02:00
Fabiano Fidêncio
b76e561d82 Fix -Wmissing-field-initializers 2014-09-12 18:00:30 +02:00
Fabiano Fidêncio
fb938c210a Fix -Wnonnull 2014-09-12 18:00:30 +02:00
Fabiano Fidêncio
63180f6ce3 Fix -Wformat 2014-09-12 18:00:30 +02:00
Fabiano Fidêncio
4bf5fd35c4 Fix -Wswitch 2014-09-12 18:00:30 +02:00
Fabiano Fidêncio
08b3e1d8f1 Fix -Wsign 2014-09-12 18:00:30 +02:00
Fabiano Fidêncio
79e5a52d05 Fix -Wunused-value 2014-09-12 18:00:30 +02:00
Fabiano Fidêncio
5ea7de3bcc Fix -Wunused-parameter 2014-09-12 18:00:30 +02:00
Fabiano Fidêncio
94edda2255 server: Don't dump the bitmap when the format is invalid
Caught by covscan:
spice/server/spice_bitmap_utils.c:54: var_decl: Declaring variable "n_pixel_bits" without initializer.
spice/server/spice_bitmap_utils.c:106: uninit_use: Using uninitialized value "n_pixel_bits".
2014-09-12 18:00:30 +02:00
Marc-André Lureau
5eb9967dbc clean-up: remove unused function 2014-09-08 14:49:29 +02:00
Marc-André Lureau
004744fd2f build-sys: check for spicy-screenshot 2014-09-08 14:49:29 +02:00
Marc-André Lureau
a434543eb1 reds: lookup corresponding channel id
In reds_send_link_ack(), lookup the channel with the same id as the link
message.

The bug was found during code review a while ago.

A reproducer bug was later reported:
https://bugzilla.redhat.com/show_bug.cgi?id=1058625
2014-09-08 14:48:08 +02:00
Marc-André Lureau
5972452b28 dispatcher: lower a monitor-config warning to a debug level
Some QXLInterface implementations might not have or succeed
with client_monitors_config(). Thus, lower warning to debug
level.

https://bugzilla.redhat.com/show_bug.cgi?id=1119220
2014-09-08 12:04:15 +02:00
Christophe Fergeau
288cf77f80 spice.h: Don't use 48kHz for playback/recording rates
When adding Opus support, SPICE_INTERFACE_PLAYBACK_FREQ and
SPICE_INTERFACE_RECORD_FREQ in the public header 'spice.h' were changed
from 44100 to 48000.
However, this was not really useful as these constants are not used in
spice-server, but only by users of spice-server (ie QEMU).
It turns out changing these values is actually harmful. QEMU uses these
constants in 2 situations:
1. when it's a version of QEMU with this commit, but we are compiling
   against older spice-server headers (before Opus support was added)
2. when it's a version of QEMU without commit 795ca114d35 which added
   what is needed for Opus support

When we are in the second situation, having 48000 in the public header
will actually cause issues as spice-server will know QEMU does not
support Opus, so internally spice-server will be using a 44100 rate for
audio. However, QEMU will be using SPICE_INTERFACE_.*_FREQ and think it
should use a 48000 rate, which will cause distorsions as experienced in
bug https://bugzilla.redhat.com/show_bug.cgi?id=1129961

Reverting these constants back to 44100 will fix audio in the 'new
spice-server/old QEMU' scenario, and won't cause issues either when both
support Opus as in this case these constants are not used.
2014-08-20 16:12:31 +02:00
Marc-André Lureau
1898f3949c Fix crash when clearing surface memory
The beginning of the surface data needs to be computed correctly if the
stride is negative, otherwise, it should point already to the beginning
of the surface data. This bug seems to exists since 4a208b (0.5.2)

https://bugzilla.redhat.com/show_bug.cgi?id=1029646
2014-08-07 11:38:02 +02:00
Marc-André Lureau
3c25192ee9 server: don't assert on invalid client message
Some users have been reaching this error:
snd_receive: ASSERT n failed

A misbehaving client could easily hit that condition by sending too big
messages. Instead of assert(), replace with a warning. When a message
too big to fit is received, it will simply disconnect the channel.

https://bugzilla.redhat.com/show_bug.cgi?id=962187
2014-07-25 17:25:29 +02:00
Jonathon Jongsma
284cca2a5e Fix assert in mjpeg_encoder_adjust_params_to_bit_rate()
If mjpeg_encoder_reset_quality() is called with the same quality as currently
set, it will not reset last_enc_size but not reset num_recent_enc_frames,
violating some assumptions in _adjust_params_to_bit_rate(). To avoid aborting
the server, simply return early from this function.

Resolves: rhbz#1086820
2014-05-30 13:45:02 -05:00
Wang Qiang
e7db94d833 Fix make failed when uncommented COMPRESS_STAT in red_worker.c
https://bugs.freedesktop.org/show_bug.cgi?id=79246
As a developer, I maybe want to see the detail compress stat of spice, like this:
Method   	  count  	orig_size(MB)	enc_size(MB)	enc_time(s)
QUIC     	     846	       948.02	      147.22	        7.51
GLZ      	    2895	       594.90	       26.60	        1.33
ZLIB GLZ 	       0	         0.00	        0.00	        0.00
LZ       	       1	         3.15	        0.01	        0.00
JPEG     	       0	         0.00	        0.00	        0.00
JPEG-RGBA	       0	         0.00	        0.00	        0.00
----------------------------------------------------------------------------
Total    	    3742	      1546.07	      173.83	        8.84

But when I uncommented the COMPRESS_STAT and COMPRESS_DEBUG in red_worker.c and make.
I got some error(in Bugzilla). This error because of some simple syntax errors.
Commit this patch to fix this issue.

Signed-off-by: Wang Qiang <wangqiang.hunan@gmail.com>
2014-05-26 18:51:36 +02:00
Marc-André Lureau
8904dfc768 server: use a warning when disconnecting unresponsive client
The debug level is not visible by default, since it is an unsolicited
server behaviour, make it a warning.
2014-05-16 19:20:51 +02:00
소병철
3cb746329e Use PRI macros in printf to keep compatibility between 32/64bit system
gcc's some integer type definitions are different between 32/64bit system.
This causes platform dependency problem with printf function. However,
we can avoid this problem by using PRI macros that supports platform
independent printf.
2014-05-15 14:45:58 +02:00
Christophe Fergeau
91a6feb9f4 Add missing buffer (re)allocation to reds_sasl_handle_auth_steplen()
We need to make sure we have a buffer big enough to accomodate the data
sent by the coming SASL step.
2014-04-16 17:11:38 +02:00
Christophe Fergeau
27f968afd2 Call correct SASL helper in reds_handle_auth_sasl_step
sasl_handle_auth_start() was called instead of reds_sasl_handle_auth_step()
2014-04-16 17:11:38 +02:00
Christophe Fergeau
390a36ea34 Add G_GNUC_UNUSED annotations to async_read_handler args
2 of the arguments are not used, the G_GNUC_UNUSED annotation will make
this explicit.
2014-04-16 17:11:38 +02:00
Christophe Fergeau
e36c7efe81 Make struct AsyncRead/async_read_handler private
All users are now contained in reds_stream.c
2014-04-16 17:11:38 +02:00
Christophe Fergeau
17f89a348a Remove RedLinkInfo::async_read
9feed69 moved the async reader code to RedsStream so that it can be used
for the SASL authentication code. In particular, it introduced a
RedsStream::async_read member which is used by the SASL authentication code
for its async operations.

However, what was not done is to remove the now redundant
RedLinkInfo::async_read field. This causes failures when using SASL
authentication as the async read error callback is getting set
on the RedLinkInfo::async_read structure, but then the SASL code is trying
to use the RedeStream::async_read structure for its async IOs, which do not
have the needed error callback set.

This commit makes use of the newly introduced reds_stream_async_read()
helper in order to make use of RedsStream::async_read.
2014-04-16 17:11:38 +02:00
Christophe Fergeau
81427961bd Call AsyncRead variables 'async' instead of 'obj'
This is a more explicit name.
2014-04-16 17:11:38 +02:00
Christophe Fergeau
3dd4723e48 Add reds_stream_set_async_error_handler() helper
This replaces async_read_set_error_handler() which was unused. This sets a
callback to be called when an async operation fails.

We could pass the error_handler to each reds_stream_async_read() call, but as
we will be using the same one for all async calls, it's more convenient to set it
once and for all.
AsyncRead is going to be private to reds_stream.c in one of the next
commits, and the error handler will need to be set from reds.c,
hence the move to a public RedsStream method.
2014-04-16 17:11:38 +02:00
Christophe Fergeau
dc017bb9ae Introduce reds_stream_async_read() helper
This will allow to make RedsStream::async_read private
2014-04-16 17:11:38 +02:00
Christophe Fergeau
db984941af Fix --without-sasl build
There are 2 SASL-related function prototypes which are unused in the
--without-sasl case. They cause a warning, and a build failure
when using -Werror. Wrapping them in #if HAVE_SASL avoids this issue.
2014-04-16 16:50:13 +02:00
Christophe Fergeau
1148c97d4b Check RSA_generate_key_ex return value
This can fail in fips mode for example. If we ignore the failure, we'll get
a crash:

 #0  0x00007f38d63728a0 in BN_num_bits () from /lib64/libcrypto.so.10
 #1  0x00007f38d639661d in RSA_size () from /lib64/libcrypto.so.10
 #2  0x00007f38d7991762 in reds_handle_read_link_done () from /lib64/libspice-server.so.1
 #3  0x00007f38d7990c06 in spice_server_add_client () from /lib64/libspice-server.so.1
 #4  0x00007f38d7990c6a in reds_accept () from /lib64/libspice-server.so.1
 #5  0x00007f38dc0d2946 in qemu_iohandler_poll (pollfds=0x7f38dedce200, ret=755449965, ret@entry=1) at iohandler.c:143
 #6  0x00007f38dc0d6ea8 in main_loop_wait (nonblocking=<optimized out>) at main-loop.c:465
 #7  0x00007f38dbffd7c0 in main_loop () at vl.c:1988
 #8  main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4357

This commit will cause the client connection to fail but qemu won't
segfault.
2014-03-20 11:45:20 +01:00
David Gibson
4019a8801d Don't truncate large 'now' values in _spice_timer_set
static void _spice_timer_set(SpiceTimer *timer, uint32_t ms, uint32_t now)

The _spice_timer_set() function takes a 32-bit integer for the "now" value.
The now value passed in however, can exceed 2^32 (it's in ms and derived
from CLOCK_MONOTONIC, which will wrap around a 32-bit integer in around 46
days).

If the now value passed in exceeds 2^32, this will mean timers are inserted
into the active list with expiry values before the current time, they will
immediately trigger, and (if they don't make themselves inactive) be
reinserted still before the current time.

This leads to an infinite loop in spice_timer_queue_cb().

https://bugzilla.redhat.com/show_bug.cgi?id=1072700
2014-03-20 11:34:49 +01:00
Marc-André Lureau
25f6745202 Associate org.spice-space.webdav.0 port to webdav channel
For example, with qemu, a webdav channel can be created this way:

 -chardev spiceport,name=org.spice-space.webdav.0,...

And redirected to a virtio port:

 -device virtserialport,...,name=org.spice-space.webdav.0
2014-03-19 17:14:44 +01:00
Christophe Fergeau
660d63253d Fix test_capability() typo
It was spelt 'capabilty'
2014-03-13 17:13:38 +01:00
Christophe Fergeau
24e2e60a59 Fix typo in log message 2014-03-13 17:13:33 +01:00
Christophe Fergeau
67be56ad8a mjpeg: Don't warn on unsupported image formats
When trying to start mjpeg compression mode, mjpeg_encoder_start_frame()
tests the image format as its only able to compress 24/32bpp images. On
images with lower bit depths, we return MJPEG_ENCODER_FRAME_UNSUPPORTED to
indicate this is not a format we can compress. However, this return goes
with a spice_warning("unsupported format"). As the rest of the code can
cope with this unsupported format by not doing mjpeg compression, it's
nicer to downgrade this spice_warning() to spice_debug().

This fixes https://bugzilla.redhat.com/show_bug.cgi?id=1070028
2014-03-13 17:13:27 +01:00
Christophe Fergeau
2ea58dd7a7 Make RedsStream::info private 2014-01-20 12:15:42 +01:00
Christophe Fergeau
28fa3b1b3f Introduce reds_stream_set_channel() 2014-01-20 12:15:42 +01:00
Christophe Fergeau
82511418a0 Introduce reds_stream_set_info_flag() 2014-01-20 12:15:42 +01:00
Christophe Fergeau
25aca54f12 Make RedsStream::async_read private 2014-01-20 12:15:42 +01:00
Christophe Fergeau
dc04c076ef Make RedsStream::sasl private 2014-01-20 12:15:42 +01:00
Christophe Fergeau
284f9d0d7a Make RedsStream read/write functions private 2014-01-20 12:15:42 +01:00
Christophe Fergeau
520ebdc815 Make RedsStream::ssl private 2014-01-20 12:15:42 +01:00
Christophe Fergeau
30fecf87f8 Introduce reds_stream_is_ssl() 2014-01-20 12:15:42 +01:00
Christophe Fergeau
1f7123298f Add RedsStream::priv
The private data is allocated at the same time as RedsStream and
goes immediatly after the main RedsStream data.
This private member will allow to hide internal RedsStream
implementation details from the rest of spice-server.
2014-01-20 12:15:42 +01:00
Christophe Fergeau
7ff743c431 Move SASL authentication to reds_stream.h
SASL authentication mostly use members from RedsStream to do its work, so
it makes sense to have its code in reds_stream.c. This should allow to make
RedsStream::sasl private in the future.
2014-01-20 12:15:42 +01:00