[ofa-general] [PATCH] libibmad/mad.c: Validate DR hop count for SMPs and handle errors
Hal Rosenstock
hnrose at comcast.net
Fri Jul 31 07:57:29 PDT 2009
In mad_encode, validate DR hop count for SMPs
In mad_build_pkt, handle mad_encode error
Signed-off-by: Hal Rosenstock <hal.rosenstock at gmail.com>
---
diff --git a/libibmad/src/mad.c b/libibmad/src/mad.c
index 3f04da0..89ff978 100644
--- a/libibmad/src/mad.c
+++ b/libibmad/src/mad.c
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2004-2007 Voltaire Inc. All rights reserved.
+ * Copyright (c) 2009 HNR Consulting. All rights reserved.
*
* This software is available to you under a choice of one of two
* licenses. You may choose to be licensed under the terms of the GNU
@@ -79,6 +80,10 @@ void *mad_encode(void *buf, ib_rpc_t * rpc, ib_dr_path_t * drpath, void *data)
IBWARN("encoding dr mad without drpath (null)");
return 0;
}
+ if (drpath->cnt >= IB_SUBNET_PATH_HOPS_MAX) {
+ IBWARN("dr path with hop count %d", drpath->cnt);
+ return 0;
+ }
mad_set_field(buf, 0, IB_DRSMP_HOPCNT_F, drpath->cnt);
mad_set_field(buf, 0, IB_DRSMP_HOPPTR_F,
is_resp ? drpath->cnt + 1 : 0x0);
@@ -157,6 +162,8 @@ int mad_build_pkt(void *umad, ib_rpc_t * rpc, ib_portid_t * dport,
mad = umad_get_mad(umad);
p = mad_encode(mad, rpc, lid_routed ? 0 : &dport->drpath, data);
+ if (!p)
+ return -1;
if (!is_smi && rmpp) {
mad_set_field(mad, 0, IB_SA_RMPP_VERS_F, 1);
More information about the general
mailing list