summaryrefslogtreecommitdiffstats
path: root/plugins/check_ntp.c
diff options
context:
space:
mode:
authorHolger Weiss <hweiss@users.sourceforge.net>2007-04-02 12:39:30 (GMT)
committerHolger Weiss <hweiss@users.sourceforge.net>2007-04-02 12:39:30 (GMT)
commitdcbf7bdf6b67a41e749271f60b4ee0f1f34abc34 (patch)
treef2cb66e35557476893481f92a8ab13599555a1c0 /plugins/check_ntp.c
parenteca20aa3a05b66f6f8182b6f927e2514b90bd4c7 (diff)
downloadmonitoring-plugins-dcbf7bdf6b67a41e749271f60b4ee0f1f34abc34.tar.gz
Don't rely on the assumption that the size of a READSTAT response is a
multiple of sizeof(ntp_assoc_status_pair). git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1673 f882894a-f735-0410-b71e-b25c423dba1c
Diffstat (limited to 'plugins/check_ntp.c')
-rw-r--r--plugins/check_ntp.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/plugins/check_ntp.c b/plugins/check_ntp.c
index 99fa9a2..8a08af5 100644
--- a/plugins/check_ntp.c
+++ b/plugins/check_ntp.c
@@ -501,7 +501,7 @@ setup_control_request(ntp_control_message *p, uint8_t opcode, uint16_t seq){
501double jitter_request(const char *host, int *status){ 501double jitter_request(const char *host, int *status){
502 int conn=-1, i, npeers=0, num_candidates=0, syncsource_found=0; 502 int conn=-1, i, npeers=0, num_candidates=0, syncsource_found=0;
503 int run=0, min_peer_sel=PEER_INCLUDED, num_selected=0, num_valid=0; 503 int run=0, min_peer_sel=PEER_INCLUDED, num_selected=0, num_valid=0;
504 int peer_offset=0; 504 int peers_size=0, peer_offset=0;
505 ntp_assoc_status_pair *peers=NULL; 505 ntp_assoc_status_pair *peers=NULL;
506 ntp_control_message req; 506 ntp_control_message req;
507 double rval = 0.0, jitter = -1.0; 507 double rval = 0.0, jitter = -1.0;
@@ -539,11 +539,12 @@ double jitter_request(const char *host, int *status){
539 /* Each peer identifier is 4 bytes in the data section, which 539 /* Each peer identifier is 4 bytes in the data section, which
540 * we represent as a ntp_assoc_status_pair datatype. 540 * we represent as a ntp_assoc_status_pair datatype.
541 */ 541 */
542 npeers+=(ntohs(req.count)/sizeof(ntp_assoc_status_pair)); 542 peers_size+=ntohs(req.count);
543 if((tmp=realloc(peers, sizeof(ntp_assoc_status_pair)*npeers)) == NULL) 543 if((tmp=realloc(peers, peers_size)) == NULL)
544 free(peers), die(STATE_UNKNOWN, "can not (re)allocate 'peers' buffer\n"); 544 free(peers), die(STATE_UNKNOWN, "can not (re)allocate 'peers' buffer\n");
545 peers=tmp; 545 peers=tmp;
546 memcpy((void*)((ptrdiff_t)peers+peer_offset), (void*)req.data, ntohs(req.count)); 546 memcpy((void*)((ptrdiff_t)peers+peer_offset), (void*)req.data, ntohs(req.count));
547 npeers=peers_size/sizeof(ntp_assoc_status_pair);
547 peer_offset+=ntohs(req.count); 548 peer_offset+=ntohs(req.count);
548 } while(req.op&REM_MORE); 549 } while(req.op&REM_MORE);
549 550
@@ -596,8 +597,8 @@ double jitter_request(const char *host, int *status){
596 printf("parsing jitter from peer %.2x: ", ntohs(peers[i].assoc)); 597 printf("parsing jitter from peer %.2x: ", ntohs(peers[i].assoc));
597 } 598 }
598 startofvalue = strchr(req.data, '='); 599 startofvalue = strchr(req.data, '=');
599 if(startofvalue != NULL) startofvalue++;
600 if(startofvalue != NULL) { 600 if(startofvalue != NULL) {
601 startofvalue++;
601 jitter = strtod(startofvalue, &nptr); 602 jitter = strtod(startofvalue, &nptr);
602 } 603 }
603 if(startofvalue == NULL || startofvalue==nptr){ 604 if(startofvalue == NULL || startofvalue==nptr){
@@ -618,7 +619,7 @@ double jitter_request(const char *host, int *status){
618 rval = num_valid ? rval / num_valid : -1.0; 619 rval = num_valid ? rval / num_valid : -1.0;
619 620
620 close(conn); 621 close(conn);
621 free(peers); 622 if(peers!=NULL) free(peers);
622 /* If we return -1.0, it means no synchronization source was found */ 623 /* If we return -1.0, it means no synchronization source was found */
623 return rval; 624 return rval;
624} 625}