When both arguments to ovs_strlcpy() are character arrays, it makes sense to just pass the smaller of their sizes as the overall size. It's somewhat error-prone and definitely redundant to write that by hand, so this commit adds a new macro that does it automatically.
Signed-off-by: Ben Pfaff <b...@ovn.org> --- lib/netdev-vport.c | 4 ++-- lib/ofp-util.c | 24 ++++++++++++------------ lib/ovs-rcu.c | 5 ++--- lib/tnl-ports.c | 4 ++-- lib/util.h | 9 ++++++++- ovn/controller/pinctrl.c | 4 ++-- 6 files changed, 28 insertions(+), 22 deletions(-) diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c index 2d0aa4367f6d..39093e81f424 100644 --- a/lib/netdev-vport.c +++ b/lib/netdev-vport.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, 2012, 2013, 2014 Nicira, Inc. + * Copyright (c) 2010, 2011, 2012, 2013, 2014, 2017 Nicira, Inc. * Copyright (c) 2016 Red Hat, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -276,7 +276,7 @@ tunnel_check_status_change__(struct netdev_vport *netdev) if (strcmp(netdev->egress_iface, iface) || netdev->carrier_status != status) { - ovs_strlcpy(netdev->egress_iface, iface, IFNAMSIZ); + ovs_strlcpy_arrays(netdev->egress_iface, iface); netdev->carrier_status = status; return true; diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 54c83fa6b6c1..fac82c40cc18 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -4325,7 +4325,7 @@ ofputil_decode_ofp10_phy_port(struct ofputil_phy_port *pp, { pp->port_no = u16_to_ofp(ntohs(opp->port_no)); pp->hw_addr = opp->hw_addr; - ovs_strlcpy(pp->name, opp->name, OFP_MAX_PORT_NAME_LEN); + ovs_strlcpy_arrays(pp->name, opp->name); pp->config = ntohl(opp->config) & OFPPC10_ALL; pp->state = ntohl(opp->state) & OFPPS10_ALL; @@ -4352,7 +4352,7 @@ ofputil_decode_ofp11_port(struct ofputil_phy_port *pp, return error; } pp->hw_addr = op->hw_addr; - ovs_strlcpy(pp->name, op->name, OFP_MAX_PORT_NAME_LEN); + ovs_strlcpy_arrays(pp->name, op->name); pp->config = ntohl(op->config) & OFPPC11_ALL; pp->state = ntohl(op->state) & OFPPS11_ALL; @@ -4451,7 +4451,7 @@ ofputil_encode_ofp10_phy_port(const struct ofputil_phy_port *pp, opp->port_no = htons(ofp_to_u16(pp->port_no)); opp->hw_addr = pp->hw_addr; - ovs_strlcpy(opp->name, pp->name, OFP_MAX_PORT_NAME_LEN); + ovs_strlcpy_arrays(opp->name, pp->name); opp->config = htonl(pp->config & OFPPC10_ALL); opp->state = htonl(pp->state & OFPPS10_ALL); @@ -4470,7 +4470,7 @@ ofputil_encode_ofp11_port(const struct ofputil_phy_port *pp, op->port_no = ofputil_port_to_ofp11(pp->port_no); op->hw_addr = pp->hw_addr; - ovs_strlcpy(op->name, pp->name, OFP_MAX_PORT_NAME_LEN); + ovs_strlcpy_arrays(op->name, pp->name); op->config = htonl(pp->config & OFPPC11_ALL); op->state = htonl(pp->state & OFPPS11_ALL); @@ -5269,7 +5269,7 @@ ofputil_decode_table_features(struct ofpbuf *msg, return OFPERR_OFPTFFC_BAD_TABLE; } - ovs_strlcpy(tf->name, otf->name, OFP_MAX_TABLE_NAME_LEN); + ovs_strlcpy_arrays(tf->name, otf->name); tf->metadata_match = otf->metadata_match; tf->metadata_write = otf->metadata_write; tf->miss_config = OFPUTIL_TABLE_MISS_DEFAULT; @@ -5480,7 +5480,7 @@ ofputil_append_table_features_reply(const struct ofputil_table_features *tf, otf = ofpbuf_put_zeros(reply, sizeof *otf); otf->table_id = tf->table_id; - ovs_strlcpy(otf->name, tf->name, sizeof otf->name); + ovs_strlcpy_arrays(otf->name, tf->name); otf->metadata_match = tf->metadata_match; otf->metadata_write = tf->metadata_write; if (version >= OFP14_VERSION) { @@ -6257,7 +6257,7 @@ ofputil_put_ofp10_table_stats(const struct ofputil_table_stats *stats, out = ofpbuf_put_zeros(buf, sizeof *out); out->table_id = features->table_id; - ovs_strlcpy(out->name, features->name, sizeof out->name); + ovs_strlcpy_arrays(out->name, features->name); out->wildcards = mf_bitmap_to_of10(&wc); out->max_entries = htonl(features->max_entries); out->active_count = htonl(stats->active_count); @@ -6328,7 +6328,7 @@ ofputil_put_ofp11_table_stats(const struct ofputil_table_stats *stats, out = ofpbuf_put_zeros(buf, sizeof *out); out->table_id = features->table_id; - ovs_strlcpy(out->name, features->name, sizeof out->name); + ovs_strlcpy_arrays(out->name, features->name); out->wildcards = mf_bitmap_to_of11(&wc); out->match = mf_bitmap_to_of11(&features->match); out->instructions = ovsinst_bitmap_to_openflow( @@ -6353,7 +6353,7 @@ ofputil_put_ofp12_table_stats(const struct ofputil_table_stats *stats, out = ofpbuf_put_zeros(buf, sizeof *out); out->table_id = features->table_id; - ovs_strlcpy(out->name, features->name, sizeof out->name); + ovs_strlcpy_arrays(out->name, features->name); out->match = oxm_bitmap_from_mf_bitmap(&features->match, OFP12_VERSION); out->wildcards = oxm_bitmap_from_mf_bitmap(&features->wildcard, OFP12_VERSION); @@ -6445,7 +6445,7 @@ ofputil_decode_ofp10_table_stats(struct ofpbuf *msg, } features->table_id = ots->table_id; - ovs_strlcpy(features->name, ots->name, sizeof features->name); + ovs_strlcpy_arrays(features->name, ots->name); features->max_entries = ntohl(ots->max_entries); features->match = features->wildcard = mf_bitmap_from_of10(ots->wildcards); @@ -6470,7 +6470,7 @@ ofputil_decode_ofp11_table_stats(struct ofpbuf *msg, } features->table_id = ots->table_id; - ovs_strlcpy(features->name, ots->name, sizeof features->name); + ovs_strlcpy_arrays(features->name, ots->name); features->max_entries = ntohl(ots->max_entries); features->nonmiss.instructions = ovsinst_bitmap_from_openflow( ots->instructions, OFP11_VERSION); @@ -6506,7 +6506,7 @@ ofputil_decode_ofp12_table_stats(struct ofpbuf *msg, } features->table_id = ots->table_id; - ovs_strlcpy(features->name, ots->name, sizeof features->name); + ovs_strlcpy_arrays(features->name, ots->name); features->metadata_match = ots->metadata_match; features->metadata_write = ots->metadata_write; features->miss_config = ofputil_decode_table_miss(ots->config, diff --git a/lib/ovs-rcu.c b/lib/ovs-rcu.c index 0614d988c60e..dac38447a943 100644 --- a/lib/ovs-rcu.c +++ b/lib/ovs-rcu.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Nicira, Inc. + * Copyright (c) 2014, 2017 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -207,8 +207,7 @@ ovsrcu_synchronize(void) ovs_mutex_lock(&ovsrcu_threads_mutex); LIST_FOR_EACH (perthread, list_node, &ovsrcu_threads) { if (perthread->seqno <= target_seqno) { - ovs_strlcpy(stalled_thread, perthread->name, - sizeof stalled_thread); + ovs_strlcpy_arrays(stalled_thread, perthread->name); done = false; break; } diff --git a/lib/tnl-ports.c b/lib/tnl-ports.c index 5f6dc5096941..4a07dcb5cc96 100644 --- a/lib/tnl-ports.c +++ b/lib/tnl-ports.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015 Nicira, Inc. + * Copyright (c) 2014, 2015, 2017 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -492,7 +492,7 @@ tnl_port_map_run(void) } /* Address changed. */ - ovs_strlcpy(dev_name, ip_dev->dev_name, sizeof dev_name); + ovs_strlcpy_arrays(dev_name, ip_dev->dev_name); delete_ipdev(ip_dev); insert_ipdev(dev_name); } diff --git a/lib/util.h b/lib/util.h index aa38122ee950..d2374b2470f1 100644 --- a/lib/util.h +++ b/lib/util.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -135,6 +135,13 @@ void free_cacheline(void *); void ovs_strlcpy(char *dst, const char *src, size_t size); void ovs_strzcpy(char *dst, const char *src, size_t size); +/* Copy string SRC to DST, but no more bytes than the shorter of DST or SRC. + * DST and SRC must both be char arrays, not pointers, and with GNU C, this + * raises a compiler error if either DST or SRC is a pointer instead of an + * array. */ +#define ovs_strlcpy_arrays(DST, SRC) \ + ovs_strlcpy(DST, SRC, MIN(ARRAY_SIZE(DST), ARRAY_SIZE(SRC))) + OVS_NO_RETURN void ovs_abort(int err_no, const char *format, ...) OVS_PRINTF_FORMAT(2, 3); OVS_NO_RETURN void ovs_abort_valist(int err_no, const char *format, va_list) diff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c index 01259e2d3a05..9b408ea6c253 100644 --- a/ovn/controller/pinctrl.c +++ b/ovn/controller/pinctrl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, 2016 Red Hat, Inc. +/* Copyright (c) 2015, 2016, 2017 Red Hat, Inc. * Copyright (c) 2017 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -898,7 +898,7 @@ pinctrl_handle_put_mac_binding(const struct flow *md, hmap_insert(&put_mac_bindings, &pmb->hmap_node, hash); pmb->dp_key = dp_key; pmb->port_key = port_key; - ovs_strlcpy(pmb->ip_s, ip_s, sizeof pmb->ip_s); + ovs_strlcpy_arrays(pmb->ip_s, ip_s); } pmb->timestamp = time_msec(); pmb->mac = headers->dl_src; -- 2.10.2 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev