From 21ad547f18895f4b818376b9fc896b34848f4a18 Mon Sep 17 00:00:00 2001 From: Andreas Koepsel Date: Fri, 22 Jun 2018 13:40:56 +0200 Subject: [PATCH] Strings (#111) (#112) * fix stringop-truncation * pass correct len for strings in desc stats --- src/rofl/common/openflow/cofdescstats.cc | 10 ++++---- src/rofl/common/openflow/cofport.cc | 24 +++++++++++++++++--- src/rofl/common/openflow/coftablefeatures.cc | 5 +++- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/rofl/common/openflow/cofdescstats.cc b/src/rofl/common/openflow/cofdescstats.cc index 3af6705f..7000d60c 100644 --- a/src/rofl/common/openflow/cofdescstats.cc +++ b/src/rofl/common/openflow/cofdescstats.cc @@ -68,11 +68,11 @@ void cofdesc_stats_reply::unpack(uint8_t *buf, size_t buflen) { struct openflow10::ofp_desc_stats *desc = (struct openflow10::ofp_desc_stats *)buf; - mfr_desc.assign(desc->mfr_desc, DESC_STR_LEN); - hw_desc.assign(desc->hw_desc, DESC_STR_LEN); - sw_desc.assign(desc->sw_desc, DESC_STR_LEN); - serial_num.assign(desc->serial_num, SERIAL_NUM_LEN); - dp_desc.assign(desc->dp_desc, DESC_STR_LEN); + mfr_desc.assign(desc->mfr_desc, strnlen(desc->mfr_desc, DESC_STR_LEN)); + hw_desc.assign(desc->hw_desc, strnlen(desc->hw_desc, DESC_STR_LEN)); + sw_desc.assign(desc->sw_desc, strnlen(desc->sw_desc, DESC_STR_LEN)); + serial_num.assign(desc->serial_num, strnlen(desc->serial_num, SERIAL_NUM_LEN)); + dp_desc.assign(desc->dp_desc, strnlen(desc->dp_desc, DESC_STR_LEN)); } break; case rofl::openflow12::OFP_VERSION: diff --git a/src/rofl/common/openflow/cofport.cc b/src/rofl/common/openflow/cofport.cc index b8263be3..3b11d3b4 100644 --- a/src/rofl/common/openflow/cofport.cc +++ b/src/rofl/common/openflow/cofport.cc @@ -32,7 +32,19 @@ void cofport::pack(uint8_t *buf, size_t buflen) { hdr->port_no = htobe16(portno & 0x0000ffff); memcpy(hdr->hw_addr, hwaddr.somem(), OFP_ETH_ALEN); - strncpy(hdr->name, name.c_str(), OFP_MAX_PORT_NAME_LEN); + static_assert(sizeof(hdr->name) == OFP_MAX_PORT_NAME_LEN, "invalid length of hdr->name"); + // this is somewhat awkward +#if __GNUC__ >= 8 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif + strncpy(hdr->name, name.c_str(), OFP_MAX_PORT_NAME_LEN - 1); +#if __GNUC__ >= 8 +#pragma GCC diagnostic pop +#endif + if (name.length() >= OFP_MAX_PORT_NAME_LEN) { + hdr->name[OFP_MAX_PORT_NAME_LEN - 1] = '\0'; + } hdr->config = htobe32(config); hdr->state = htobe32(state); hdr->curr = htobe32(get_ethernet().get_curr()); @@ -49,7 +61,10 @@ void cofport::pack(uint8_t *buf, size_t buflen) { hdr->port_no = htobe32(portno); memcpy(hdr->hw_addr, hwaddr.somem(), OFP_ETH_ALEN); - strncpy(hdr->name, name.c_str(), OFP_MAX_PORT_NAME_LEN); + strncpy(hdr->name, name.c_str(), OFP_MAX_PORT_NAME_LEN - 1); + if (name.length() >= OFP_MAX_PORT_NAME_LEN) { + hdr->name[OFP_MAX_PORT_NAME_LEN - 1] = '\0'; + } hdr->config = htobe32(config); hdr->state = htobe32(state); hdr->curr = htobe32(get_ethernet().get_curr()); @@ -67,7 +82,10 @@ void cofport::pack(uint8_t *buf, size_t buflen) { hdr->port_no = htobe32(portno); memcpy(hdr->hw_addr, hwaddr.somem(), OFP_ETH_ALEN); - strncpy(hdr->name, name.c_str(), OFP_MAX_PORT_NAME_LEN); + strncpy(hdr->name, name.c_str(), OFP_MAX_PORT_NAME_LEN - 1); + if (name.length() >= OFP_MAX_PORT_NAME_LEN) { + hdr->name[OFP_MAX_PORT_NAME_LEN - 1] = '\0'; + } hdr->config = htobe32(config); hdr->state = htobe32(state); diff --git a/src/rofl/common/openflow/coftablefeatures.cc b/src/rofl/common/openflow/coftablefeatures.cc index a7e19004..80fefe89 100644 --- a/src/rofl/common/openflow/coftablefeatures.cc +++ b/src/rofl/common/openflow/coftablefeatures.cc @@ -31,7 +31,10 @@ void coftable_features::pack(uint8_t *buf, size_t buflen) { hdr->length = htobe16(length()); hdr->table_id = table_id; - strncpy(hdr->name, name.c_str(), OFP_MAX_TABLE_NAME_LEN); + strncpy(hdr->name, name.c_str(), OFP_MAX_TABLE_NAME_LEN - 1); + if (name.length() >= OFP_MAX_TABLE_NAME_LEN) { + hdr->name[OFP_MAX_TABLE_NAME_LEN - 1] = '\0'; + } hdr->metadata_match = htobe64(metadata_match); hdr->metadata_write = htobe64(metadata_write); hdr->config = htobe32(config);