snmp_agent: Added a check for llist_create() result
[collectd.git] / src / snmp_agent.c
index 6cbe881..fe1ecd5 100644 (file)
@@ -163,9 +163,9 @@ static void snmp_agent_dump_data(void) {
         DEBUG(PLUGIN_NAME ":     Type: %s", dd->type);
       if (dd->type_instance)
         DEBUG(PLUGIN_NAME ":     TypeInstance: %s", dd->type_instance);
-      for (int i = 0; i < dd->oids_len; i++) {
+      for (size_t i = 0; i < dd->oids_len; i++) {
         snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &dd->oids[i]);
-        DEBUG(PLUGIN_NAME ":     OID[%d]: %s", i, oid_str);
+        DEBUG(PLUGIN_NAME ":     OID[%zu]: %s", i, oid_str);
       }
       DEBUG(PLUGIN_NAME ":   Scale: %g", dd->scale);
       DEBUG(PLUGIN_NAME ":   Shift: %g", dd->shift);
@@ -187,9 +187,9 @@ static void snmp_agent_dump_data(void) {
       DEBUG(PLUGIN_NAME ":   Type: %s", dd->type);
     if (dd->type_instance)
       DEBUG(PLUGIN_NAME ":   TypeInstance: %s", dd->type_instance);
-    for (int i = 0; i < dd->oids_len; i++) {
+    for (size_t i = 0; i < dd->oids_len; i++) {
       snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &dd->oids[i]);
-      DEBUG(PLUGIN_NAME ":   OID[%d]: %s", i, oid_str);
+      DEBUG(PLUGIN_NAME ":   OID[%zu]: %s", i, oid_str);
     }
     DEBUG(PLUGIN_NAME ":   Scale: %g", dd->scale);
     DEBUG(PLUGIN_NAME ":   Shift: %g", dd->shift);
@@ -282,7 +282,7 @@ static int snmp_agent_validate_data(void) {
   return 0;
 }
 
-static void snmp_agent_generate_oid2string(oid_t *oid, int offset, char *key) {
+static void snmp_agent_generate_oid2string(oid_t *oid, size_t offset, char *key) {
   int key_len = oid->oid[offset];
   int i;
 
@@ -352,7 +352,7 @@ static int snmp_agent_table_row_remove(table_definition_t *td,
   for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
     data_definition_t *dd = de->value;
 
-    for (int i = 0; i < dd->oids_len; i++)
+    for (size_t i = 0; i < dd->oids_len; i++)
       if (td->index_oid.oid_len)
         snmp_agent_unregister_oid_index(&dd->oids[i], *index);
       else
@@ -417,7 +417,7 @@ static void snmp_agent_free_data(data_definition_t **dd) {
 
   /* unregister scalar type OID */
   if ((*dd)->table == NULL) {
-    for (int i = 0; i < (*dd)->oids_len; i++)
+    for (size_t i = 0; i < (*dd)->oids_len; i++)
       unregister_mib((*dd)->oids[i].oid, (*dd)->oids[i].oid_len);
   }
   if (!(*dd)->table->index_oid.oid_len) {
@@ -426,7 +426,7 @@ static void snmp_agent_free_data(data_definition_t **dd) {
     c_avl_iterator_t *iter = c_avl_get_iterator((*dd)->table->instance_index);
     while (c_avl_iterator_next(iter, (void *)&instance, (void *)&instance) ==
            0) {
-      for (int i = 0; i < (*dd)->oids_len; i++)
+      for (size_t i = 0; i < (*dd)->oids_len; i++)
         snmp_agent_unregister_oid_string(&(*dd)->oids[i], instance);
     }
     c_avl_iterator_destroy(iter);
@@ -437,7 +437,7 @@ static void snmp_agent_free_data(data_definition_t **dd) {
 
     c_avl_iterator_t *iter = c_avl_get_iterator((*dd)->table->index_instance);
     while (c_avl_iterator_next(iter, (void *)&index, (void *)&value) == 0) {
-      for (int i = 0; i < (*dd)->oids_len; i++)
+      for (size_t i = 0; i < (*dd)->oids_len; i++)
         snmp_agent_unregister_oid_index(&(*dd)->oids[i], *index);
     }
     c_avl_iterator_destroy(iter);
@@ -529,7 +529,7 @@ static int snmp_agent_form_reply(struct netsnmp_request_info_s *requests,
   }
 
   assert(ds->ds_num == values_num);
-  assert(oid_index < values_num);
+  assert(oid_index < (int)values_num);
 
   char data[DATA_MAX_NAME_LEN];
   size_t data_len = sizeof(data);
@@ -545,8 +545,8 @@ static int snmp_agent_form_reply(struct netsnmp_request_info_s *requests,
   }
 
   requests->requestvb->type = dd->oids[oid_index].type;
-  snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type, data,
-                           data_len);
+  snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type,
+                           (const u_char *)data, data_len);
 
   return SNMP_ERR_NOERROR;
 }
@@ -581,7 +581,7 @@ snmp_agent_table_oid_handler(struct netsnmp_mib_handler_s *handler,
     for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
       data_definition_t *dd = de->value;
 
-      for (int i = 0; i < dd->oids_len; i++) {
+      for (size_t i = 0; i < dd->oids_len; i++) {
         int ret = snmp_oid_ncompare(oid.oid, oid.oid_len, dd->oids[i].oid,
                                     dd->oids[i].oid_len,
                                     MIN(oid.oid_len, dd->oids[i].oid_len));
@@ -617,7 +617,7 @@ snmp_agent_table_oid_handler(struct netsnmp_mib_handler_s *handler,
         if (dd->is_instance) {
           requests->requestvb->type = ASN_OCTET_STR;
           snmp_set_var_typed_value(requests->requestvb,
-                                   requests->requestvb->type, instance,
+                                   requests->requestvb->type, (const u_char *)instance,
                                    strlen((instance)));
 
           pthread_mutex_unlock(&g_agent->lock);
@@ -678,7 +678,7 @@ static int snmp_agent_table_index_oid_handler(
 
       requests->requestvb->type = ASN_INTEGER;
       snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type,
-                               &index, sizeof(index));
+                               (const u_char *)&index, sizeof(index));
 
       pthread_mutex_unlock(&g_agent->lock);
 
@@ -724,7 +724,7 @@ static int snmp_agent_table_size_oid_handler(
 
       requests->requestvb->type = td->size_oid.type;
       snmp_set_var_typed_value(requests->requestvb, requests->requestvb->type,
-                               &size, sizeof(size));
+                               (const u_char *)&size, sizeof(size));
 
       pthread_mutex_unlock(&g_agent->lock);
 
@@ -765,7 +765,7 @@ snmp_agent_scalar_oid_handler(struct netsnmp_mib_handler_s *handler,
        de = de->next) {
     data_definition_t *dd = de->value;
 
-    for (int i = 0; i < dd->oids_len; i++) {
+    for (size_t i = 0; i < dd->oids_len; i++) {
 
       int ret = snmp_oid_compare(oid.oid, oid.oid_len, dd->oids[i].oid,
                                  dd->oids[i].oid_len);
@@ -803,7 +803,7 @@ static int snmp_agent_register_table_oids(void) {
     for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
       data_definition_t *dd = de->value;
 
-      for (int i = 0; i < dd->oids_len; i++) {
+      for (size_t i = 0; i < dd->oids_len; i++) {
         dd->oids[i].type =
             snmp_agent_get_asn_type(dd->oids[i].oid, dd->oids[i].oid_len);
       }
@@ -818,7 +818,7 @@ static int snmp_agent_register_scalar_oids(void) {
   for (llentry_t *e = llist_head(g_agent->scalars); e != NULL; e = e->next) {
     data_definition_t *dd = e->value;
 
-    for (int i = 0; i < dd->oids_len; i++) {
+    for (size_t i = 0; i < dd->oids_len; i++) {
 
       dd->oids[i].type =
           snmp_agent_get_asn_type(dd->oids[i].oid, dd->oids[i].oid_len);
@@ -1284,7 +1284,7 @@ static int snmp_agent_update_index(table_definition_t *td,
   for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
     data_definition_t *dd = de->value;
 
-    for (int i = 0; i < dd->oids_len; i++) {
+    for (size_t i = 0; i < dd->oids_len; i++) {
       if (td->index_oid.oid_len) {
         ret = snmp_agent_register_oid_index(&dd->oids[i], *index,
                                             snmp_agent_table_oid_handler);
@@ -1364,12 +1364,21 @@ static int snmp_agent_preinit(void) {
   g_agent->tables = llist_create();
   g_agent->scalars = llist_create();
 
+  if (g_agent->tables == NULL || g_agent->scalars == NULL) {
+    ERROR(PLUGIN_NAME ": llist_create() failed");
+    llist_destroy(g_agent->scalars);
+    llist_destroy(g_agent->tables);
+    return -ENOMEM;
+  }
+
   int err;
   /* make us a agentx client. */
   err = netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE,
                                1);
   if (err != 0) {
     ERROR(PLUGIN_NAME ": Failed to set agent role (%d)", err);
+    llist_destroy(g_agent->scalars);
+    llist_destroy(g_agent->tables);
     return -1;
   }
 
@@ -1381,6 +1390,8 @@ static int snmp_agent_preinit(void) {
   err = init_agent(PLUGIN_NAME);
   if (err != 0) {
     ERROR(PLUGIN_NAME ": Failed to initialize the agent library (%d)", err);
+    llist_destroy(g_agent->scalars);
+    llist_destroy(g_agent->tables);
     return -1;
   }
 
@@ -1406,13 +1417,6 @@ static int snmp_agent_init(void) {
   if (ret != 0)
     return ret;
 
-  /* create a second thread to listen for requests from AgentX*/
-  ret = pthread_create(&g_agent->thread, NULL, &snmp_agent_thread_run, NULL);
-  if (ret != 0) {
-    ERROR(PLUGIN_NAME ": Failed to create a separate thread, err %u", ret);
-    return ret;
-  }
-
   ret = pthread_mutex_init(&g_agent->lock, NULL);
   if (ret != 0) {
     ERROR(PLUGIN_NAME ": Failed to initialize mutex, err %u", ret);
@@ -1425,6 +1429,13 @@ static int snmp_agent_init(void) {
     return ret;
   }
 
+  /* create a second thread to listen for requests from AgentX*/
+  ret = pthread_create(&g_agent->thread, NULL, &snmp_agent_thread_run, NULL);
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME ": Failed to create a separate thread, err %u", ret);
+    return ret;
+  }
+
   return 0;
 }