diff options
Diffstat (limited to 'ntpd/ntp_control.c')
-rw-r--r-- | ntpd/ntp_control.c | 159 |
1 files changed, 92 insertions, 67 deletions
diff --git a/ntpd/ntp_control.c b/ntpd/ntp_control.c index f5f326ca4811..b339e7d83b86 100644 --- a/ntpd/ntp_control.c +++ b/ntpd/ntp_control.c @@ -58,13 +58,10 @@ static u_short ctlclkstatus (struct refclockstat *); static void ctl_flushpkt (u_char); static void ctl_putdata (const char *, unsigned int, int); static void ctl_putstr (const char *, const char *, size_t); -static void ctl_putdblf (const char *, const char *, double); -const char ctl_def_dbl_fmt[] = "%.3f"; -#define ctl_putdbl(tag, d) ctl_putdblf(tag, ctl_def_dbl_fmt, d) -const char ctl_def_dbl6_fmt[] = "%.6f"; -#define ctl_putdbl6(tag, d) ctl_putdblf(tag, ctl_def_dbl6_fmt, d) -const char ctl_def_sfp_fmt[] = "%g"; -#define ctl_putsfp(tag, sfp) ctl_putdblf(tag, ctl_def_sfp_fmt, \ +static void ctl_putdblf (const char *, int, int, double); +#define ctl_putdbl(tag, d) ctl_putdblf(tag, 1, 3, d) +#define ctl_putdbl6(tag, d) ctl_putdblf(tag, 1, 6, d) +#define ctl_putsfp(tag, sfp) ctl_putdblf(tag, 0, -1, \ FPTOD(sfp)) static void ctl_putuint (const char *, u_long); static void ctl_puthex (const char *, u_long); @@ -783,6 +780,7 @@ static int res_offset; /* offset of payload in response */ static u_char * datapt; static u_char * dataend; static int datalinelen; +static int datasent; /* flag to avoid initial ", " */ static int datanotbinflag; static sockaddr_u *rmt_addr; static struct interface *lcl_inter; @@ -811,7 +809,7 @@ static char *reqend; void init_control(void) { - int i; + size_t i; #ifdef HAVE_UNAME uname(&utsnamebuf); @@ -846,9 +844,9 @@ ctl_error( * Fill in the fields. We assume rpkt.sequence and rpkt.associd * have already been filled in. */ - rpkt.r_m_e_op = CTL_RESPONSE | CTL_ERROR | + rpkt.r_m_e_op = (u_char)CTL_RESPONSE | CTL_ERROR | (res_opcode & CTL_OP_MASK); - rpkt.status = htons((errcode << 8) & 0xff00); + rpkt.status = htons((u_short)(errcode << 8) & 0xff00); rpkt.count = 0; /* @@ -923,6 +921,7 @@ save_config( * allow timestamping of the saved config filename with * strftime() format such as: * ntpq -c "saveconfig ntp-%Y%m%d-%H%M%S.conf" + * XXX: Nice feature, but not too safe. */ if (0 == strftime(filename, sizeof(filename), filespec, localtime(&now))) @@ -1007,7 +1006,7 @@ process_control( const struct ctl_proc *cc; keyid_t *pkid; int properlen; - int maclen; + size_t maclen; DPRINTF(3, ("in process_control()\n")); @@ -1023,11 +1022,11 @@ process_control( * If the length is less than required for the header, or * it is a response or a fragment, ignore this. */ - if (rbufp->recv_length < CTL_HEADER_LEN + if (rbufp->recv_length < (int)CTL_HEADER_LEN || (CTL_RESPONSE | CTL_MORE | CTL_ERROR) & pkt->r_m_e_op || pkt->offset != 0) { DPRINTF(1, ("invalid format in control packet\n")); - if (rbufp->recv_length < CTL_HEADER_LEN) + if (rbufp->recv_length < (int)CTL_HEADER_LEN) numctltooshort++; if (CTL_RESPONSE & pkt->r_m_e_op) numctlinputresp++; @@ -1067,6 +1066,7 @@ process_control( req_count = (int)ntohs(pkt->count); datanotbinflag = FALSE; datalinelen = 0; + datasent = 0; datapt = rpkt.u.data; dataend = &rpkt.u.data[CTL_MAX_DATA_LEN]; @@ -1096,7 +1096,7 @@ process_control( res_authenticate = TRUE; pkid = (void *)((char *)pkt + properlen); res_keyid = ntohl(*pkid); - DPRINTF(3, ("recv_len %d, properlen %d, wants auth with keyid %08x, MAC length=%d\n", + DPRINTF(3, ("recv_len %d, properlen %d, wants auth with keyid %08x, MAC length=%zu\n", rbufp->recv_length, properlen, res_keyid, maclen)); @@ -1220,7 +1220,7 @@ ctl_flushpkt( u_char more ) { - int i; + size_t i; int dlen; int sendlen; int maclen; @@ -1326,7 +1326,7 @@ ctl_putdata( if (!bin) { datanotbinflag = TRUE; overhead = 3; - if (datapt != rpkt.u.data) { + if (datasent) { *datapt++ = ','; datalinelen++; if ((dlen + datalinelen + 1) >= MAXDATALINELEN) { @@ -1347,7 +1347,7 @@ ctl_putdata( /* * Not enough room in this one, flush it out. */ - currentlen = MIN(dlen, dataend - datapt); + currentlen = MIN(dlen, (unsigned int)(dataend - datapt)); memcpy(datapt, dp, currentlen); @@ -1362,6 +1362,7 @@ ctl_putdata( memcpy(datapt, dp, dlen); datapt += dlen; datalinelen += dlen; + datasent = TRUE; } @@ -1439,7 +1440,8 @@ ctl_putunqstr( static void ctl_putdblf( const char * tag, - const char * fmt, + int use_f, + int precision, double d ) { @@ -1452,8 +1454,9 @@ ctl_putdblf( while (*cq != '\0') *cp++ = *cq++; *cp++ = '='; - NTP_INSIST((cp - buffer) < sizeof(buffer)); - snprintf(cp, sizeof(buffer) - (cp - buffer), fmt, d); + NTP_INSIST((size_t)(cp - buffer) < sizeof(buffer)); + snprintf(cp, sizeof(buffer) - (cp - buffer), use_f ? "%.*f" : "%.*g", + precision, d); cp += strlen(cp); ctl_putdata(buffer, (unsigned)(cp - buffer), 0); } @@ -1477,13 +1480,40 @@ ctl_putuint( *cp++ = *cq++; *cp++ = '='; - NTP_INSIST((cp - buffer) < sizeof(buffer)); + NTP_INSIST((cp - buffer) < (int)sizeof(buffer)); snprintf(cp, sizeof(buffer) - (cp - buffer), "%lu", uval); cp += strlen(cp); ctl_putdata(buffer, (unsigned)( cp - buffer ), 0); } /* + * ctl_putcal - write a decoded calendar data into the response + */ +static void +ctl_putcal( + const char *tag, + const struct calendar *pcal + ) +{ + char buffer[100]; + unsigned numch; + + numch = snprintf(buffer, sizeof(buffer), + "%s=%04d%02d%02d%02d%02d", + tag, + pcal->year, + pcal->month, + pcal->monthday, + pcal->hour, + pcal->minute + ); + NTP_INSIST(numch < sizeof(buffer)); + ctl_putdata(buffer, numch, 0); + + return; +} + +/* * ctl_putfs - write a decoded filestamp into the response */ static void @@ -1508,7 +1538,7 @@ ctl_putfs( tm = gmtime(&fstamp); if (NULL == tm) return; - NTP_INSIST((cp - buffer) < sizeof(buffer)); + NTP_INSIST((cp - buffer) < (int)sizeof(buffer)); snprintf(cp, sizeof(buffer) - (cp - buffer), "%04d%02d%02d%02d%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min); @@ -1537,7 +1567,7 @@ ctl_puthex( *cp++ = *cq++; *cp++ = '='; - NTP_INSIST((cp - buffer) < sizeof(buffer)); + NTP_INSIST((cp - buffer) < (int)sizeof(buffer)); snprintf(cp, sizeof(buffer) - (cp - buffer), "0x%lx", uval); cp += strlen(cp); ctl_putdata(buffer,(unsigned)( cp - buffer ), 0); @@ -1563,7 +1593,7 @@ ctl_putint( *cp++ = *cq++; *cp++ = '='; - NTP_INSIST((cp - buffer) < sizeof(buffer)); + NTP_INSIST((cp - buffer) < (int)sizeof(buffer)); snprintf(cp, sizeof(buffer) - (cp - buffer), "%ld", ival); cp += strlen(cp); ctl_putdata(buffer, (unsigned)( cp - buffer ), 0); @@ -1589,7 +1619,7 @@ ctl_putts( *cp++ = *cq++; *cp++ = '='; - NTP_INSIST((cp - buffer) < sizeof(buffer)); + NTP_INSIST((size_t)(cp - buffer) < sizeof(buffer)); snprintf(cp, sizeof(buffer) - (cp - buffer), "0x%08x.%08x", (u_int)ts->l_ui, (u_int)ts->l_uf); cp += strlen(cp); @@ -1621,7 +1651,7 @@ ctl_putadr( cq = numtoa(addr32); else cq = stoa(addr); - NTP_INSIST((cp - buffer) < sizeof(buffer)); + NTP_INSIST((cp - buffer) < (int)sizeof(buffer)); snprintf(cp, sizeof(buffer) - (cp - buffer), "%s", cq); cp += strlen(cp); ctl_putdata(buffer, (unsigned)(cp - buffer), 0); @@ -1658,7 +1688,7 @@ ctl_putrefid( iplim = iptr + sizeof(refid); for ( ; optr < oplim && iptr < iplim && '\0' != *iptr; iptr++, optr++) - if (isprint(*iptr)) + if (isprint((int)*iptr)) *optr = *iptr; else *optr = '.'; @@ -1692,7 +1722,7 @@ ctl_putarray( if (i == 0) i = NTP_SHIFT; i--; - NTP_INSIST((cp - buffer) < sizeof(buffer)); + NTP_INSIST((cp - buffer) < (int)sizeof(buffer)); snprintf(cp, sizeof(buffer) - (cp - buffer), " %.2f", arr[i] * 1e3); cp += strlen(cp); @@ -1715,9 +1745,6 @@ ctl_putsys( double kb; double dtemp; const char *ss; - size_t len; - int firstvarname; - const struct ctl_var *k; #ifdef AUTOKEY struct cert_info *cp; #endif /* AUTOKEY */ @@ -1863,11 +1890,11 @@ ctl_putsys( { char buf[CTL_MAX_DATA_LEN]; //buffPointer, firstElementPointer, buffEndPointer - register char *buffp, *buffend; - register int firstVarName; - register const char *ss; - register int len; - register struct ctl_var *k; + char *buffp, *buffend; + int firstVarName; + const char *ss1; + int len; + const struct ctl_var *k; buffp = buf; buffend = buf + sizeof(buf); @@ -1896,11 +1923,11 @@ ctl_putsys( continue; if (NULL == k->text) continue; - ss = strchr(k->text, '='); - if (NULL == ss) + ss1 = strchr(k->text, '='); + if (NULL == ss1) len = strlen(k->text); else - len = ss - k->text; + len = ss1 - k->text; if (buffp + len + 1 >= buffend) break; if (firstVarName) { @@ -2113,7 +2140,7 @@ ctl_putsys( case CS_K_OFFSET: CTL_IF_KERNLOOP( ctl_putdblf, - (sys_var[varid].text, "%g", to_ms * ntx.offset) + (sys_var[varid].text, 0, -1, to_ms * ntx.offset) ); break; @@ -2127,7 +2154,7 @@ ctl_putsys( case CS_K_MAXERR: CTL_IF_KERNLOOP( ctl_putdblf, - (sys_var[varid].text, "%.6g", + (sys_var[varid].text, 0, 6, to_ms * ntx.maxerror) ); break; @@ -2135,7 +2162,7 @@ ctl_putsys( case CS_K_ESTERR: CTL_IF_KERNLOOP( ctl_putdblf, - (sys_var[varid].text, "%.6g", + (sys_var[varid].text, 0, 6, to_ms * ntx.esterror) ); break; @@ -2159,7 +2186,7 @@ ctl_putsys( case CS_K_PRECISION: CTL_IF_KERNLOOP( ctl_putdblf, - (sys_var[varid].text, "%.6g", + (sys_var[varid].text, 0, 6, to_ms * ntx.precision) ); break; @@ -2334,14 +2361,11 @@ ctl_putsys( case CS_CERTIF: for (cp = cinfo; cp != NULL; cp = cp->link) { - tstamp_t tstamp; - snprintf(str, sizeof(str), "%s %s 0x%x", cp->subject, cp->issuer, cp->flags); ctl_putstr(sys_var[CS_CERTIF].text, str, strlen(str)); - tstamp = caltontp(&(cp->last)); /* XXX too small to hold some values, but that's what ctl_putfs requires */ - ctl_putfs(sys_var[CS_REVTIME].text, tstamp); + ctl_putcal(sys_var[CS_REVTIME].text, &(cp->last)); } break; @@ -2902,7 +2926,7 @@ ctl_getitem( cp++; while (cp < reqend && *cp != ',') { *tp++ = *cp++; - if (tp - buf >= sizeof(buf)) { + if ((size_t)(tp - buf) >= sizeof(buf)) { ctl_error(CERR_BADFMT); numctlbadpkts++; NLOG(NLOG_SYSEVENT) @@ -2974,7 +2998,7 @@ read_status( { struct peer *peer; const u_char *cp; - int n; + size_t n; /* a_st holds association ID, status pairs alternating */ u_short a_st[CTL_MAX_DATA_LEN / sizeof(u_short)]; @@ -3032,7 +3056,7 @@ read_peervars(void) const struct ctl_var *v; struct peer *peer; const u_char *cp; - int i; + size_t i; char * valuep; u_char wants[CP_MAXCODE + 1]; u_int gotvar; @@ -3708,7 +3732,7 @@ static void read_mru_list( const char * pch; char * pnonce; int nonce_valid; - int i; + size_t i; int priors; u_short hash; mon_entry * mon; @@ -3737,9 +3761,9 @@ static void read_mru_list( set_var(&in_parms, maxlstint_text, sizeof(maxlstint_text), 0); set_var(&in_parms, laddr_text, sizeof(laddr_text), 0); for (i = 0; i < COUNTOF(last); i++) { - snprintf(buf, sizeof(buf), last_fmt, i); + snprintf(buf, sizeof(buf), last_fmt, (int)i); set_var(&in_parms, buf, strlen(buf) + 1, 0); - snprintf(buf, sizeof(buf), addr_fmt, i); + snprintf(buf, sizeof(buf), addr_fmt, (int)i); set_var(&in_parms, buf, strlen(buf) + 1, 0); } @@ -3758,6 +3782,7 @@ static void read_mru_list( while (NULL != (v = ctl_getitem(in_parms, &val)) && !(EOV & v->flags)) { + int si; if (!strcmp(nonce_text, v->text)) { if (NULL != pnonce) @@ -3780,20 +3805,20 @@ static void read_mru_list( } else if (!strcmp(laddr_text, v->text)) { if (decodenetnum(val, &laddr)) lcladr = getinterface(&laddr, 0); - } else if (1 == sscanf(v->text, last_fmt, &i) && - i < COUNTOF(last)) { + } else if (1 == sscanf(v->text, last_fmt, &si) && + (size_t)si < COUNTOF(last)) { if (2 == sscanf(val, "0x%08x.%08x", &ui, &uf)) { - last[i].l_ui = ui; - last[i].l_uf = uf; - if (!SOCK_UNSPEC(&addr[i]) && - i == priors) + last[si].l_ui = ui; + last[si].l_uf = uf; + if (!SOCK_UNSPEC(&addr[si]) && + si == priors) priors++; } - } else if (1 == sscanf(v->text, addr_fmt, &i) && - i < COUNTOF(addr)) { - if (decodenetnum(val, &addr[i]) - && last[i].l_ui && last[i].l_uf && - i == priors) + } else if (1 == sscanf(v->text, addr_fmt, &si) && + (size_t)si < COUNTOF(addr)) { + if (decodenetnum(val, &addr[si]) + && last[si].l_ui && last[si].l_uf && + si == priors) priors++; } } @@ -3827,7 +3852,7 @@ static void read_mru_list( * Find the starting point if one was provided. */ mon = NULL; - for (i = 0; i < priors; i++) { + for (i = 0; i < (size_t)priors; i++) { hash = MON_HASH(&addr[i]); for (mon = mon_hash[hash]; mon != NULL; @@ -4902,7 +4927,7 @@ set_var( t++; } if (*s == *t && ((*t == '=') || !*t)) { - td = erealloc(k->text, size); + td = erealloc((void *)(intptr_t)k->text, size); memcpy(td, data, size); k->text = td; k->flags = def; @@ -4965,7 +4990,7 @@ free_varlist( struct ctl_var *k; if (kv) { for (k = kv; !(k->flags & EOV); k++) - free((void *)k->text); + free((void *)(intptr_t)k->text); free((void *)kv); } } |