Merge branch 'collectd-5.6' into collectd-5.7
[collectd.git] / src / snmp.c
index 287f44b..74068ec 100644 (file)
@@ -706,11 +706,11 @@ static int csnmp_config_add_host(oconfig_item_t *ci) {
 
   ssnprintf(cb_name, sizeof(cb_name), "snmp-%s", hd->name);
 
-  user_data_t ud = {.data = hd, .free_func = csnmp_host_definition_destroy};
-
-  status =
-      plugin_register_complex_read(/* group = */ NULL, cb_name, csnmp_read_host,
-                                   hd->interval, /* user_data = */ &ud);
+  status = plugin_register_complex_read(
+      /* group = */ NULL, cb_name, csnmp_read_host, hd->interval,
+      &(user_data_t){
+          .data = hd, .free_func = csnmp_host_definition_destroy,
+      });
   if (status != 0) {
     ERROR("snmp plugin: Registering complex read function failed.");
     csnmp_host_definition_destroy(hd);
@@ -1357,12 +1357,17 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
     if (oid_list_todo_num == 0) {
       /* The request is still empty - so we are finished */
       DEBUG("snmp plugin: all variables have left their subtree");
+      snmp_free_pdu(req);
       status = 0;
       break;
     }
 
     res = NULL;
     status = snmp_sess_synch_response(host->sess_handle, req, &res);
+
+    /* snmp_sess_synch_response always frees our req PDU */
+    req = NULL;
+
     if ((status != STAT_SUCCESS) || (res == NULL)) {
       char *errstr = NULL;
 
@@ -1376,8 +1381,6 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
         snmp_free_pdu(res);
       res = NULL;
 
-      /* snmp_synch_response already freed our PDU */
-      req = NULL;
       sfree(errstr);
       csnmp_host_close_session(host);
 
@@ -1492,9 +1495,6 @@ static int csnmp_read_table(host_definition_t *host, data_definition_t *data) {
     snmp_free_pdu(res);
   res = NULL;
 
-  if (req != NULL)
-    snmp_free_pdu(req);
-  req = NULL;
 
   if (status == 0)
     csnmp_dispatch_table(host, data, instance_list_head, value_list_head);