Przeglądaj źródła

benchmark: avoid memory leaks when dealing with invalid mi commands

Daniel-Constantin Mierla 11 lat temu
rodzic
commit
89c48cda56
1 zmienionych plików z 22 dodań i 7 usunięć
  1. 22 7
      modules/benchmark/benchmark.c

+ 22 - 7
modules/benchmark/benchmark.c

@@ -524,27 +524,36 @@ struct mi_root* mi_bm_enable_timer(struct mi_root *cmd, void *param)
 		return init_mi_tree( 400, MI_MISSING_PARM_S, MI_MISSING_PARM_LEN);
 
 	p1 = pkg_strndup(node->value.s, node->value.len);
+	p2 = pkg_strndup(node->next->value.s, node->next->value.len);
+	if(!p1 || !p2)
+		goto error;
 
 	if(_bm_register_timer(p1, 0, &id)!=0)
 	{
 		pkg_free(p1);
+		pkg_free(p2);
 		return init_mi_tree( 400, MI_BAD_PARM_S, MI_BAD_PARM_LEN);
 	}
-	p2 = pkg_strndup(node->next->value.s, node->next->value.len);
 	v2 = strtol(p2, &e2, 0);
 	
 	pkg_free(p1);
-	pkg_free(p2);
 
-	if (*e2 != '\0' || *p2 == '\0')
+	if (*e2 != '\0' || *p2 == '\0') {
+		pkg_free(p2);
 		return init_mi_tree( 400, MI_BAD_PARM_S, MI_BAD_PARM_LEN);
+	}
 
+	pkg_free(p2);
 	if ((v2 < 0) || (v2 > 1))
 		return init_mi_tree( 400, MI_BAD_PARM_S, MI_BAD_PARM_LEN);
 
 	bm_mycfg->timers[id].enabled = v2;
 
 	return init_mi_tree( 200, MI_OK_S, MI_OK_LEN);
+error:
+	if(p1) pkg_free(p1);
+	if(p2) pkg_free(p2);
+	return init_mi_tree(500, MI_INTERNAL_ERR_S, MI_INTERNAL_ERR_LEN);
 }
 
 struct mi_root* mi_bm_granularity(struct mi_root *cmd, void *param)
@@ -563,10 +572,13 @@ struct mi_root* mi_bm_granularity(struct mi_root *cmd, void *param)
 
 	v1 = strtol(p1, &e1, 0);
 
-	pkg_free(p1);
-
 	if ((*e1 != '\0') || (*p1 == '\0'))
+	{
+		pkg_free(p1);
 		return init_mi_tree( 400, MI_BAD_PARM_S, MI_BAD_PARM_LEN);
+	}
+
+	pkg_free(p1);
 
 	if (v1 < 1)
 		return init_mi_tree( 400, MI_BAD_PARM_S, MI_BAD_PARM_LEN);
@@ -592,10 +604,13 @@ struct mi_root* mi_bm_loglevel(struct mi_root *cmd, void *param)
 
 	v1 = strtol(p1, &e1, 0);
 	
-	pkg_free(p1);
-
 	if ((*e1 != '\0') || (*p1 == '\0'))
+	{
+		pkg_free(p1);
 		return init_mi_tree( 400, MI_BAD_PARM_S, MI_BAD_PARM_LEN);
+	}
+
+	pkg_free(p1);
 
 	if ((v1 < -3) || (v1 > 4)) /* Maximum log levels */
 		return init_mi_tree( 400, MI_BAD_PARM_S, MI_BAD_PARM_LEN);