summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/netlink.c5
-rw-r--r--lib/ofpbuf.c2
-rw-r--r--lib/svec.c4
-rw-r--r--lib/util.c2
-rw-r--r--lib/util.h21
-rw-r--r--ovn/utilities/ovn-nbctl.c18
6 files changed, 40 insertions, 12 deletions
diff --git a/lib/netlink.c b/lib/netlink.c
index 3da22a1ac..0246131a4 100644
--- a/lib/netlink.c
+++ b/lib/netlink.c
@@ -241,7 +241,10 @@ void
nl_msg_put_unspec(struct ofpbuf *msg, uint16_t type,
const void *data, size_t size)
{
- memcpy(nl_msg_put_unspec_uninit(msg, type, size), data, size);
+ void *ptr;
+
+ ptr = nl_msg_put_unspec_uninit(msg, type, size);
+ nullable_memcpy(ptr, data, size);
}
/* Appends a Netlink attribute of the given 'type' and no payload to 'msg'.
diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c
index 3019c4a95..f4a904064 100644
--- a/lib/ofpbuf.c
+++ b/lib/ofpbuf.c
@@ -375,7 +375,7 @@ void *
ofpbuf_put_zeros(struct ofpbuf *b, size_t size)
{
void *dst = ofpbuf_put_uninit(b, size);
- memset(dst, 0, size);
+ nullable_memset(dst, 0, size);
return dst;
}
diff --git a/lib/svec.c b/lib/svec.c
index aad04e38c..297a60ce1 100644
--- a/lib/svec.c
+++ b/lib/svec.c
@@ -127,7 +127,9 @@ compare_strings(const void *a_, const void *b_)
void
svec_sort(struct svec *svec)
{
- qsort(svec->names, svec->n, sizeof *svec->names, compare_strings);
+ if (svec->n) {
+ qsort(svec->names, svec->n, sizeof *svec->names, compare_strings);
+ }
}
void
diff --git a/lib/util.c b/lib/util.c
index b2a1f8ad0..85b935045 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -132,7 +132,7 @@ void *
xmemdup(const void *p_, size_t size)
{
void *p = xmalloc(size);
- memcpy(p, p_, size);
+ nullable_memcpy(p, p_, size);
return p;
}
diff --git a/lib/util.h b/lib/util.h
index d2374b247..c2d1c3fc6 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -135,6 +135,27 @@ 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);
+/* The C standards say that neither the 'dst' nor 'src' argument to
+ * memcpy() may be null, even if 'n' is zero. This wrapper tolerates
+ * the null case. */
+static inline void
+nullable_memcpy(void *dst, const void *src, size_t n)
+{
+ if (n) {
+ memcpy(dst, src, n);
+ }
+}
+
+/* The C standards say that the 'dst' argument to memset may not be
+ * null, even if 'n' is zero. This wrapper tolerates the null case. */
+static inline void
+nullable_memset(void *dst, int c, size_t n)
+{
+ if (n) {
+ memset(dst, c, n);
+ }
+}
+
/* 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
diff --git a/ovn/utilities/ovn-nbctl.c b/ovn/utilities/ovn-nbctl.c
index bd0160a7e..bea010ab1 100644
--- a/ovn/utilities/ovn-nbctl.c
+++ b/ovn/utilities/ovn-nbctl.c
@@ -920,7 +920,7 @@ nbctl_lsp_add(struct ctl_context *ctx)
nbrec_logical_switch_verify_ports(ls);
struct nbrec_logical_switch_port **new_ports = xmalloc(sizeof *new_ports *
(ls->n_ports + 1));
- memcpy(new_ports, ls->ports, sizeof *new_ports * ls->n_ports);
+ nullable_memcpy(new_ports, ls->ports, sizeof *new_ports * ls->n_ports);
new_ports[ls->n_ports] = CONST_CAST(struct nbrec_logical_switch_port *,
lsp);
nbrec_logical_switch_set_ports(ls, new_ports, ls->n_ports + 1);
@@ -1379,7 +1379,7 @@ nbctl_acl_add(struct ctl_context *ctx)
/* Insert the acl into the logical switch. */
nbrec_logical_switch_verify_acls(ls);
struct nbrec_acl **new_acls = xmalloc(sizeof *new_acls * (ls->n_acls + 1));
- memcpy(new_acls, ls->acls, sizeof *new_acls * ls->n_acls);
+ nullable_memcpy(new_acls, ls->acls, sizeof *new_acls * ls->n_acls);
new_acls[ls->n_acls] = acl;
nbrec_logical_switch_set_acls(ls, new_acls, ls->n_acls + 1);
free(new_acls);
@@ -1697,7 +1697,8 @@ nbctl_lr_lb_add(struct ctl_context *ctx)
struct nbrec_load_balancer **new_lbs
= xmalloc(sizeof *new_lbs * (lr->n_load_balancer + 1));
- memcpy(new_lbs, lr->load_balancer, sizeof *new_lbs * lr->n_load_balancer);
+ nullable_memcpy(new_lbs, lr->load_balancer,
+ sizeof *new_lbs * lr->n_load_balancer);
new_lbs[lr->n_load_balancer] = CONST_CAST(struct nbrec_load_balancer *,
new_lb);
nbrec_logical_router_set_load_balancer(lr, new_lbs,
@@ -1793,7 +1794,8 @@ nbctl_ls_lb_add(struct ctl_context *ctx)
struct nbrec_load_balancer **new_lbs
= xmalloc(sizeof *new_lbs * (ls->n_load_balancer + 1));
- memcpy(new_lbs, ls->load_balancer, sizeof *new_lbs * ls->n_load_balancer);
+ nullable_memcpy(new_lbs, ls->load_balancer,
+ sizeof *new_lbs * ls->n_load_balancer);
new_lbs[ls->n_load_balancer] = CONST_CAST(struct nbrec_load_balancer *,
new_lb);
nbrec_logical_switch_set_load_balancer(ls, new_lbs,
@@ -2200,8 +2202,8 @@ nbctl_lr_route_add(struct ctl_context *ctx)
nbrec_logical_router_verify_static_routes(lr);
struct nbrec_logical_router_static_route **new_routes
= xmalloc(sizeof *new_routes * (lr->n_static_routes + 1));
- memcpy(new_routes, lr->static_routes,
- sizeof *new_routes * lr->n_static_routes);
+ nullable_memcpy(new_routes, lr->static_routes,
+ sizeof *new_routes * lr->n_static_routes);
new_routes[lr->n_static_routes] = route;
nbrec_logical_router_set_static_routes(lr, new_routes,
lr->n_static_routes + 1);
@@ -2364,7 +2366,7 @@ nbctl_lr_nat_add(struct ctl_context *ctx)
/* Insert the NAT into the logical router. */
nbrec_logical_router_verify_nat(lr);
struct nbrec_nat **new_nats = xmalloc(sizeof *new_nats * (lr->n_nat + 1));
- memcpy(new_nats, lr->nat, sizeof *new_nats * lr->n_nat);
+ nullable_memcpy(new_nats, lr->nat, sizeof *new_nats * lr->n_nat);
new_nats[lr->n_nat] = nat;
nbrec_logical_router_set_nat(lr, new_nats, lr->n_nat + 1);
free(new_nats);
@@ -2642,7 +2644,7 @@ nbctl_lrp_add(struct ctl_context *ctx)
nbrec_logical_router_verify_ports(lr);
struct nbrec_logical_router_port **new_ports = xmalloc(sizeof *new_ports *
(lr->n_ports + 1));
- memcpy(new_ports, lr->ports, sizeof *new_ports * lr->n_ports);
+ nullable_memcpy(new_ports, lr->ports, sizeof *new_ports * lr->n_ports);
new_ports[lr->n_ports] = CONST_CAST(struct nbrec_logical_router_port *,
lrp);
nbrec_logical_router_set_ports(lr, new_ports, lr->n_ports + 1);