Commit Graph

2629 Commits

Author SHA1 Message Date
Frediano Ziglio
571cec91e7 reds: Avoid integer overflows handling monitor configuration
Avoid VDAgentMessage::size integer overflows.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
2017-07-11 10:40:27 +02:00
Frediano Ziglio
111ab38611 reds: Disconnect when receiving overly big ClientMonitorsConfig
Total message size received from the client was unlimited. There is
a 2kiB size check on individual agent messages, but the MonitorsConfig
message can be split in multiple chunks, and the size of the
non-chunked MonitorsConfig message was never checked. This could easily
lead to memory exhaustion on the host.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
2017-07-11 10:40:27 +02:00
Victor Toso
31fb967f1a display-channel: introduce display_channel_get_nth_stream()
To help avoid stream.c and dcc.c to access display-channel private
structure to get the nth Stream structure pointer.

Signed-off-by: Victor Toso <victortoso@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-06-30 12:28:30 +02:00
Victor Toso
970cb2a1d3 stream: use display_channel_get_stream_id()
As we have a function for that, don't do the math elsewhere.

Signed-off-by: Victor Toso <victortoso@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-06-30 12:28:13 +02:00
Michal Privoznik
7254169f7f tests: Initialize all members of SpiceBaseInterface struct
When compiling, -Werror=missing-field-initializers is enabled.
However, some gcc versions (like Gentoo 4.9.4 one) fail to see
that all the members of the SpiceBaseInterface struct are
initialized:

test-display-base.c:844:5: error: missing initializer for field
'description' of 'SpiceBaseInterface'
[-Werror=missing-field-initializers] .base.description   = "test
spice virtual channel char device",

The solution is to initialize .base member as a structure at once
instead of multiple times per each member.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-06-23 10:09:50 +01:00
Frediano Ziglio
a1387f036e log: Do not print function name twice during logging
spice_error/spice_warning already print location information
so don't print them twice.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Jonathon Jongmsa <jjongsma@redhat.com>
2017-06-18 09:53:27 +01:00
Frediano Ziglio
0903a84b8c log: remove not widely used logging domain usage
As discussed recently the usage of domain for logging has
different issues (they are not filtered and handled coherently)
and are not widely used in the code.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2017-06-16 07:53:00 +01:00
Christophe Fergeau
429958f7d4 reds: Free client_monitors_config in spice_server_destroy()
This was not done until now, and it's only going to be needed if we receive
a partial ClientMonitorsConfig message.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-06-15 18:26:29 +02:00
Christophe Fergeau
edf90ba124 reds: Remove redundant __func in debug log
The function name is always prepended by the spice_log macro, so we
don't need to explicitly add it in debug messages.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-06-15 18:26:29 +02:00
Christophe Fergeau
2b08ba3d51 reds: Replace RedsClientMonitorsConfig with SpiceBuffer
RedsClientMonitorsConfig duplicates what SpiceBuffer does,
so using we can replace it with SpiceBuffer and make
reds_on_main_agent_monitors_config() simpler.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-06-15 18:26:29 +02:00
Christophe Fergeau
1569d429b7 Remove use of spice_debug(NULL)
This is causing issues with potential improvements to the logging
system, and I've always found this usage a bit odd anyway.
Using spice_debug(""); was not possible as this triggers
-Wformat-zero-length warnings from our use of -Wall.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-06-15 16:40:25 +01:00
Frediano Ziglio
abc1df0b6c cursor-channel: Remove obsolete size check
In the past CursorItem structure was stored in
RedCursorCmd::device_data field so the check was there to check if the
structure fit into that field.
Since 2ba69f9f88
("libspice: add surface 0 support") the structure is no more stored in
the field so there's no reason for this check causing only confusion.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2017-06-08 14:31:22 +01:00
Frediano Ziglio
385176188d dcc: Use more portable mnemonic
The maximum value for a 32 bit variable is UINT32_MAX and not
UINT_MAX. Currently all supported platforms have these two
constants having the same value so this patch don't change
nothing in the generated code but potentially this could
change in a future.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2017-06-06 17:55:27 +01:00
Pavel Grunt
366b5b96c2 reds: Adjust agent capabilites to disabled features
File transfer and Copy & Paste can be disabled on the server even when
they're supported by the guest agent. Tell it the client by adjusting
the agent capabilities.

Related: rhbz#1373725

Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2017-06-06 17:53:42 +01:00
Pavel Grunt
5dc55aa70d reds: Constantify agent message parameter
Make clear that the function is not changing it

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-06-02 11:20:45 +02:00
Jonathon Jongsma
eb3d2bfcfd Don't close all but one display during reboot.
When a guest is rebooted, the QXL driver gets unloaded at some point in
the reboot process. When the driver is unloaded, the spice server sets a
single flag to FALSE: RedWorker::driver_cap_monitors_config. This flag
indicates whether the driver is capable of sending its own monitors config
messages to the client.

The only place this flag is used is when a new primary surface is created. If
this flag is true, the server assumes that the driver will send its own
monitors config very soon after the surface is created. If it's false, the
server directly sends its own temporary monitors config message to the client
based on the size of the just-created primary surface. This temporary monitors
config message always has a maximum monitor count of 1.

This flag is set to false at startup so that in early boot (e.g. vga text
mode), the server will send out these 'temporary' monitor config messages to
the client whenever the primary surface is destroyed and re-created. This
causes the client to resize its window to match the size of the guest. When the
QXL driver is loaded and starts taking over the monitors config
responsibilities, we set this flag to true and the server stops sending
monitors config messages out on its own.

If we reboot and set this flag to false, it will result in the server sending a
monitors config message to the client indicating that the guest now supports a
maximum of 1 monitor. If the guest happens to have more than one display window
open, it will destroy those extra windows because they exceed the maximum
allowed number of monitors. This means that if you reboot a guest with 4
monitors, after reboot it will only have 1 monitor.

To avoid this, we assume that if we had the ability to support multiple
monitors at some point, that will return at some point. So when the server
constructs its own monitors config message to send to the client (when the
driver_cap_monitors_config flag is false), we send the previous maximum monitor
count instead of always sending a maximum of 1.

Resolves: rhbz#1274447
Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-25 11:56:21 -05:00
Frediano Ziglio
989003af76 cursor-channel: Change cursor_visible type to bool
The variable is used to store a boolean type.
Update style for this boolean variable.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2017-05-22 14:34:19 +01:00
Jonathon Jongsma
50921f0672 inputs: add SCAN_CODE_RELEASE define
Use a #define rather than a magic number to make the code a bit more
readable.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-18 18:26:46 +01:00
Frediano Ziglio
ed2e9d51f8 reds: Remove only assigned 'mcc' field
This field was never actually used, only changed.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2017-05-18 16:30:08 +01:00
Pavel Grunt
073be0ea6d Add "fall through" comments where necessary
Make gcc 7.0.1 happy

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-16 13:42:51 +01:00
Frediano Ziglio
1b9cf935b7 spicevmc: Remove useless check
rcc is already deferenced in red_channel_client_get_client so
checking for NULL after that is uselss.

Also this call is generated from red_channel_client_disconnect
which requires the rcc pointer to be valid.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-05-03 12:35:13 +01:00
Jonathon Jongsma
3d84e1559f sound: don't store client in SndChannel
The base RedChannel already keeps a list of channel clients, so there's
no need for the SndChannel to also keep track of the client itself.

Since the SndChannel only supports a single client (whereas other
channels may have some partial support for multiple clients), I've
provided a convenience function for getting the client and warning if
there is more than one.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-05-02 10:10:35 -05:00
Jonathon Jongsma
74c2137b16 sound: Change snd_playback_start/snd_record_start
The content of these functions almost exclusively deals with channel
client functionality except one line where the channel's active state is
set to TRUE.

These functions are called in two different places.

The first place is from the public API spice_server_record_start() and
spice_server_playback_start(). These functions should alter the
channel's active state, and then set the associated channel client to
active.

The second place is when a new channel client is created. In this
case, it is only called if the channel is already active, so it doesn't
make much sense to set the channel's active state inside of the
function.

To simplify things (and enable some future refactoring), this function
now only deals with the SndChannelClient. The functions have also been
renamed to reflect this fact. The SndChannel's active state is now only
modified from the public API functions.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2017-05-02 10:10:35 -05:00
Jonathon Jongsma
601a5a2746 sound: use GList for global list of sound channels
Instead of putting a 'next' link within the channel structure itself,
just use a generic GList structure to keep a list of active sound
channels.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
2017-05-02 10:10:35 -05:00
Jonathon Jongsma
a2ea1e1536 sound: Remove dead code in client constructors
When a new PlaybackChannelClient or RecordChannelClient is created,
there are several places where we make decisions based on whether the
client is active or not. But these checks are done before the 'active'
flag is ever set, so this code is effectively dead. This has been the
case since commit 6fdcb931 and d351bb35, so this code has not been
executed for approximately 7 years now.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-05-02 10:10:35 -05:00
Jonathon Jongsma
8c88597b48 sound: Remove on_new_record_channel_client()
It is only called from the constructor, so move all of the code into
that function.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-02 10:10:35 -05:00
Jonathon Jongsma
f37629996c sound: Remove on_new_playback_channel_client()
This function is only called from the constructor, so move all of that
code into the constructor.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-05-02 10:10:35 -05:00
Frediano Ziglio
ba9656757e red-parse-qxl: s/true/false
Reverse return values of the various bool methods so that 'true' means
success, and 'false' failure rather than the opposite.

Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-05-02 11:30:47 +02:00
Christophe Fergeau
7e1ebc87b3 red-parse-qxl: Change int/1/0 to bool/true/false
The red_get_* methods in red-parse-qxl.c return a boolean, even though
their return type is an int, and they return 1/0. This commit changes
this to the more explicit bool/true/false.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-02 11:30:43 +02:00
Christophe Fergeau
16f7d71c18 red-parse-qxl: Use true/false rather than TRUE/FALSE
Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-05-02 11:30:40 +02:00
Christophe Fergeau
df43483f71 Introduce WriteBufferOrigin enum typedef
This use to be an anonymous enum, used as an int in
RedCharDeviceWriteBufferPrivate::origin.
Introducing a typedef clarifies what kind of value it's holding.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
113b7c8f5e Make RedCharDeviceWriteBuffer::refs private
Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
76a06bdef8 Make RedCharDeviceWriteBuffer::token_price private
Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
8dc7505ae9 Make RedCharDeviceWriteBuffer::client private
Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
3fe4c661ef Make RedCharDeviceWriteBuffer::origin private
Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
968f3ab3e8 Add RedCharDeviceWriteBufferPrivate
This is intended to hold the fields that only char-device.c has a use
for, but for now this only adds the boilerplate for it, the next commit
will move the relevant field there.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
ecdef4930b Remove redundant code from red_channel_client_msg_sent()
red_channel_client_clear_sent_item() will clear send_data.blocked, so no
need to do it in red_channel_client_msg_sent() as well.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
2a3b6c2c00 Use red_channel_client_set_blocked() helper
Now that red_channel_client_set_blocked() is no longer changing the
events we are watching for, we can call it from
red_channel_client_push().

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
2eb491cb6b Don't modify watch when network queue is full
Since 5c460d, we need to watch for WATCH_EVENT_WRITE as long as there are
items queued waiting to be sent, this does not need to be done only when
the network queue is full.

When red_channel_client_set_blocked() is called, as a message is being
sent, WATCH_EVENT_WRITE will already be set, so it does not need to set
it again.
red_channel_client_msg_sent() removes WATCH_EVENT_WRITE, but this will
be done later anyway by red_channel_client_push() if needed.

Since it's redundant, we can remove this.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
68a4eaedf1 Remove unneeded red_channel_client_is_blocked() call
red_channel_client_msg_sent() calls red_channel_client_clear_sent_item()
which will clear the rcc->priv->send_data.blocked flag. Later on, it
contains a check for !red_channel_client_is_blocked(), which will always
be true as nothing in between could have set it again. This commit
removes this unneeded check.

This check was already redundant when it was introduced in
9a62a9a809

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-28 16:59:25 +02:00
Christophe Fergeau
bf7bb4e886 Remove unneeded rcc->priv->latency_monitor.timer checks
Before this commit, red_channel_client_start_ping_timer() and
red_channel_client_cancel_ping_timer() had checks to be no-ops when
rcc->priv->latency_monitor.timer is NULL.

This commit adds a similar check to
red_channel_client_restart_ping_timer(), and removes explicit NULL
checks before calls to red_channel_client_{cancel,restart,start}_ping_timer()

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-28 16:59:25 +02:00
Frediano Ziglio
79c6ed0a9f Remove useless check
rcc is just used on the next line so cannot be NULL.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-04-28 15:33:29 +01:00
Christophe Fergeau
f9e7454509 Use enum rather than int in MainChannelClientPrivate::net_test_stage
Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-26 17:44:22 +02:00
Pavel Grunt
5d836f3b70 display-channel: Remove extra 'the' in comment
Fixes `make syntax-check`

https://gitlab.com/spice/spice/builds/14346626

Acked-by: Frediano Ziglio <fziglio@redhat.com>
2017-04-21 10:35:13 +01:00
Frediano Ziglio
ffff35c689 sound: Use bool type coherently
Many function already used bool as boolean type.
Change last gboolean occurrencies and values.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
2017-04-20 09:11:11 +01:00
Christophe Fergeau
258c2234ba playback: Don't lose client connection after migration
Commit 590acf3c55 introduced a regression after migration:
PlaybackChannel::connection is never set even if a client is connected,
which means the playback channel is non-functional until a client
reconnects as all the snd_channel_set_xxx() method checks for a non-NULL
PlaybackChannel::connection before sending data to the client.

This commit slightly changes the code flow in
on_new_playback_channel_client()/playback_channel_client_constructed()
so that PlaybackChannel::connection is set regardless of what
red_client_during_migrate_at_target() returns. This is what was done
prior to 590acf3c55.

This resolves https://bugs.freedesktop.org/show_bug.cgi?id=100136

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2017-04-19 09:53:16 +01:00
Jonathon Jongsma
f23834ccb4 DisplayChannel: document exclude_region() functions
This is a particularly opaque part of the code for managing pending
Drawable operations. This patch adds documentation atempting to explain
these functions.
2017-04-13 11:18:13 -05:00
Jonathon Jongsma
ac6e7a4ebd Add debug output identifying audio codec
It can be useful for debug to know what the codec of the playback and
record channels are, so add a debug-level print statement indicating
this.

Resolves: rhbz#1436251

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
Acked-by: Christophe Fergeau <cfergeau@redhat.com>
2017-04-11 10:24:42 -05:00
Christophe Fergeau
c765e9f283 main-channel-client: Remove unused statistics code
Main-channel-client.c has code to send pings when the statistics code is
enabled. This is done through a timer calling a ping_timer_cb callback.
However, this timer is created but never started, so this code is
actually dead-code.

Since this code does not seem to be doing much apart from sending the
pings (which can be achieved by simply setting monitor-latency to TRUE
in main_channel_client_create()), this commit removes it.

Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2017-04-11 10:21:30 +02:00
Christophe Fergeau
cf3657d2e4 Use red_channel_client_is_blocked
Signed-off-by: Christophe Fergeau <cfergeau@redhat.com>
Acked-by: Jonathon Jongsma <jjongsma@redhat.com>
2017-04-11 10:21:30 +02:00