[openib-general] [PATCH] mad: In handle_outgoing_smp, validate process_mad routine exists prior to calling it

Hal Rosenstock halr at voltaire.com
Wed Nov 10 09:26:00 PST 2004


mad: In handle_outgoing_smp, validate process_mad routine exists prior
to calling it (issue pointed out by KK)

Index: mad.c
===================================================================
--- mad.c	(revision 1189)
+++ mad.c	(working copy)
@@ -405,30 +405,32 @@
 			goto error1;
 		}
 
-		mad_agent_priv = container_of(mad_agent,
-					      struct ib_mad_agent_private,
-					      agent);
-		ret = mad_agent->device->process_mad(
-					mad_agent->device,
-					0,
-					mad_agent->port_num,
-					smp->dr_slid, /* ? */
-					(struct ib_mad *)smp,
-					(struct ib_mad *)&mad_priv->mad);
-		if ((ret & IB_MAD_RESULT_SUCCESS) &&
-		    (ret & IB_MAD_RESULT_REPLY)) {
-			if (!smi_handle_dr_smp_recv(
-					(struct ib_smp *)&mad_priv->mad,
-					mad_agent->device->node_type,
-					mad_agent->port_num,
-					mad_agent->device->phys_port_cnt)) {
-				ret = -EINVAL;
-				kmem_cache_free(ib_mad_cache, mad_priv);
-				goto error1;
+		if (mad_agent->device->process_mad) {
+			ret = mad_agent->device->process_mad(
+					    mad_agent->device,
+					    0,
+					    mad_agent->port_num,
+					    smp->dr_slid, /* ? */
+					    (struct ib_mad *)smp,
+					    (struct ib_mad *)&mad_priv->mad);
+			if ((ret & IB_MAD_RESULT_SUCCESS) &&
+			    (ret & IB_MAD_RESULT_REPLY)) {
+				if (!smi_handle_dr_smp_recv(
+					    (struct ib_smp *)&mad_priv->mad,
+					    mad_agent->device->node_type,
+					    mad_agent->port_num,
+					    mad_agent->device->phys_port_cnt)) {
+					ret = -EINVAL;
+					kmem_cache_free(ib_mad_cache, mad_priv);
+					goto error1;
+				}
 			}
 		}
 
 		/* See if response is solicited and there is a recv handler */
+		mad_agent_priv = container_of(mad_agent,
+					      struct ib_mad_agent_private,
+					      agent);
 		if (solicited_mad(&mad_priv->mad.mad) && 
 		    mad_agent_priv->agent.recv_handler) {
 			struct ib_wc wc;






More information about the general mailing list