Skip to content
Commits on Source (17)
config.h
build/
gnome-remote-desktop (42.4-0ubuntu1) UNRELEASED; urgency=medium
* New upstream version (LP: #1983788)
-- Jesús Soto <jesus.soto@canonical.com> Tue, 16 Aug 2022 10:10:22 -0500
gnome-remote-desktop (42.3-0ubuntu1) jammy; urgency=medium
* New upstream release (LP: #1980748)
......
project('gnome-remote-desktop', 'c',
version: '42.3',
version: '42.4',
meson_version: '>= 0.47.0',
default_options: ['warning_level=1',
'buildtype=debugoptimized'])
......
......@@ -117,9 +117,20 @@ grd_store_rdp_credentials (const char *username,
static gboolean
grd_clear_rdp_credentials (GError **error)
{
return secret_password_clear_sync (GRD_RDP_CREDENTIALS_SCHEMA,
NULL, error,
NULL);
g_autoptr (GError) local_error = NULL;
secret_password_clear_sync (GRD_RDP_CREDENTIALS_SCHEMA,
NULL, &local_error,
NULL);
if (local_error)
{
g_propagate_error (error, g_steal_pointer (&local_error));
return FALSE;
}
else
{
return TRUE;
}
}
static gboolean
......@@ -305,9 +316,20 @@ vnc_clear_credentials (int argc,
char **argv,
GError **error)
{
return secret_password_clear_sync (GRD_VNC_PASSWORD_SCHEMA,
NULL, error,
NULL);
g_autoptr (GError) local_error = NULL;
secret_password_clear_sync (GRD_VNC_PASSWORD_SCHEMA,
NULL, &local_error,
NULL);
if (local_error)
{
g_propagate_error (error, g_steal_pointer (&local_error));
return FALSE;
}
else
{
return TRUE;
}
}
static gboolean
......@@ -482,7 +504,7 @@ print_rdp_status (gboolean use_colors,
NULL);
if (error)
{
fprintf (stderr, "Failed to lookup RDP credentials: %s", error->message);
fprintf (stderr, "Failed to lookup RDP credentials: %s\n", error->message);
return;
}
......@@ -538,7 +560,7 @@ print_vnc_status (gboolean use_colors,
NULL);
if (error)
{
fprintf (stderr, "Failed to lookup RDP credentials: %s", error->message);
fprintf (stderr, "Failed to lookup VNC credentials: %s\n", error->message);
return;
}
......
......@@ -100,6 +100,100 @@ struct _GrdRdpEventQueue
G_DEFINE_TYPE (GrdRdpEventQueue, grd_rdp_event_queue, G_TYPE_OBJECT)
static void
handle_synchronization_event (GrdRdpEventQueue *rdp_event_queue)
{
GrdSession *session = GRD_SESSION (rdp_event_queue->session_rdp);
RdpSynchronizationEvent *rdp_sync_event;
rdp_sync_event = g_steal_pointer (&rdp_event_queue->rdp_sync_event);
if (rdp_sync_event->caps_lock_state != rdp_event_queue->caps_lock_state)
{
g_debug ("Synchronizing caps lock state to be %s",
rdp_sync_event->caps_lock_state ? "locked": "unlocked");
grd_session_notify_keyboard_keysym (session, XKB_KEY_Caps_Lock,
GRD_KEY_STATE_PRESSED);
grd_session_notify_keyboard_keysym (session, XKB_KEY_Caps_Lock,
GRD_KEY_STATE_RELEASED);
rdp_event_queue->pending_sync_caps_lock = TRUE;
}
if (rdp_sync_event->num_lock_state != rdp_event_queue->num_lock_state)
{
g_debug ("Synchronizing num lock state to be %s",
rdp_sync_event->num_lock_state ? "locked": "unlocked");
grd_session_notify_keyboard_keysym (session, XKB_KEY_Num_Lock,
GRD_KEY_STATE_PRESSED);
grd_session_notify_keyboard_keysym (session, XKB_KEY_Num_Lock,
GRD_KEY_STATE_RELEASED);
rdp_event_queue->pending_sync_num_lock = TRUE;
}
g_free (rdp_sync_event);
}
static void
process_rdp_events (GrdRdpEventQueue *rdp_event_queue)
{
GrdSession *session = GRD_SESSION (rdp_event_queue->session_rdp);
RdpEvent *rdp_event;
if (rdp_event_queue->rdp_sync_event &&
!rdp_event_queue->pending_sync_caps_lock &&
!rdp_event_queue->pending_sync_num_lock)
handle_synchronization_event (rdp_event_queue);
while ((rdp_event = g_queue_pop_head (rdp_event_queue->queue)))
{
switch (rdp_event->type)
{
case RDP_EVENT_TYPE_NONE:
break;
case RDP_EVENT_TYPE_INPUT_KBD_KEYCODE:
grd_session_notify_keyboard_keycode (
session, rdp_event->input_kbd_keycode.keycode,
rdp_event->input_kbd_keycode.state);
break;
case RDP_EVENT_TYPE_INPUT_KBD_KEYSYM:
grd_session_notify_keyboard_keysym (session,
rdp_event->input_kbd_keysym.keysym,
rdp_event->input_kbd_keysym.state);
break;
case RDP_EVENT_TYPE_INPUT_PTR_MOTION_ABS:
grd_session_notify_pointer_motion_absolute (
session, rdp_event->input_ptr_motion_abs.stream,
rdp_event->input_ptr_motion_abs.x,
rdp_event->input_ptr_motion_abs.y);
break;
case RDP_EVENT_TYPE_INPUT_PTR_BUTTON:
grd_session_notify_pointer_button (session,
rdp_event->input_ptr_button.button,
rdp_event->input_ptr_button.state);
break;
case RDP_EVENT_TYPE_INPUT_PTR_AXIS:
grd_session_notify_pointer_axis (session,
rdp_event->input_ptr_axis.dx,
rdp_event->input_ptr_axis.dy,
rdp_event->input_ptr_axis.flags);
break;
}
g_free (rdp_event);
}
}
void
grd_rdp_event_queue_flush (GrdRdpEventQueue *rdp_event_queue)
{
g_mutex_lock (&rdp_event_queue->event_mutex);
process_rdp_events (rdp_event_queue);
g_mutex_unlock (&rdp_event_queue->event_mutex);
}
static void
queue_rdp_event (GrdRdpEventQueue *rdp_event_queue,
RdpEvent *rdp_event)
......@@ -235,92 +329,6 @@ grd_rdp_event_queue_add_synchronization_event (GrdRdpEventQueue *rdp_event_queue
g_source_set_ready_time (rdp_event_queue->flush_source, 0);
}
static void
handle_synchronization_event (GrdRdpEventQueue *rdp_event_queue)
{
GrdSession *session = GRD_SESSION (rdp_event_queue->session_rdp);
RdpSynchronizationEvent *rdp_sync_event;
rdp_sync_event = g_steal_pointer (&rdp_event_queue->rdp_sync_event);
if (rdp_sync_event->caps_lock_state != rdp_event_queue->caps_lock_state)
{
g_debug ("Synchronizing caps lock state to be %s",
rdp_sync_event->caps_lock_state ? "locked": "unlocked");
grd_session_notify_keyboard_keysym (session, XKB_KEY_Caps_Lock,
GRD_KEY_STATE_PRESSED);
grd_session_notify_keyboard_keysym (session, XKB_KEY_Caps_Lock,
GRD_KEY_STATE_RELEASED);
rdp_event_queue->pending_sync_caps_lock = TRUE;
}
if (rdp_sync_event->num_lock_state != rdp_event_queue->num_lock_state)
{
g_debug ("Synchronizing num lock state to be %s",
rdp_sync_event->num_lock_state ? "locked": "unlocked");
grd_session_notify_keyboard_keysym (session, XKB_KEY_Num_Lock,
GRD_KEY_STATE_PRESSED);
grd_session_notify_keyboard_keysym (session, XKB_KEY_Num_Lock,
GRD_KEY_STATE_RELEASED);
rdp_event_queue->pending_sync_num_lock = TRUE;
}
g_free (rdp_sync_event);
}
static void
process_rdp_events (GrdRdpEventQueue *rdp_event_queue)
{
GrdSession *session = GRD_SESSION (rdp_event_queue->session_rdp);
RdpEvent *rdp_event;
if (rdp_event_queue->rdp_sync_event &&
!rdp_event_queue->pending_sync_caps_lock &&
!rdp_event_queue->pending_sync_num_lock)
handle_synchronization_event (rdp_event_queue);
while ((rdp_event = g_queue_pop_head (rdp_event_queue->queue)))
{
switch (rdp_event->type)
{
case RDP_EVENT_TYPE_NONE:
break;
case RDP_EVENT_TYPE_INPUT_KBD_KEYCODE:
grd_session_notify_keyboard_keycode (
session, rdp_event->input_kbd_keycode.keycode,
rdp_event->input_kbd_keycode.state);
break;
case RDP_EVENT_TYPE_INPUT_KBD_KEYSYM:
grd_session_notify_keyboard_keysym (session,
rdp_event->input_kbd_keysym.keysym,
rdp_event->input_kbd_keysym.state);
break;
case RDP_EVENT_TYPE_INPUT_PTR_MOTION_ABS:
grd_session_notify_pointer_motion_absolute (
session, rdp_event->input_ptr_motion_abs.stream,
rdp_event->input_ptr_motion_abs.x,
rdp_event->input_ptr_motion_abs.y);
break;
case RDP_EVENT_TYPE_INPUT_PTR_BUTTON:
grd_session_notify_pointer_button (session,
rdp_event->input_ptr_button.button,
rdp_event->input_ptr_button.state);
break;
case RDP_EVENT_TYPE_INPUT_PTR_AXIS:
grd_session_notify_pointer_axis (session,
rdp_event->input_ptr_axis.dx,
rdp_event->input_ptr_axis.dy,
rdp_event->input_ptr_axis.flags);
break;
}
g_free (rdp_event);
}
}
static gboolean
flush_rdp_events (gpointer user_data)
{
......@@ -379,11 +387,6 @@ grd_rdp_event_queue_dispose (GObject *object)
{
GrdRdpEventQueue *rdp_event_queue = GRD_RDP_EVENT_QUEUE (object);
/**
* Process all events to ensure that remaining keysym-released events are sent
*/
process_rdp_events (rdp_event_queue);
g_clear_pointer (&rdp_event_queue->rdp_sync_event, g_free);
g_queue_free_full (rdp_event_queue->queue, free_rdp_event);
......
......@@ -32,6 +32,8 @@ G_DECLARE_FINAL_TYPE (GrdRdpEventQueue, grd_rdp_event_queue,
GrdRdpEventQueue *grd_rdp_event_queue_new (GrdSessionRdp *session_rdp);
void grd_rdp_event_queue_flush (GrdRdpEventQueue *rdp_event_queue);
void grd_rdp_event_queue_add_input_event_keyboard_keycode (GrdRdpEventQueue *rdp_event_queue,
uint32_t keycode,
GrdKeyState state);
......
......@@ -635,8 +635,7 @@ set_selection_for_clip_data_entry (GrdRdpFuseClipboard *rdp_fuse_clipboard,
g_warning ("[RDP.CLIPRDR] Failed to convert filename. Aborting "
"SelectionTransfer");
clear_entry_selection (rdp_fuse_clipboard, entry);
g_free (fuse_file);
fuse_file_free (fuse_file);
return FALSE;
}
......@@ -653,6 +652,16 @@ set_selection_for_clip_data_entry (GrdRdpFuseClipboard *rdp_fuse_clipboard,
parent = get_parent_directory (rdp_fuse_clipboard,
fuse_file->filename_with_root);
if (!parent)
{
g_warning ("[RDP.CLIPRDR] Failed to find parent directory. Aborting "
"SelectionTransfer");
clear_entry_selection (rdp_fuse_clipboard, entry);
fuse_file_free (fuse_file);
return FALSE;
}
parent->children = g_list_append (parent->children, fuse_file);
fuse_file->parent = parent;
......
......@@ -162,9 +162,6 @@ grd_rdp_gfx_surface_dispose (GObject *object)
{
GrdRdpGfxSurface *gfx_surface = GRD_RDP_GFX_SURFACE (object);
g_clear_object (&gfx_surface->frame_controller);
g_clear_object (&gfx_surface->render_surface);
if (gfx_surface->created)
{
grd_rdp_graphics_pipeline_delete_surface (gfx_surface->graphics_pipeline,
......@@ -172,6 +169,9 @@ grd_rdp_gfx_surface_dispose (GObject *object)
gfx_surface->created = FALSE;
}
g_clear_object (&gfx_surface->frame_controller);
g_clear_object (&gfx_surface->render_surface);
G_OBJECT_CLASS (grd_rdp_gfx_surface_parent_class)->dispose (object);
}
......
......@@ -90,7 +90,7 @@ struct _GrdRdpGraphicsPipeline
GHashTable *surface_table;
GHashTable *codec_context_table;
/* Unacknowledged Frames ADM element */
/* Unacknowledged Frames ADM element ([MS-RDPEGFX] 3.2.1.2) */
GHashTable *frame_serial_table;
GHashTable *serial_surface_table;
......@@ -1292,6 +1292,9 @@ clear_all_unacked_frames_in_gfx_surface (gpointer key,
GrdRdpGfxFrameController *frame_controller =
grd_rdp_gfx_surface_get_frame_controller (gfx_surface);
if (!frame_controller)
return;
grd_rdp_gfx_frame_controller_clear_all_unacked_frames (frame_controller);
}
......
......@@ -308,8 +308,7 @@ grd_rdp_network_autodetection_bw_measure_stop (GrdRdpNetworkAutodetection *netwo
locker = g_mutex_locker_new (&network_autodetection->bw_measure_mutex);
ResetEvent (network_autodetection->bw_measure_stop_event);
if (network_autodetection->bw_measure_state != BW_MEASURE_STATE_PENDING_STOP &&
network_autodetection->bw_measure_state != BW_MEASURE_STATE_QUEUED_STOP)
if (network_autodetection->bw_measure_state != BW_MEASURE_STATE_QUEUED_STOP)
return;
network_autodetection->bw_measure_state = BW_MEASURE_STATE_PENDING_RESULTS;
......
......@@ -2138,13 +2138,21 @@ grd_session_rdp_new (GrdRdpServer *rdp_server,
username = grd_settings_get_rdp_username (settings, &error);
if (!username)
{
g_warning ("Couldn't retrieve RDP username: %s", error->message);
if (error)
g_warning ("[RDP] Couldn't retrieve RDP username: %s", error->message);
else
g_message ("[RDP] Username is not set, denying client");
return NULL;
}
password = grd_settings_get_rdp_password (settings, &error);
if (!password)
{
g_warning ("Couldn't retrieve RDP password: %s", error->message);
if (error)
g_warning ("[RDP] Couldn't retrieve RDP password: %s", error->message);
else
g_message ("[RDP] Password is not set, denying client");
g_free (username);
return NULL;
}
......@@ -2180,6 +2188,21 @@ grd_session_rdp_new (GrdRdpServer *rdp_server,
return g_steal_pointer (&session_rdp);
}
static void
clear_session_sources (GrdSessionRdp *session_rdp)
{
if (session_rdp->update_monitor_layout_source)
{
g_source_destroy (session_rdp->update_monitor_layout_source);
g_clear_pointer (&session_rdp->update_monitor_layout_source, g_source_unref);
}
if (session_rdp->pending_encode_source)
{
g_source_destroy (session_rdp->pending_encode_source);
g_clear_pointer (&session_rdp->pending_encode_source, g_source_unref);
}
}
static gboolean
clear_pointer_bitmap (gpointer key,
gpointer value,
......@@ -2239,12 +2262,7 @@ grd_session_rdp_stop (GrdSession *session)
g_clear_object (&rdp_peer_context->graphics_pipeline);
g_clear_pointer (&session_rdp->socket_thread, g_thread_join);
if (session_rdp->update_monitor_layout_source)
{
g_source_destroy (session_rdp->update_monitor_layout_source);
g_clear_pointer (&session_rdp->update_monitor_layout_source, g_source_unref);
}
clear_session_sources (session_rdp);
peer->Close (peer);
g_clear_object (&session_rdp->connection);
......@@ -2266,7 +2284,7 @@ grd_session_rdp_stop (GrdSession *session)
g_hash_table_foreach_remove (session_rdp->pressed_unicode_keys,
notify_keysym_released,
session_rdp);
g_clear_object (&session_rdp->rdp_event_queue);
grd_rdp_event_queue_flush (session_rdp->rdp_event_queue);
g_clear_pointer (&session_rdp->rdp_surface, grd_rdp_surface_free);
g_clear_pointer (&session_rdp->monitor_config, grd_rdp_monitor_config_free);
......@@ -2417,15 +2435,13 @@ grd_session_rdp_dispose (GObject *object)
{
GrdSessionRdp *session_rdp = GRD_SESSION_RDP (object);
if (session_rdp->pending_encode_source)
{
g_source_destroy (session_rdp->pending_encode_source);
g_clear_pointer (&session_rdp->pending_encode_source, g_source_unref);
}
clear_session_sources (session_rdp);
g_assert (!session_rdp->graphics_thread);
g_clear_pointer (&session_rdp->graphics_context, g_main_context_unref);
g_clear_object (&session_rdp->rdp_event_queue);
g_clear_pointer (&session_rdp->pressed_unicode_keys, g_hash_table_unref);
g_clear_pointer (&session_rdp->pressed_keys, g_hash_table_unref);
g_clear_pointer (&session_rdp->pointer_cache, g_hash_table_unref);
......
......@@ -518,7 +518,11 @@ check_rfb_password (rfbClientPtr rfb_client,
password = grd_settings_get_vnc_password (settings, &error);
if (!password)
{
g_warning ("Couldn't retrieve VNC password: %s", error->message);
if (error)
g_warning ("[VNC] Couldn't retrieve VNC password: %s", error->message);
else
g_message ("[VNC] Password is not set, denying client");
return FALSE;
}
......
......@@ -135,11 +135,7 @@ grd_settings_get_rdp_username (GrdSettings *settings,
NULL, error,
NULL);
if (!credentials_string)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
"Credentials not set");
return NULL;
}
return NULL;
credentials = g_variant_parse (NULL, credentials_string, NULL, NULL, NULL);
if (!credentials)
......@@ -177,11 +173,7 @@ grd_settings_get_rdp_password (GrdSettings *settings,
NULL, error,
NULL);
if (!credentials_string)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
"Credentials not set");
return NULL;
}
return NULL;
credentials = g_variant_parse (NULL, credentials_string, NULL, NULL, NULL);
if (!credentials)
......@@ -217,11 +209,7 @@ grd_settings_get_vnc_password (GrdSettings *settings,
NULL, error,
NULL);
if (!password)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
"Password not set");
return NULL;
}
return NULL;
return password;
}
......
......@@ -21,6 +21,7 @@
#include "config.h"
#include <drm_fourcc.h>
#include <epoxy/egl.h>
#include <epoxy/gl.h>
#include <fcntl.h>
......@@ -95,7 +96,7 @@ create_dmabuf_image (EGLDisplay egl_display,
attribs[atti++] = dma_buf->offsets[0];
attribs[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
attribs[atti++] = dma_buf->strides[0];
if (dma_buf->modifiers)
if (dma_buf->modifiers[0] != DRM_FORMAT_MOD_INVALID)
{
attribs[atti++] = EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT;
attribs[atti++] = dma_buf->modifiers[0] & 0xFFFFFFFF;
......@@ -112,7 +113,7 @@ create_dmabuf_image (EGLDisplay egl_display,
attribs[atti++] = dma_buf->offsets[1];
attribs[atti++] = EGL_DMA_BUF_PLANE1_PITCH_EXT;
attribs[atti++] = dma_buf->strides[1];
if (dma_buf->modifiers)
if (dma_buf->modifiers[1] != DRM_FORMAT_MOD_INVALID)
{
attribs[atti++] = EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT;
attribs[atti++] = dma_buf->modifiers[1] & 0xFFFFFFFF;
......@@ -129,7 +130,7 @@ create_dmabuf_image (EGLDisplay egl_display,
attribs[atti++] = dma_buf->offsets[2];
attribs[atti++] = EGL_DMA_BUF_PLANE2_PITCH_EXT;
attribs[atti++] = dma_buf->strides[2];
if (dma_buf->modifiers)
if (dma_buf->modifiers[2] != DRM_FORMAT_MOD_INVALID)
{
attribs[atti++] = EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT;
attribs[atti++] = dma_buf->modifiers[2] & 0xFFFFFFFF;
......