Skip to content

Commit

Permalink
Strings (#111) (#112)
Browse files Browse the repository at this point in the history
* fix stringop-truncation

* pass correct len for strings in desc stats
  • Loading branch information
akoepsel committed Jun 22, 2018
1 parent c64325b commit 21ad547
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 9 deletions.
10 changes: 5 additions & 5 deletions src/rofl/common/openflow/cofdescstats.cc
Expand Up @@ -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:
Expand Down
24 changes: 21 additions & 3 deletions src/rofl/common/openflow/cofport.cc
Expand Up @@ -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());
Expand All @@ -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());
Expand All @@ -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);

Expand Down
5 changes: 4 additions & 1 deletion src/rofl/common/openflow/coftablefeatures.cc
Expand Up @@ -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);
Expand Down

0 comments on commit 21ad547

Please sign in to comment.