Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Hi, Please consider unblocking a tentative remmina 1.1.1-2 upload, debdiff attached. This upload cherry-picks patches from upstream Git to fix #766671. I reproduced the crash (it's very trivial to test it), and the patch actually solves the problem. unblock remmina/1.1.1-2 -- System Information: Debian Release: jessie/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: amd64 (x86_64) Kernel: Linux 3.16.0-4-amd64 (SMP w/2 CPU cores)
diff --git a/debian/changelog b/debian/changelog index 42e466f..f69d17c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +remmina (1.1.1-2) unstable; urgency=medium + + * debian/patches/RDP_certificate_crash.patch: + - Cherry-pick patches from upstream to fix a crash when not + accepting certificate for RDP server (Closes: #766671). + + -- Luca Falavigna <dktrkr...@debian.org> Thu, 20 Nov 2014 21:08:11 +0100 + remmina (1.1.1-1) unstable; urgency=medium * New upstream release. diff --git a/debian/patches/RDP_certificate_crash.patch b/debian/patches/RDP_certificate_crash.patch new file mode 100644 index 0000000..40c7bf3 --- /dev/null +++ b/debian/patches/RDP_certificate_crash.patch @@ -0,0 +1,154 @@ +Description: Fix crash when not accepting certificate for RDP server +Author: Giovanni Panozzo <giova...@panozzo.it> + +Index: remmina/remmina-plugins/rdp/rdp_event.c +=================================================================== +--- remmina.orig/remmina-plugins/rdp/rdp_event.c ++++ remmina/remmina-plugins/rdp/rdp_event.c +@@ -54,6 +54,9 @@ static void remmina_rdp_event_on_focus_i + #endif + + rfi = GET_DATA(gp); ++ if ( !rfi ) ++ return; ++ + input = rfi->instance->input; + UINT32 toggle_keys_state = 0; + +@@ -88,6 +91,8 @@ static void remmina_rdp_event_event_push + RemminaPluginRdpEvent* event; + + rfi = GET_DATA(gp); ++ if ( !rfi ) ++ return; + + if (rfi->event_queue) + { +@@ -454,6 +459,8 @@ static gboolean remmina_rdp_event_on_key + DWORD scancode; + + rfi = GET_DATA(gp); ++ if ( !rfi ) return TRUE; ++ + rdp_event.type = REMMINA_RDP_EVENT_TYPE_SCANCODE; + rdp_event.key_event.up = (event->type == GDK_KEY_PRESS ? False : True); + rdp_event.key_event.extended = False; +@@ -535,6 +542,8 @@ void remmina_rdp_event_init(RemminaProto + GtkClipboard* clipboard; + + rfi = GET_DATA(gp); ++ if ( !rfi ) return; ++ + rfi->drawing_area = gtk_drawing_area_new(); + gtk_widget_show(rfi->drawing_area); + gtk_container_add(GTK_CONTAINER(gp), rfi->drawing_area); +@@ -608,7 +617,7 @@ void remmina_rdp_event_uninit(RemminaPro + RemminaPluginRdpUiObject* ui; + + rfi = GET_DATA(gp); +- ++ if ( !rfi ) return; + + /* unregister the clipboard monitor */ + if (rfi->clipboard_handler) +Index: remmina/remmina-plugins/rdp/rdp_plugin.c +=================================================================== +--- remmina.orig/remmina-plugins/rdp/rdp_plugin.c ++++ remmina/remmina-plugins/rdp/rdp_plugin.c +@@ -338,6 +338,7 @@ static BOOL remmina_rdp_post_connect(fre + instance->update->DesktopResize = rf_desktop_resize; + + freerdp_channels_post_connect(instance->context->channels, instance); ++ rfi->connected = True; + + remmina_plugin_service->protocol_plugin_emit_signal(gp, "connect"); + +@@ -664,7 +665,7 @@ static gboolean remmina_rdp_main(Remmina + dest_server = remmina_plugin_service->file_get_string(remminafile, "server"); + if ( dest_server ) { + remmina_plugin_service->get_server_port(dest_server, 0, &dest_host, &dest_port); +- rfi->settings->CertificateName = _strdup( dest_host ); ++ rfi->settings->CertificateName = strdup( dest_host ); + g_free(dest_host); + } + } +@@ -701,12 +702,17 @@ static gboolean remmina_rdp_main(Remmina + + if (remmina_plugin_service->file_get_string(remminafile, "clientname")) + { +- strncpy(rfi->settings->ClientHostname, remmina_plugin_service->file_get_string(remminafile, "clientname"), +- sizeof(rfi->settings->ClientHostname) - 1); ++ s = remmina_plugin_service->file_get_string(remminafile, "clientname"); ++ if ( s ) { ++ free( rfi->settings->ClientHostname ); ++ rfi->settings->ClientHostname = strdup(s); ++ g_free(s); ++ } + } + else + { +- strncpy(rfi->settings->ClientHostname, g_get_host_name(), sizeof(rfi->settings->ClientHostname) - 1); ++ free( rfi->settings->ClientHostname ); ++ rfi->settings->ClientHostname = strdup( g_get_host_name() ); + } + + if (remmina_plugin_service->file_get_string(remminafile, "exec")) +@@ -938,6 +944,7 @@ static void remmina_rdp_init(RemminaProt + rfi->instance = instance; + rfi->settings = instance->settings; + rfi->instance->context->channels = freerdp_channels_new(); ++ rfi->connected = False; + + pthread_mutex_init(&rfi->mutex, NULL); + +@@ -995,13 +1002,12 @@ static gboolean remmina_rdp_close_connec + + if (instance) + { +- if (instance->context->channels) +- { +- //freerdp_channels_close(rfi->channels, instance); +- freerdp_channels_free(instance->context->channels); +- instance->context->channels = NULL; ++ if ( rfi->connected ) { ++ if (instance->context->channels) ++ freerdp_channels_close(instance->context->channels, instance); ++ freerdp_disconnect(instance); ++ rfi->connected = False; + } +- freerdp_disconnect(instance); + } + + if (rfi->rfx_context) +@@ -1012,8 +1018,17 @@ static gboolean remmina_rdp_close_connec + + if (instance) + { +- //freerdp_context_free(instance); /* context is rfContext* rfi */ ++ /* Remove instance->context from gp object data to avoid double free */ ++ g_object_steal_data(G_OBJECT(gp), "plugin-data"); ++ ++ if (instance->context->channels) { ++ freerdp_channels_free(instance->context->channels); ++ instance->context->channels = NULL; ++ } ++ ++ freerdp_context_free(instance); /* context is rfContext* rfi */ + freerdp_free(instance); ++ rfi->instance = NULL; + } + + return FALSE; +Index: remmina/remmina-plugins/rdp/rdp_plugin.h +=================================================================== +--- remmina.orig/remmina-plugins/rdp/rdp_plugin.h ++++ remmina/remmina-plugins/rdp/rdp_plugin.h +@@ -106,6 +106,8 @@ struct rf_context + + RFX_CONTEXT* rfx_context; + ++ gboolean connected; ++ + gboolean sw_gdi; + GtkWidget* drawing_area; + gint scale_width; diff --git a/debian/patches/series b/debian/patches/series index 041e542..ad945e0 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1 +1,2 @@ external_tools.patch +RDP_certificate_crash.patch