From eda4b111d3b84fd3423178e42b2583970b936e63 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Mon, 5 Mar 2018 18:37:20 +0100 Subject: [PATCH] cmdmon: make length of manual list constant Make the length of responses containing manual samples constant to simplify the protocol. It was the only type of response that had a variable length. This reverts commit 2343e7a89c0bacdfccf892f881c4b89b2990c512. --- candm.h | 3 ++- client.c | 13 +++++++++---- cmdmon.c | 11 +++++++---- pktlength.c | 26 +++----------------------- pktlength.h | 2 +- 5 files changed, 22 insertions(+), 33 deletions(-) diff --git a/candm.h b/candm.h index 2ff3853..06fcb05 100644 --- a/candm.h +++ b/candm.h @@ -470,7 +470,8 @@ typedef struct { #define RPY_CLIENT_ACCESSES_BY_INDEX2 15 #define RPY_NTP_DATA 16 #define RPY_MANUAL_TIMESTAMP2 17 -#define N_REPLY_TYPES 18 +#define RPY_MANUAL_LIST2 18 +#define N_REPLY_TYPES 19 /* Status codes */ #define STT_SUCCESS 0 diff --git a/client.c b/client.c index a38077b..9452207 100644 --- a/client.c +++ b/client.c @@ -1429,9 +1429,14 @@ submit_request(CMD_Request *request, CMD_Reply *reply) DEBUG_LOG("Received %d bytes", recv_status); read_length = recv_status; - expected_length = PKL_ReplyLength(reply, read_length); + if (read_length >= offsetof(CMD_Reply, data)) { + expected_length = PKL_ReplyLength(reply); + } else { + expected_length = 0; + } - bad_length = !expected_length || read_length < expected_length; + bad_length = (read_length < expected_length || + expected_length < offsetof(CMD_Reply, data)); if (!bad_length) { bad_sequence = reply->sequence != request->sequence; @@ -2539,7 +2544,7 @@ process_cmd_manual_list(const char *line) struct timespec when; request.command = htons(REQ_MANUAL_LIST); - if (!request_reply(&request, &reply, RPY_MANUAL_LIST, 0)) + if (!request_reply(&request, &reply, RPY_MANUAL_LIST2, 0)) return 0; n_samples = ntohl(reply.data.manual_list.n_samples); @@ -2547,7 +2552,7 @@ process_cmd_manual_list(const char *line) print_header("# Date Time(UTC) Slewed Original Residual"); - for (i = 0; i < n_samples; i++) { + for (i = 0; i < n_samples && i < MAX_MANUAL_LIST_SAMPLES; i++) { sample = &reply.data.manual_list.samples[i]; UTI_TimespecNetworkToHost(&sample->when, &when); diff --git a/cmdmon.c b/cmdmon.c index 85f77de..207165b 100644 --- a/cmdmon.c +++ b/cmdmon.c @@ -279,8 +279,7 @@ do_size_checks(void) for (i = 1; i < N_REPLY_TYPES; i++) { reply.reply = htons(i); reply.status = STT_SUCCESS; - reply.data.manual_list.n_samples = htonl(MAX_MANUAL_LIST_SAMPLES); - reply_length = PKL_ReplyLength(&reply, sizeof (reply)); + reply_length = PKL_ReplyLength(&reply); if ((reply_length && reply_length < offsetof(CMD_Reply, data)) || reply_length > sizeof (CMD_Reply)) assert(0); @@ -394,7 +393,7 @@ transmit_reply(CMD_Reply *msg, union sockaddr_all *where_to) assert(0); } - tx_message_length = PKL_ReplyLength(msg, sizeof (*msg)); + tx_message_length = PKL_ReplyLength(msg); status = sendto(sock_fd, (void *) msg, tx_message_length, 0, &where_to->sa, addrlen); @@ -1105,10 +1104,14 @@ handle_manual_list(CMD_Request *rx_message, CMD_Reply *tx_message) RPY_ManualListSample *sample; RPT_ManualSamplesReport report[MAX_MANUAL_LIST_SAMPLES]; - tx_message->reply = htons(RPY_MANUAL_LIST); + tx_message->reply = htons(RPY_MANUAL_LIST2); MNL_ReportSamples(report, MAX_MANUAL_LIST_SAMPLES, &n_samples); tx_message->data.manual_list.n_samples = htonl(n_samples); + + memset(tx_message->data.manual_list.samples, 0, + sizeof (tx_message->data.manual_list.samples)); + for (i=0; idata.manual_list.samples[i]; UTI_TimespecHostToNetwork(&report[i].when, &sample->when); diff --git a/pktlength.c b/pktlength.c index 112ee26..14a43f7 100644 --- a/pktlength.c +++ b/pktlength.c @@ -133,13 +133,14 @@ static const uint16_t reply_lengths[] = { 0, /* SUBNETS_ACCESSED - not supported */ 0, /* CLIENT_ACCESSES - not supported */ 0, /* CLIENT_ACCESSES_BY_INDEX - not supported */ - 0, /* MANUAL_LIST - variable length */ + 0, /* MANUAL_LIST - not supported */ RPY_LENGTH_ENTRY(activity), /* ACTIVITY */ RPY_LENGTH_ENTRY(smoothing), /* SMOOTHING */ RPY_LENGTH_ENTRY(server_stats), /* SERVER_STATS */ RPY_LENGTH_ENTRY(client_accesses_by_index), /* CLIENT_ACCESSES_BY_INDEX2 */ RPY_LENGTH_ENTRY(ntp_data), /* NTP_DATA */ RPY_LENGTH_ENTRY(manual_timestamp), /* MANUAL_TIMESTAMP2 */ + RPY_LENGTH_ENTRY(manual_list), /* MANUAL_LIST2 */ }; /* ================================================== */ @@ -184,39 +185,18 @@ PKL_CommandPaddingLength(CMD_Request *r) /* ================================================== */ int -PKL_ReplyLength(CMD_Reply *r, int read_length) +PKL_ReplyLength(CMD_Reply *r) { uint32_t type; assert(sizeof (reply_lengths) / sizeof (reply_lengths[0]) == N_REPLY_TYPES); - if (read_length < (int)offsetof(CMD_Reply, data)) - return 0; - type = ntohs(r->reply); /* Note that reply type codes start from 1, not 0 */ if (type < 1 || type >= N_REPLY_TYPES) return 0; - /* Length of MANUAL_LIST depends on number of samples stored in it */ - if (type == RPY_MANUAL_LIST) { - uint32_t ns; - - if (r->status != htons(STT_SUCCESS)) - return offsetof(CMD_Reply, data); - - if (read_length < (int)offsetof(CMD_Reply, data.manual_list.samples)) - return 0; - - ns = ntohl(r->data.manual_list.n_samples); - if (ns > MAX_MANUAL_LIST_SAMPLES) - return 0; - - return offsetof(CMD_Reply, data.manual_list.samples) + - ns * sizeof (RPY_ManualListSample); - } - return reply_lengths[type]; } diff --git a/pktlength.h b/pktlength.h index 40646fe..fad4c30 100644 --- a/pktlength.h +++ b/pktlength.h @@ -35,6 +35,6 @@ extern int PKL_CommandLength(CMD_Request *r); extern int PKL_CommandPaddingLength(CMD_Request *r); -extern int PKL_ReplyLength(CMD_Reply *r, int read_length); +extern int PKL_ReplyLength(CMD_Reply *r); #endif /* GOT_PKTLENGTH_H */