From: Dave Hart Date: Sat, 29 Jan 2011 23:06:16 +0000 (+0000) Subject: * [Bug 1799] ntpq mrv crash. X-Git-Tag: NTP_4_2_7P128~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ed1113ab544abffc92f00583b0ea617da9274f4;p=thirdparty%2Fntp.git * [Bug 1799] ntpq mrv crash. * [Bug 1801] ntpq mreadvar requires prior association caching. bk: 4d449d68MXa5ABkrdUwI1MB3D1SPew --- diff --git a/ChangeLog b/ChangeLog index fe758c91d..482b0df9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,9 @@ +* [Bug 1799] ntpq mrv crash. +* [Bug 1801] ntpq mreadvar requires prior association caching. (4.2.7p127) 2011/01/28 Released by Harlan Stenn * [Bug 1797] Restore stale timestamp check from the RANGEGATE cleanup. (4.2.7p126) 2011/01/27 Released by Harlan Stenn -* Fix unexposed fencepost error in COUNTOF(). +* Fix unexposed fencepost error in format_time_fraction(). * Add more unit tests for timeval_tostr() and timespec_tostr(). (4.2.7p125) 2011/01/26 Released by Harlan Stenn * [Bug 1794] ntpq -c rv missing clk_wander information. diff --git a/ntpq/ntpq-subs.c b/ntpq/ntpq-subs.c index 552629d3f..35371a98a 100644 --- a/ntpq/ntpq-subs.c +++ b/ntpq/ntpq-subs.c @@ -38,7 +38,8 @@ static void readvar (struct parse *, FILE *); static void writevar (struct parse *, FILE *); static void clocklist (struct parse *, FILE *); static void clockvar (struct parse *, FILE *); -static int findassidrange (u_int32, u_int32, int *, int *); +static int findassidrange (u_int32, u_int32, int *, int *, + FILE *); static void mreadlist (struct parse *, FILE *); static void mreadvar (struct parse *, FILE *); static void printassoc (int, FILE *); @@ -123,16 +124,16 @@ struct xcmd opcmds[] = { { "assocID", "name=value,[...]", "", "" }, "write system or peer variables" }, { "mreadlist", mreadlist, { NTP_UINT, NTP_UINT, NO, NO }, - { "assocID", "assocID", "", "" }, + { "assocIDlow", "assocIDhigh", "", "" }, "read the peer variables in the variable list for multiple peers" }, { "mrl", mreadlist, { NTP_UINT, NTP_UINT, NO, NO }, - { "assocID", "assocID", "", "" }, + { "assocIDlow", "assocIDhigh", "", "" }, "read the peer variables in the variable list for multiple peers" }, { "mreadvar", mreadvar, { NTP_UINT, NTP_UINT, OPT|NTP_STR, NO }, - { "assocID", "assocID", "name=value[,...]", "" }, + { "assocIDlow", "assocIDhigh", "name=value[,...]", "" }, "read peer variables from multiple peers" }, { "mrv", mreadvar, { NTP_UINT, NTP_UINT, OPT|NTP_STR, NO }, - { "assocID", "assocID", "name=value[,...]", "" }, + { "assocIDlow", "assocIDhigh", "name=value[,...]", "" }, "read peer variables from multiple peers" }, { "clocklist", clocklist, { OPT|NTP_UINT, NO, NO, NO }, { "assocID", "", "", "" }, @@ -905,10 +906,11 @@ clockvar( */ static int findassidrange( - u_int32 assid1, - u_int32 assid2, - int *from, - int *to + u_int32 assid1, + u_int32 assid2, + int * from, + int * to, + FILE * fp ) { associd_t assids[2]; @@ -916,6 +918,10 @@ findassidrange( u_int i; size_t a; + + if (0 == numassoc) + dogetassoc(fp); + assids[0] = checkassocid(assid1); if (0 == assids[0]) return 0; @@ -962,16 +968,15 @@ mreadlist( int from; int to; - /* HMS: uval? */ if (!findassidrange(pcmd->argval[0].uval, pcmd->argval[1].uval, - &from, &to)) + &from, &to, fp)) return; for (i = from; i <= to; i++) { if (i != from) - (void) fprintf(fp, "\n"); - if (!dolist(g_varlist, (int)assoc_cache[i].assid, - CTL_OP_READVAR, TYPE_PEER, fp)) + fprintf(fp, "\n"); + if (!dolist(g_varlist, assoc_cache[i].assid, + CTL_OP_READVAR, TYPE_PEER, fp)) return; } return; @@ -993,9 +998,8 @@ mreadvar( struct varlist tmplist[MAXLIST]; struct varlist *pvars; - /* HMS: uval? */ if (!findassidrange(pcmd->argval[0].uval, pcmd->argval[1].uval, - &from, &to)) + &from, &to, fp)) return; if (pcmd->nargs >= 3) { @@ -1009,11 +1013,14 @@ mreadvar( for (i = from; i <= to; i++) { if (i != from) fprintf(fp, "\n"); - if (!dolist(pvars, (int)assoc_cache[i].assid, - CTL_OP_READVAR, TYPE_PEER, fp)) + if (!dolist(pvars, assoc_cache[i].assid, CTL_OP_READVAR, + TYPE_PEER, fp)) break; } - doclearvlist(tmplist); + + if (pvars == tmplist) + doclearvlist(tmplist); + return; }