Commit Graph

923 Commits

Author SHA1 Message Date
Christophe Fergeau
07ee267455 reds: Use g_strlcpy instead of strncpy
reds.c is using strncpy with a length one byte less than the
destination buffer size, and is relying on the fact that the
destination buffers are static global variables.
Now that we depend on glib, we can use g_strlcpy instead, which
avoids relying on such a subtle trick to get a nul-terminated
string.
2012-12-12 18:15:48 +01:00
Christophe Fergeau
55495a61bf build: Use glib2
Now that QEMU depends on glib, it won't really hurt if we depend
on it as well, and we won't have to reinvent our own helpers.
2012-12-12 18:15:48 +01:00
Christophe Fergeau
5a31221252 Fail reds_init_socket when getaddrinfo fails
We currently output a warning when getaddrinfo fails, but then
we go on trying to use the information it couldn't read. Make
sure we bail out of reds_init_socket if getaddrinfo fails.
2012-12-12 18:15:47 +01:00
Christophe Fergeau
0b1d268011 Make sure strncpy'ed string are 0-terminated
spice_server_set_ticket and spice_server_set_addr get (library)
user-provided strings as arguments, and copy them to fixed-size
buffers using strncpy. However, if these strings are too long,
the copied string will not be 0-terminated, which will cause issues
later. This commit copies one byte less than the size of the
destination buffer. In both cases, this buffer is a static global
variable, so its memory will be set to 0.
2012-12-12 18:15:47 +01:00
Yonit Halperin
5c91735b2c red_worker: revert 8855438a
red_proccess_commands calls were added after calling
guest_set_client_capabilities in order to cleanup the command ring from
old commands that the client might not be able to handle.
However, calling red_process_commands at this stage does send messages
to the client.
In addition, since setting the client capabilities at the guest is not
synchronized, emptying the command ring is not enough in order to make
sure the following commands will be supported by the client.
The call to red_proccess_commands before initializing the display
streams (the call to red_display_start_streams), caused inconsistencies
related to video streaming upon reconnecting (rhbz#883564).

I'm reverting this patch till another solution for the capabilities
mismatch is introduced.

Resolves: rhbz#883564
2012-12-05 12:49:41 -05:00
Marc-André Lureau
069270f641 server: add "port" channel support
A Spice port channel carry arbitrary data between the Spice client and
the Spice server. It may be used to provide additional services on top
of a Spice connection. For example, a channel can be associated with
the qemu monitor for the client to interact with it, just like any
qemu chardev. Or it may be used with various protocols, such as the
Spice Controller.

A port kind is identified simply by its fqdn, such as org.qemu.monitor,
org.spice.spicy.test or org.ovirt.controller...

The channel is based on Spicevmc which simply tunnels data between
client and server, with a few additional messages.

See the description of the channel protocol in spice-common history.
2012-12-05 11:46:28 +01:00
Marc-André Lureau
616eee84c1 server: bump SPICE_SERVER_VERSION to 0.12.2 2012-12-05 11:46:28 +01:00
Yonit Halperin
655f8c440d agent: fix mishandling of agent data received from the client after agent disconnection
The server can receive from the client agent data even when the agent
is disconnected. This can happen if the client sends the agent data
before it receives the AGENT_DISCONNECTED msg. We should receive and handle such msgs, instead
of disconnecting the client.
This bug can also lead to a server crash if the agent gets reconnected
fast enough, and it receives an agent data msg from the client before MSGC_AGENT_START.

upstream bz#55726
rhbz#881980
2012-11-30 11:15:01 -05:00
Yonit Halperin
7f220304db red_worker: no need to align the stride of internal images
Internal images are just read from the surface, compressed, and sent to the client.
Then, they are destroyed. I can't find any reason for aligning their memory.
2012-11-29 09:56:43 -05:00
Yonit Halperin
1e6f872066 red_worker: fix sending internal images with stride > bpp*width to lz compression
rhbz#876685

The current lz implementation does not support such bitmaps.
The following patch will actually prevent allocating stride > bpp*width
for internal images.
2012-11-28 14:04:11 -05:00
Yonit Halperin
4c1a2ad3f1 red_worker.c: fix memory corruption when data from client is bigger than 1024 bytes
Previously, there was no check for the size of the message received from
the client, and all messages were read into a buffer of size 1024.
However, migration data can be bigger than 1024. In such cases, memory
corruption occurred.
2012-11-26 11:08:11 -05:00
Yonit Halperin
16b38ec84e red_worker.c: fix not sending all pending messages when the device is stopped
red_wait_outgoing_item only waits till the currently outgoing msg is
completely sent.
red_wait_outgoing_items does the same for multi-clients. handle_dev_stop erroneously called
red_wait_outgoing_items, instead of waiting till all the items in the
pipes are sent.
This waiting is necessary because after drawables are sent to the client, we release them from the
device. The device might have been stopped due to moving to the non-live
phase of migration. Accessing the device memory during this phase can lead
to inconsistencies.

Also, MSG_MIGRATE should be the last message sent to the client, before
MSG_MIGRATE_DATA. Due to this bug, msgs were marshalled and sent after
handle_dev_stop and after handle_dev_display_migrate which sometimes led
to the release of surfaces, and inserting MSG_DISPLAY_DESTROY_SURFACE
after MSG_MIGRATE.

This patch also removes the calls to red_wait_outgoing_items, from
dev_flush_surfaces. They were unnecessary.
2012-11-26 11:08:11 -05:00
Yonit Halperin
7785a005d4 smartcard.c: avoid marshalling migration data with reference to a memory that might be released before send has completed
The current solution just copy the buffer. Currently data that is read
from the guest is always copied before sending it to the client. When we
will have ref count for these buffers, we can also use it for marshalling
the migration data.
2012-11-26 11:08:10 -05:00
Yonit Halperin
d8bad0f999 red_worker.c: fix marshalling of migration data
fix calling spice_marhsaller_add_ref with memory on stack
2012-11-26 11:08:10 -05:00
Yonit Halperin
ea97fbb629 reds.c: fix calls to spice_marshaller_add_ref with ptr to memory that might be released before sending 2012-11-26 11:08:10 -05:00
Yonit Halperin
0ca75b0235 char_device.c: when the state is destroyed, also free the buffer that is being written to the device 2012-11-26 11:08:10 -05:00
Yonit Halperin
d6b3f73102 char_device.c: add ref count for write-to-device buffers
The ref count is used in order to keep buffers that were in the write
queue and now are part of migration data, in case the char_device state
is destroyed before we complete sending the migration data.
2012-11-26 11:08:08 -05:00
Yonit Halperin
4cd4e7cf19 char_device.c: fix call to spice_marshaller_add_ref with memory on stack
rhbz#862352
2012-11-21 09:19:46 -05:00
Yonit Halperin
45a09e4113 red_worker.c: fix calling set_client_capabilities when it is unsupported by qemu
The erroneous call was in handle_dev_start.
This patch also fixes not calling set_client_capabilities when the
qxl major_version is > 3.
2012-11-12 18:50:37 +02:00
Yonit Halperin
9a7a645ce2 display seamless migration: no need to trace the generation of the primary surface
We no longer process destroy_primary or destroy_surfaces while waiting
for migration data.
2012-11-12 18:50:37 +02:00
Yonit Halperin
8918664cc3 display seamless migration: don't process both cmd ring and dispatcher queue till migration data is received
fix: rhbz#866929

At migration destination side, we need to restore the client's surfaces
state, before sending surfaces related messages.
Before this patch, we stopped the processing of only the cmd ring, till migration data
arrived.
However, some QXL_IOs require reading and rendering the cmd ring (e.g.,
update_area). Moreover, when the device is reset, after destroying all
surfaces, we assert (in qemu) if the cmd ring is not empty (see
rhbz#866929).
This fix makes the red_worker thread wait till the migration data arrives
(or till a timeout), and not process any input from the device after the
vm is started.
2012-11-12 18:49:48 +02:00
Alon Levy
4e7d25a7ac Revert "server: add websockets support via libwebsockets"
This reverts commit 63bb37276e.
2012-11-04 13:48:42 +02:00
Alon Levy
4ca54e596f server/red_worker: don't call set_client_capabilities if vm is stopped
We try to inject an interrupt to the vm in this case, which we cannot do
if it is stopped. Instead log this and update when vm restarts.

RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=870972
 (that bz is on qemu, it will be cloned or just changed, not
  sure yet)
2012-11-01 14:29:46 +02:00
Alon Levy
3f71ed962f server/red_worker: wip: VALIDATE_SURFACE macros, remove asserts (but too late - should be done earlier) 2012-10-25 12:33:09 +02:00
Alon Levy
65b6c56cf8 release 0.12.1 2012-10-25 12:33:09 +02:00
Alon Levy
63bb37276e server: add websockets support via libwebsockets
New API: spice_server_set_ws_ports

This adds an optional dependency on libwebsockets. You need to get my
patched 0.0.3 version here:
 git://people.freedesktop.org/~alon/libwebsockets

There is no qemu patches yet, to test change in reds.c the default value
of spice_ws_port to 5959 (for the default of spice-html5).

For testing there is an online client at
 http://spice-space.org/spice-html5/spice.html

Known issues:
 1. The tester (server/tests/test_display_no_ssl) gets into dropping all
  data after a few seconds, I think it's an issue with the implemented
  watches, but haven't figured it out.

 2. libwebsocket's read interface is inverted to what our code expects,
 i.e. there is no libwebsocket_read, so there is an additional copy
 involved (see RedsWebSocket). This can be fixed.

 3. Listening on a separate port. Since the headers are different, we
 could listen on the same port (first three bytes RED/GET). I don't know
 if we want to?

Todos:
 1. SSL not implemented yet. Needs some thought as to how.

 2. Serve spice-html5 when accessed as a http server. Nice to have.
2012-10-25 12:33:02 +02:00
Alon Levy
2c85436dc6 server/red_worker: stride > 0 is tested, remove abort
Tested using the wip driver and xf86-video-modesetting.
2012-10-25 12:33:02 +02:00
Alon Levy
f0761ef894 server/tests/test_display_base: fix segfault in test 2012-10-25 12:31:39 +02:00
Alon Levy
488b7e4027 server/reds.c: split off reds-private.h 2012-10-25 12:31:39 +02:00
Uri Lublin
67d515b768 server: red_dispatcher: check major/minor of qxl for client_monitors_config
This solves a problem with new spice-server and old qemu-kvm, where spice thinks
qif->client_monitors_config exists, while it does not exist in qemu-kvm.

Also "major > required_major" was added to the condition.
Also only the specific RedDispatcher is checked (and not all dispatchers).
2012-10-24 12:10:27 +02:00
Hans de Goede
cb27e9dad6 inputs_channel: Fix wrong handling of key up/down on big endian
The client will send 0x000000## codes for regular keys, and 0x0000##e0 codes
for extended keys. The current code which simply walks the uint32_t code in
memory order relies on the memory order being little endian, which will
clearly fail on big endian machines, this fixes this.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
2012-10-18 17:44:23 +02:00
Yonit Halperin
a179434aa9 snd channel: fix accessing freed memory
snd_channel_put freed "channel", and then channel->worker was accessed.
It caused segmentation faults during connections and disconnections of the client.
2012-10-11 20:23:47 +02:00
Christophe Fergeau
7f8905e58a Fix PlaybackChannel forward declaration
This caused a jenkins build failure:

snd_worker.c:148: error: redefinition of typedef 'PlaybackChannel'
snd_worker.c:126: note: previous declaration of 'PlaybackChannel' was here
2012-10-01 20:37:04 +02:00
Andrew Eikum
d958fc100c server: Access the correct SndChannel for a given AudioFrame
The client of _get_buffer() holds a ref to the SndChannel, and we
should access that SndChannel when _put_samples() is called, not the one
that happens to currently be attached to the Interface.
2012-10-01 19:13:12 +02:00
Andrew Eikum
0a62e33211 server: Don't release SndChannel twice from worker reference
When we release the SndChannel reference during
snd_disconnect_channel(), we need to set the pointer to NULL so it
doesn't get released again on client reconnect during
snd_set_playback_peer(). This can happen when a reference is held from
_playback_get_buffer().
2012-10-01 19:13:10 +02:00
Christophe Fergeau
4114b162ed reds: Report an error when reds_char_device_add_state fails
This used to abort with spice_error. The caller currently does
not check spice_server_char_device_add_interface return value, but
it's still cleaner to report an error in this case.
2012-09-20 16:40:54 +02:00
Christophe Fergeau
bcec6627a2 reds: Check errors returned from SSL_CTX_set_cipher_list 2012-09-20 16:40:54 +02:00
Christophe Fergeau
3494eaf938 reds: Report errors from load_dh_params 2012-09-20 16:40:54 +02:00
Christophe Fergeau
1e5bf67c2b reds: Check reds_init_ssl errors
Now that this function can fail, propagate any error up to the
caller. This allows qemu to fail when an SSL initialization error
occurred.
2012-09-20 16:40:54 +02:00
Christophe Fergeau
1c7fcefe1e reds: report SSL initialization errors
Errors occurring in reds_init_ssl used to be fatal through the use
of spice_error, but this was downgraded to non-fatal spice_warning
calls recently. This means we no longer error out when invalid SSL
(certificates, ...) parameters are passed by the user.
This commit changes reds_init_ssl return value from void to int so
that errors can be reported to the caller.
2012-09-20 16:40:54 +02:00
Christophe Fergeau
5177c5fd09 reds_init_net: report errors on watch setup failures
We used to be aborting in such situations, but this was changed
during the big spice_error/printerr cleanup. We are currently
outputting a warning but not reporting the error with the caller
when reds_init_net fails to register listening watches with the
mainloop. As it's unlikely that things will work as expected in
such cases, better to error out of the function instead of pretending
everything is all right.
2012-09-20 16:40:54 +02:00
Christophe Fergeau
eb19ac081f reds: Abort on BN-new failures
BN_new returns NULL on allocation failures. Given that we abort
on malloc allocation failures, we should also abort here. The
current code will segfault when BN_new fails as it immediatly tries
to use the NULL pointer.
2012-09-20 16:40:54 +02:00
Alon Levy
dc3cd205dd Release 0.12.0 2012-09-15 00:36:54 +03:00
Alon Levy
124984a171 server/spice-server.syms: add missing global labels
Although global is the default, this makes the file more consistent.
2012-09-13 16:43:01 +03:00
Alon Levy
c48812ee51 server/Makefile.am: fix for make distcheck
Doesn't make sense to distribute test_spice_version.sh, so just
ensure the build passes if it doesn't exist.
2012-09-13 16:38:58 +03:00
Alon Levy
56eef9eeaa spice-server 0.11.5
Added api:
 QXL interface (3.2)
  client_monitors_config
2012-09-13 14:47:32 +03:00
Alon Levy
9e1d165fc0 server/tests: agent mock, client_monitors_config 2012-09-13 14:47:32 +03:00
Alon Levy
d694739b21 server: Filter VD_AGENT_MONITORS_CONFIG
If the guest supports client monitors config we pass it the
VDAgentMonitorsConfig message via the
QXLInterface::client_monitors_config api instead of via the vdagent.
2012-09-13 14:47:32 +03:00
Alon Levy
4338968aad server/reds: reuse already defined local 2012-09-13 14:47:32 +03:00
Alon Levy
dc69ef49d0 server/red_dispatcher: client_monitors_config support
Adds two functions:
 - red_dispatcher_use_client_monitors_config:
   check that QXLInterface supports client_monitors_config and that it's
   functional.
 - red_dispatcher_client_monitors_config:
   send the client monitors configuration to the guest.
2012-09-13 14:47:31 +03:00