Skip to contentSkip to conversation

libibumad: Fix memory leak in resolve_ca_port

PATCH New Hal Rosenstock 1 participant 1 message Feb 21, 2013 InfiniBand

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 libibumad: Fix memory leak in resolve_ca_port

---

src/umad.c +29 -16
index 45a9423..8f817d2 100644
@@ -234,7 +234,7 @@ static int resolve_ca_port(char *ca_name, int *port)
 {
 	umad_ca_t ca;
 	int active = -1, up = -1;
-	int i;
+	int i, ret = 0;
 
 	TRACE("checking ca '%s'", ca_name);
 
@@ -243,19 +243,27 @@ static int resolve_ca_port(char *ca_name, int *port)
 
 	if (ca.node_type == 2) {
 		*port = 0;	/* switch sma port 0 */
-		return 1;
+		ret = 1;
+		goto Exit;
 	}
 
 	if (*port > 0) {	/* check only the port the user wants */
-		if (*port > ca.numports)
-			return -1;
-		if (!ca.ports[*port])
-			return -1;
-		if (ca.ports[*port]->state == 4)
-			return 1;
+		if (*port > ca.numports) {
+			ret = -1;
+			goto Exit;
+		}
+		if (!ca.ports[*port]) {
+			ret = -1;
+			goto Exit;
+		}
+		if (ca.ports[*port]->state == 4) {
+			ret = 1;
+			goto Exit;
+		}
 		if (ca.ports[*port]->phys_state != 3)
-			return 0;
-		return -1;
+			goto Exit;
+		ret = -1;
+		goto Exit;
 	}
 
 	for (i = 0; i <= ca.numports; i++) {
@@ -283,13 +291,18 @@ static int resolve_ca_port(char *ca_name, int *port)
 		}
 	}
 
+	if (active >= 0) {
+		ret = 1;
+		goto Exit;
+	}
+	if (up >= 0) {
+		ret = 0;
+		goto Exit;
+	}
+	ret = -1;
+Exit:
 	release_ca(&ca);
-
-	if (active >= 0)
-		return 1;
-	if (up >= 0)
-		return 0;
-	return -1;
+	return ret;
 }
 
 static char *resolve_ca_name(char *ca_name, int *best_port)

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html