X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fnetwork.c;h=439b0cef704d7d22404f73561faf4d2b3241729c;hb=d38c16d60f9d1b10cb60f010ce086135e6ecbe07;hp=311bfb5a676e464d71d6448e64ffff067846ac11;hpb=fbcd49e749c383728f81174280f976ae0d2be2c7;p=collectd.git diff --git a/src/network.c b/src/network.c index 311bfb5a..439b0cef 100644 --- a/src/network.c +++ b/src/network.c @@ -39,9 +39,6 @@ #if HAVE_PTHREAD_H # include #endif -#if HAVE_SYS_SOCKET_H -# include -#endif #if HAVE_NETDB_H # include #endif @@ -772,18 +769,18 @@ static int write_part_string (char **ret_buffer, int *ret_buffer_len, } /* int write_part_string */ static int parse_part_values (void **ret_buffer, size_t *ret_buffer_len, - value_t **ret_values, int *ret_num_values) + value_t **ret_values, size_t *ret_num_values) { char *buffer = *ret_buffer; size_t buffer_len = *ret_buffer_len; uint16_t tmp16; size_t exp_size; - int i; + size_t i; uint16_t pkg_length; uint16_t pkg_type; - uint16_t pkg_numval; + size_t pkg_numval; uint8_t *pkg_types; value_t *pkg_values; @@ -805,7 +802,7 @@ static int parse_part_values (void **ret_buffer, size_t *ret_buffer_len, memcpy ((void *) &tmp16, buffer, sizeof (tmp16)); buffer += sizeof (tmp16); - pkg_numval = ntohs (tmp16); + pkg_numval = (size_t) ntohs (tmp16); assert (pkg_type == TYPE_VALUES); @@ -820,6 +817,7 @@ static int parse_part_values (void **ret_buffer, size_t *ret_buffer_len, exp_size, buffer_len); return (-1); } + assert (pkg_numval <= ((buffer_len - 6) / 9)); if (pkg_length != exp_size) { @@ -829,20 +827,20 @@ static int parse_part_values (void **ret_buffer, size_t *ret_buffer_len, return (-1); } - pkg_types = (uint8_t *) malloc (pkg_numval * sizeof (uint8_t)); - pkg_values = (value_t *) malloc (pkg_numval * sizeof (value_t)); + pkg_types = calloc (pkg_numval, sizeof (*pkg_types)); + pkg_values = calloc (pkg_numval, sizeof (*pkg_values)); if ((pkg_types == NULL) || (pkg_values == NULL)) { sfree (pkg_types); sfree (pkg_values); - ERROR ("network plugin: parse_part_values: malloc failed."); + ERROR ("network plugin: parse_part_values: calloc failed."); return (-1); } - memcpy ((void *) pkg_types, (void *) buffer, pkg_numval * sizeof (uint8_t)); - buffer += pkg_numval * sizeof (uint8_t); - memcpy ((void *) pkg_values, (void *) buffer, pkg_numval * sizeof (value_t)); - buffer += pkg_numval * sizeof (value_t); + memcpy (pkg_types, buffer, pkg_numval * sizeof (*pkg_types)); + buffer += pkg_numval * sizeof (*pkg_types); + memcpy (pkg_values, buffer, pkg_numval * sizeof (*pkg_values)); + buffer += pkg_numval * sizeof (*pkg_values); for (i = 0; i < pkg_numval; i++) { @@ -2028,6 +2026,7 @@ static sockent_t *sockent_create (int type) /* {{{ */ if (type == SOCKENT_TYPE_SERVER) { se->data.server.fd = NULL; + se->data.server.fd_num = 0; #if HAVE_LIBGCRYPT se->data.server.security_level = SECURITY_LEVEL_NONE; se->data.server.auth_file = NULL; @@ -2241,6 +2240,9 @@ static int sockent_server_listen (sockent_t *se) /* {{{ */ if (se == NULL) return (-1); + assert (se->data.server.fd == NULL); + assert (se->data.server.fd_num == 0); + node = se->node; service = se->service; @@ -2439,14 +2441,14 @@ static int network_receive (void) /* {{{ */ char buffer[network_config_packet_size]; int buffer_len; - int i; - int status; + size_t i; + int status = 0; receive_list_entry_t *private_list_head; receive_list_entry_t *private_list_tail; uint64_t private_list_length; - assert (listen_sockets_num > 0); + assert (listen_sockets_num > 0); private_list_head = NULL; private_list_tail = NULL; @@ -2455,15 +2457,14 @@ static int network_receive (void) /* {{{ */ while (listen_loop == 0) { status = poll (listen_sockets_pollfd, listen_sockets_num, -1); - if (status <= 0) { char errbuf[1024]; if (errno == EINTR) continue; - ERROR ("poll failed: %s", + ERROR ("network plugin: poll(2) failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); - return (-1); + break; } for (i = 0; (i < listen_sockets_num) && (status > 0); i++) @@ -2481,10 +2482,10 @@ static int network_receive (void) /* {{{ */ if (buffer_len < 0) { char errbuf[1024]; - ERROR ("recv failed: %s", - sstrerror (errno, errbuf, - sizeof (errbuf))); - return (-1); + status = (errno != 0) ? errno : -1; + ERROR ("network plugin: recv(2) failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + break; } stats_octets_rx += ((uint64_t) buffer_len); @@ -2498,7 +2499,8 @@ static int network_receive (void) /* {{{ */ if (ent == NULL) { ERROR ("network plugin: malloc failed."); - return (-1); + status = ENOMEM; + break; } memset (ent, 0, sizeof (receive_list_entry_t)); ent->data = malloc (network_config_packet_size); @@ -2506,7 +2508,8 @@ static int network_receive (void) /* {{{ */ { sfree (ent); ERROR ("network plugin: malloc failed."); - return (-1); + status = ENOMEM; + break; } ent->fd = listen_sockets_pollfd[i].fd; ent->next = NULL; @@ -2542,7 +2545,12 @@ static int network_receive (void) /* {{{ */ private_list_tail = NULL; private_list_length = 0; } + + status = 0; } /* for (listen_sockets_pollfd) */ + + if (status != 0) + break; } /* while (listen_loop == 0) */ /* Make sure everything is dispatched before exiting. */ @@ -2557,15 +2565,11 @@ static int network_receive (void) /* {{{ */ receive_list_tail = private_list_tail; receive_list_length += private_list_length; - private_list_head = NULL; - private_list_tail = NULL; - private_list_length = 0; - pthread_cond_signal (&receive_list_cond); pthread_mutex_unlock (&receive_list_lock); } - return (0); + return (status); } /* }}} int network_receive */ static void *receive_thread (void __attribute__((unused)) *arg) @@ -3099,7 +3103,7 @@ static int network_config_add_listen (const oconfig_item_t *ci) /* {{{ */ status = sockent_server_listen (se); if (status != 0) { - ERROR ("network plugin: network_config_add_server: sockent_server_listen failed."); + ERROR ("network plugin: network_config_add_listen: sockent_server_listen failed."); sockent_destroy (se); return (-1); }