diff --git a/rh1231973-dbus-fix-operations-for-p2p-mgmt.patch b/rh1231973-dbus-fix-operations-for-p2p-mgmt.patch
new file mode 100644
index 0000000..e004262
--- /dev/null
+++ b/rh1231973-dbus-fix-operations-for-p2p-mgmt.patch
@@ -0,0 +1,195 @@
+From 8a78e227df1ead19be8e12a4108e448887e64d6f Mon Sep 17 00:00:00 2001
+From: Jouni Malinen <jouni@qca.qualcomm.com>
+Date: Wed, 29 Apr 2015 10:13:34 +0000
+Subject: D-Bus: Fix operations when P2P management interface is used
+
+Commit 21efc940f6e7f07b84b7e5c5867f3d81594c4fb0 ('wpa_supplicant: Do not
+register a P2P management interface on DBus') hides the special P2P
+management interface from D-Bus. However, it did not take into account
+the possibility of wpa_s->dbus_path and wpa_s->dbus_new_path being NULL
+in such cases on number of code paths within the D-Bus handlers. This
+could result in invalid arguments (NULL path) being provided to D-Bus
+functions (mainly, dbus_message_iter_append_basic) and NULL pointer
+dereference when iterating over all interfaces. Either of these could
+make wpa_supplicant process terminate.
+
+Fix this by explicitly checking that the interface-specific D-Bus path
+has been registered before using it anywhere with D-Bus handlers. In
+addition, find the correct wpa_s instance to fix P2P operations through
+D-Bus when the P2P Device interface is used.
+
+Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
+---
+(limited to 'wpa_supplicant/dbus/dbus_new_handlers.c')
+
+diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c
+index d695d1b..3f5fd0a 100644
+--- a/wpa_supplicant/dbus/dbus_new_handlers.c
++++ b/wpa_supplicant/dbus/dbus_new_handlers.c
+@@ -157,7 +157,8 @@ static struct wpa_supplicant * get_iface_by_dbus_path(
+ 	struct wpa_supplicant *wpa_s;
+ 
+ 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
+-		if (os_strcmp(wpa_s->dbus_new_path, path) == 0)
++		if (wpa_s->dbus_new_path &&
++		    os_strcmp(wpa_s->dbus_new_path, path) == 0)
+ 			return wpa_s;
+ 	}
+ 	return NULL;
+@@ -600,7 +601,7 @@ DBusMessage * wpas_dbus_handler_create_interface(DBusMessage *message,
+ 		iface.bridge_ifname = bridge_ifname;
+ 		/* Otherwise, have wpa_supplicant attach to it. */
+ 		wpa_s = wpa_supplicant_add_iface(global, &iface, NULL);
+-		if (wpa_s) {
++		if (wpa_s && wpa_s->dbus_new_path) {
+ 			const char *path = wpa_s->dbus_new_path;
+ 
+ 			reply = dbus_message_new_method_return(message);
+@@ -684,7 +685,7 @@ DBusMessage * wpas_dbus_handler_get_interface(DBusMessage *message,
+ 			      DBUS_TYPE_INVALID);
+ 
+ 	wpa_s = wpa_supplicant_get_iface(global, ifname);
+-	if (wpa_s == NULL)
++	if (wpa_s == NULL || wpa_s->dbus_new_path == NULL)
+ 		return wpas_dbus_error_iface_unknown(message);
+ 
+ 	path = wpa_s->dbus_new_path;
+@@ -876,8 +877,10 @@ dbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter,
+ 	unsigned int i = 0, num = 0;
+ 	dbus_bool_t success;
+ 
+-	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
+-		num++;
++	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
++		if (wpa_s->dbus_new_path)
++			num++;
++	}
+ 
+ 	paths = os_calloc(num, sizeof(char *));
+ 	if (!paths) {
+@@ -885,8 +888,10 @@ dbus_bool_t wpas_dbus_getter_interfaces(DBusMessageIter *iter,
+ 		return FALSE;
+ 	}
+ 
+-	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next)
+-		paths[i++] = wpa_s->dbus_new_path;
++	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
++		if (wpa_s->dbus_new_path)
++			paths[i++] = wpa_s->dbus_new_path;
++	}
+ 
+ 	success = wpas_dbus_simple_array_property_getter(iter,
+ 							 DBUS_TYPE_OBJECT_PATH,
+@@ -1478,7 +1483,8 @@ DBusMessage * wpas_dbus_handler_add_network(DBusMessage *message,
+ 
+ 	dbus_message_iter_init(message, &iter);
+ 
+-	ssid = wpa_config_add_network(wpa_s->conf);
++	if (wpa_s->dbus_new_path)
++		ssid = wpa_config_add_network(wpa_s->conf);
+ 	if (ssid == NULL) {
+ 		wpa_printf(MSG_ERROR, "%s[dbus]: can't add new interface.",
+ 			   __func__);
+@@ -1602,7 +1608,7 @@ DBusMessage * wpas_dbus_handler_remove_network(DBusMessage *message,
+ 	iface = wpas_dbus_new_decompose_object_path(op,
+ 						    WPAS_DBUS_NEW_NETWORKS_PART,
+ 						    &net_id);
+-	if (iface == NULL || net_id == NULL ||
++	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
+ 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
+ 		reply = wpas_dbus_error_invalid_args(message, op);
+ 		goto out;
+@@ -1715,7 +1721,7 @@ DBusMessage * wpas_dbus_handler_select_network(DBusMessage *message,
+ 	iface = wpas_dbus_new_decompose_object_path(op,
+ 						    WPAS_DBUS_NEW_NETWORKS_PART,
+ 						    &net_id);
+-	if (iface == NULL || net_id == NULL ||
++	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
+ 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
+ 		reply = wpas_dbus_error_invalid_args(message, op);
+ 		goto out;
+@@ -1773,7 +1779,7 @@ DBusMessage * wpas_dbus_handler_network_reply(DBusMessage *message,
+ 	iface = wpas_dbus_new_decompose_object_path(op,
+ 						    WPAS_DBUS_NEW_NETWORKS_PART,
+ 						    &net_id);
+-	if (iface == NULL || net_id == NULL ||
++	if (iface == NULL || net_id == NULL || !wpa_s->dbus_new_path ||
+ 	    os_strcmp(iface, wpa_s->dbus_new_path) != 0) {
+ 		reply = wpas_dbus_error_invalid_args(message, op);
+ 		goto out;
+@@ -2266,12 +2272,14 @@ DBusMessage * wpas_dbus_handler_set_pkcs11_engine_and_module_path(
+ 			message, DBUS_ERROR_FAILED,
+ 			"Reinit of the EAPOL state machine with the new PKCS #11 engine and module path failed.");
+ 
+-	wpa_dbus_mark_property_changed(
+-		wpa_s->global->dbus, wpa_s->dbus_new_path,
+-		WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath");
+-	wpa_dbus_mark_property_changed(
+-		wpa_s->global->dbus, wpa_s->dbus_new_path,
+-		WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath");
++	if (wpa_s->dbus_new_path) {
++		wpa_dbus_mark_property_changed(
++			wpa_s->global->dbus, wpa_s->dbus_new_path,
++			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11EnginePath");
++		wpa_dbus_mark_property_changed(
++			wpa_s->global->dbus, wpa_s->dbus_new_path,
++			WPAS_DBUS_NEW_IFACE_INTERFACE, "PKCS11ModulePath");
++	}
+ 
+ 	return NULL;
+ }
+@@ -3024,7 +3032,7 @@ dbus_bool_t wpas_dbus_getter_current_bss(DBusMessageIter *iter,
+ 	struct wpa_supplicant *wpa_s = user_data;
+ 	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *bss_obj_path = path_buf;
+ 
+-	if (wpa_s->current_bss)
++	if (wpa_s->current_bss && wpa_s->dbus_new_path)
+ 		os_snprintf(bss_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
+ 			    "%s/" WPAS_DBUS_NEW_BSSIDS_PART "/%u",
+ 			    wpa_s->dbus_new_path, wpa_s->current_bss->id);
+@@ -3052,7 +3060,7 @@ dbus_bool_t wpas_dbus_getter_current_network(DBusMessageIter *iter,
+ 	struct wpa_supplicant *wpa_s = user_data;
+ 	char path_buf[WPAS_DBUS_OBJECT_PATH_MAX], *net_obj_path = path_buf;
+ 
+-	if (wpa_s->current_ssid)
++	if (wpa_s->current_ssid && wpa_s->dbus_new_path)
+ 		os_snprintf(net_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
+ 			    "%s/" WPAS_DBUS_NEW_NETWORKS_PART "/%u",
+ 			    wpa_s->dbus_new_path, wpa_s->current_ssid->id);
+@@ -3140,6 +3148,12 @@ dbus_bool_t wpas_dbus_getter_bsss(DBusMessageIter *iter, DBusError *error,
+ 	unsigned int i = 0;
+ 	dbus_bool_t success = FALSE;
+ 
++	if (!wpa_s->dbus_new_path) {
++		dbus_set_error(error, DBUS_ERROR_FAILED,
++			       "%s: no D-Bus interface", __func__);
++		return FALSE;
++	}
++
+ 	paths = os_calloc(wpa_s->num_bss, sizeof(char *));
+ 	if (!paths) {
+ 		dbus_set_error_const(error, DBUS_ERROR_NO_MEMORY, "no memory");
+@@ -3191,6 +3205,12 @@ dbus_bool_t wpas_dbus_getter_networks(DBusMessageIter *iter, DBusError *error,
+ 	unsigned int i = 0, num = 0;
+ 	dbus_bool_t success = FALSE;
+ 
++	if (!wpa_s->dbus_new_path) {
++		dbus_set_error(error, DBUS_ERROR_FAILED,
++			       "%s: no D-Bus interface", __func__);
++		return FALSE;
++	}
++
+ 	for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
+ 		if (!network_is_persistent_group(ssid))
+ 			num++;
+@@ -4104,7 +4124,7 @@ void wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s,
+ 	struct wpas_dbus_priv *priv = wpa_s->global->dbus;
+ 
+ 	/* Do nothing if the control interface is not turned on */
+-	if (priv == NULL)
++	if (priv == NULL || !wpa_s->dbus_new_path)
+ 		return;
+ 
+ 	if (wpa_s->preq_notify_peer == NULL)
+--
+cgit v0.9.2
diff --git a/wpa_supplicant.spec b/wpa_supplicant.spec
index ec0799c..c41e18f 100644
--- a/wpa_supplicant.spec
+++ b/wpa_supplicant.spec
@@ -7,7 +7,7 @@ Summary: WPA/WPA2/IEEE 802.1X Supplicant
 Name: wpa_supplicant
 Epoch: 1
 Version: 2.4
-Release: 2%{?dist}
+Release: 3%{?dist}
 License: BSD
 Group: System Environment/Base
 Source0: http://w1.fi/releases/%{name}-%{version}%{rcver}%{snapshot}.tar.gz
@@ -38,6 +38,9 @@ Patch8: rh837402-less-aggressive-roaming.patch
 # CVE-2015-1863, backport from upstream master, will be in 2.5
 # http://w1.fi/cgit/hostap/commit/?id=9ed4eee345f85e3025c33c6e20aa25696e341ccd
 Patch9: 0001-P2P-Validate-SSID-element-length-before-copying-it-C.patch
+# Fix a crash - rh #1231973
+# http://w1.fi/cgit/hostap/commit/wpa_supplicant/dbus/dbus_new_handlers.c?id=8a78e227df1ead19be8e12a4108e448887e64d6f
+Patch10: rh1231973-dbus-fix-operations-for-p2p-mgmt.patch
 
 URL: http://w1.fi/wpa_supplicant/
 
@@ -89,6 +92,7 @@ Graphical User Interface for wpa_supplicant written using QT
 %patch6 -p1 -b .qt4
 %patch8 -p1 -b .rh837402-less-aggressive-roaming
 %patch9 -p1 -b .cve-2015-1863
+%patch10 -p1 -b .rh1231973-dbus-fix-operations-for-p2p-mgmt
 
 %build
 pushd wpa_supplicant
@@ -203,6 +207,9 @@ fi
 %endif
 
 %changelog
+* Tue Jun 16 2015 Jiří Klimeš <jklimes@redhat.com> - 1:2.4-3
+- Fix a crash if P2P management interface is used (rh #1231973)
+
 * Thu Apr 23 2015 Dan Williams <dcbw@redhat.com> - 1:2.4-2
 - Remove obsolete wpa_supplicant-openssl-more-algs.patch