From: Florian Forster Date: Thu, 28 Jul 2016 13:20:37 +0000 (+0200) Subject: grpc plugin: Free the cache iterator when returning due to an error. X-Git-Tag: collectd-5.6.0~140^2 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=854243b81d2aef7f23dda6f29cf138aa78fa98f4;p=collectd.git grpc plugin: Free the cache iterator when returning due to an error. --- diff --git a/src/grpc.cc b/src/grpc.cc index a1dac35b..05ab8211 100644 --- a/src/grpc.cc +++ b/src/grpc.cc @@ -289,28 +289,38 @@ static grpc::Status Process(grpc::ServerContext *ctx, while (uc_iterator_next(iter, &name) == 0) { value_list_t res; - if (parse_identifier_vl(name, &res) != 0) + if (parse_identifier_vl(name, &res) != 0) { + uc_iterator_destroy(iter); return grpc::Status(grpc::StatusCode::INTERNAL, grpc::string("failed to parse identifier")); + } if (!ident_matches(&res, &matcher)) continue; - if (uc_iterator_get_time(iter, &res.time) < 0) + if (uc_iterator_get_time(iter, &res.time) < 0) { + uc_iterator_destroy(iter); return grpc::Status(grpc::StatusCode::INTERNAL, grpc::string("failed to retrieve value timestamp")); - if (uc_iterator_get_interval(iter, &res.interval) < 0) + } + if (uc_iterator_get_interval(iter, &res.interval) < 0) { + uc_iterator_destroy(iter); return grpc::Status(grpc::StatusCode::INTERNAL, grpc::string("failed to retrieve value interval")); - if (uc_iterator_get_values(iter, &res.values, &res.values_len) < 0) + } + if (uc_iterator_get_values(iter, &res.values, &res.values_len) < 0) { + uc_iterator_destroy(iter); return grpc::Status(grpc::StatusCode::INTERNAL, grpc::string("failed to retrieve values")); + } auto vl = reply->add_values(); status = marshal_value_list(&res, vl); free(res.values); - if (!status.ok()) + if (!status.ok()) { + uc_iterator_destroy(iter); return status; + } } uc_iterator_destroy(iter);