From: Dave Hart Date: Wed, 7 Sep 2011 04:29:25 +0000 (+0000) Subject: [Bug 2003] libntpq ntpq_read_assoc_peervars() broken. X-Git-Tag: NTP_4_2_7P212~1^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d3702c9256003ee99f3c676c2db693447f83efe;p=thirdparty%2Fntp.git [Bug 2003] libntpq ntpq_read_assoc_peervars() broken. bk: 4e66f325dpwzkKU5XtpEOSZDYZ_GLw --- diff --git a/ChangeLog b/ChangeLog index 480d74930..24e2d55c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ * [Bug 1984] ntp/libisc fails to compile on OS X 10.7 (Lion). * [Bug 1985] "logconfig =allall" rejected. * [Bug 2001] ntpdc timerstats reports overruns as handled. +* [Bug 2003] libntpq ntpq_read_assoc_peervars() broken. * [Backward Incompatible] sntp: -l/--filelog -> -l/--logfile, to be consistent with ntpd. * libopts/file.c fix from Bruce Korb (arg-type=file). diff --git a/ntpq/libntpq.c b/ntpq/libntpq.c index 27a15dc4b..fff8e81ea 100644 --- a/ntpq/libntpq.c +++ b/ntpq/libntpq.c @@ -405,51 +405,32 @@ int ntpq_get_assoc_number ( associd_t associd ) int ntpq_read_assoc_peervars( - associd_t associd, - char *resultbuf, - int maxsize + associd_t associd, + char * resultbuf, + int maxsize ) { - const char *datap; - int res; - int dsize; - u_short rstatus; - l_fp rec; - l_fp ts; - char value[NTPQ_BUFLEN]; - + const char * datap; + int res; + int dsize; + u_short rstatus; res = doquery(CTL_OP_READVAR, associd, 0, 0, NULL, &rstatus, &dsize, &datap); - if (res != 0) return 0; - - get_systime(&ts); - - if (dsize == 0) { + if (dsize <= 0) { if (numhosts > 1) fprintf(stderr, "server=%s ", currenthost); fprintf(stderr, "***No information returned for association %d\n", associd); - return 0; - } else { - if ( dsize > maxsize ) - dsize = maxsize; - memcpy(resultbuf, datap, dsize); - resultbuf[dsize] = '\0'; - - ntpq_getvar(resultbuf, dsize, "rec", value, - sizeof(value)); - - if (!decodets(value, &rec)) - L_CLR(&rec); - memcpy(resultbuf, value, maxsize); - resultbuf[dsize] = '\0'; - dsize = strlen(resultbuf); + return 0; } + if (dsize > maxsize) + dsize = maxsize; + memcpy(resultbuf, datap, dsize); return dsize; } @@ -483,7 +464,8 @@ ntpq_read_assoc_peervars( size_t ntpq_read_sysvars( char * resultbuf, - size_t maxsize) + size_t maxsize + ) { const char * datap; int res; @@ -563,14 +545,14 @@ ntpq_read_sysvars( * 0 (zero) if an error occured and the sysvars * could not be read ****************************************************************************/ - int ntpq_get_sysvars( void ) +int +ntpq_get_sysvars(void) { - sysvarlen = ( ntpq_read_sysvars( sysvars, sizeof(sysvars )) ); - if ( sysvarlen <= 0 ) { - return 0; - } else { - return 1; - } + sysvarlen = ntpq_read_sysvars(sysvars, sizeof(sysvars)); + if (sysvarlen <= 0) + return 0; + else + return 1; } @@ -621,17 +603,21 @@ int ntpq_get_peervar( const char *varname, char *varvalue, int maxlen) * 0 (zero) if an error occured and the variable set * could not be read ****************************************************************************/ - int ntpq_get_assoc_peervars( associd_t associd ) +int +ntpq_get_assoc_peervars( + associd_t associd + ) { - peervarlen = ntpq_read_assoc_peervars( associd, peervars, - sizeof(peervars ) ); - if ( peervarlen <= 0 ) { + peervarlen = ntpq_read_assoc_peervars(associd, peervars, + sizeof(peervars)); + if (peervarlen <= 0) { peervar_assoc = 0; + return 0; - } else { - peervar_assoc = associd; - return 1; } + peervar_assoc = associd; + + return 1; } @@ -706,32 +692,36 @@ ntpq_read_assoc_clockvars( * NTP_CLOCKTYPE_MULTICAST Multicast server * ****************************************************************************/ -int ntpq_get_assoc_clocktype ( associd_t assoc_number ) +int +ntpq_get_assoc_clocktype( + int assoc_index + ) { - int type = 0; - int i, rc = 0; - sockaddr_u dum_store; - char value[LENHOSTNAME]; - char resultbuf[1024]; - - if ( assoc_number < 0 || assoc_number > numassoc ) + associd_t associd; + int i; + int rc; + sockaddr_u dum_store; + char dstadr[LENHOSTNAME]; + char resultbuf[NTPQ_BUFLEN]; + + if (assoc_index < 0 || assoc_index >= numassoc) return -1; - if ( peervar_assoc != assoc_cache[assoc_number].assid ) { - i = ntpq_read_assoc_peervars( - assoc_cache[assoc_number].assid, resultbuf, - sizeof(resultbuf)); - if ( i <= 0 ) - return -1; - rc = ntpq_getvar(resultbuf, i, "dstadr", value, - LENHOSTNAME ); + + associd = assoc_cache[assoc_index].assid; + if (associd == peervar_assoc) { + rc = ntpq_get_peervar("dstadr", dstadr, sizeof(dstadr)); } else { - rc = ntpq_get_peervar("dstadr",value,LENHOSTNAME); + i = ntpq_read_assoc_peervars(associd, resultbuf, + sizeof(resultbuf)); + if (i <= 0) + return -1; + rc = ntpq_getvar(resultbuf, i, "dstadr", dstadr, + sizeof(dstadr)); } - if (0 != rc && decodenetnum(value, &dum_store)) { - type = ntpq_decodeaddrtype(&dum_store); - return type; - } + if (0 != rc && decodenetnum(dstadr, &dum_store)) + return ntpq_decodeaddrtype(&dum_store); + return -1; } diff --git a/ntpq/libntpq.h b/ntpq/libntpq.h index e97f4b380..164cc58cf 100644 --- a/ntpq/libntpq.h +++ b/ntpq/libntpq.h @@ -97,7 +97,7 @@ extern int ntpq_get_assoc_number ( associd_t associd ); extern int ntpq_get_assoc_peervars( associd_t associd ); extern int ntpq_get_assoc_clockvars( associd_t associd ); extern int ntpq_get_assoc_allvars( associd_t associd ); -extern int ntpq_get_assoc_clocktype ( associd_t assoc_number ); +extern int ntpq_get_assoc_clocktype(int assoc_index); extern int ntpq_read_assoc_peervars( associd_t associd, char *resultbuf, int maxsize ); extern int ntpq_read_assoc_clockvars( associd_t associd, char *resultbuf, int maxsize );