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

Reply via email to