]> granicus.if.org Git - libnl/commitdiff
route: free previous data in rtnl_netem_set_delay_distribution_data()
authorThomas Haller <thaller@redhat.com>
Tue, 16 Jan 2018 06:23:51 +0000 (07:23 +0100)
committerThomas Haller <thaller@redhat.com>
Tue, 16 Jan 2018 06:26:50 +0000 (07:26 +0100)
Otherwise, calling rtnl_netem_set_delay_distribution_data() will
leak memory, and that should just be supported.

Also, handle failure to allocate memory.

lib/route/qdisc/netem.c

index 05c2eb99c80d46196b95b83bbe7a7a2a30d1e6c1..b0ee2a6d5745c6ac3cf7969d95f9fc7c404e4c93 100644 (file)
@@ -873,6 +873,7 @@ int rtnl_netem_get_delay_distribution(struct rtnl_qdisc *qdisc, int16_t **dist_p
  */
 int rtnl_netem_set_delay_distribution_data(struct rtnl_qdisc *qdisc, const int16_t *data, size_t len) {
        struct rtnl_netem *netem;
+       int16_t *new_data;
 
        if (!(netem = rtnl_tc_data(TC_CAST(qdisc))))
                BUG();
@@ -880,7 +881,12 @@ int rtnl_netem_set_delay_distribution_data(struct rtnl_qdisc *qdisc, const int16
        if (len > MAXDIST)
                return -NLE_INVAL;
 
-       netem->qnm_dist.dist_data = (int16_t *) calloc(len, sizeof(int16_t));
+       new_data = (int16_t *) calloc(len, sizeof(int16_t));
+       if (!new_data)
+               return -NLE_NOMEM;
+
+       free (netem->qnm_dist.dist_data);
+       netem->qnm_dist.dist_data = new_data;
 
        memcpy(netem->qnm_dist.dist_data, data, len * sizeof(int16_t));