all: Avoid pointer arithmetic on `void *`
authorMichael Forney <mforney@mforney.org>
Sun, 11 Aug 2019 04:49:07 +0000 (04:49 +0000)
committerThomas Haller <thaller@redhat.com>
Fri, 16 Aug 2019 05:42:03 +0000 (07:42 +0200)
ISO C requires that the pointer operand to the binary + operator be to
a complete object type[0].

[0] http://port70.net/~nsz/c/c11/n1570.html#6.5.6p2

17 files changed:
Makefile.am
lib/attr.c
lib/data.c
lib/genl/genl.c
lib/hashtable.c
lib/msg.c
lib/object.c
lib/route/cls/ematch.c
lib/route/cls/ematch/nbyte.c
lib/route/cls/ematch/text.c
lib/route/link/veth.c
lib/route/qdisc/mqprio.c
lib/route/qdisc/netem.c
lib/route/route_obj.c
lib/xfrm/sa.c
lib/xfrm/sp.c
src/nl-tctree-list.c

index 2c01e9884ab7456154d98787161a5513e6183f06..a698e73d4211c70562b451bb0d09a1876329b046 100644 (file)
@@ -37,6 +37,7 @@ warn_cppflags = \
        -Wno-unused-parameter \
        -Wno-sign-compare \
        -Wno-missing-field-initializers \
+       -Wpointer-arith \
        $(NULL)
 
 ###############################################################################
index 0793dc348cf87c196afe77aa4d61e5b985aba7d9..a4f585275f1c677892cafae9efe64f698e98d2a0 100644 (file)
@@ -478,7 +478,7 @@ struct nlattr *nla_reserve(struct nl_msg *msg, int attrtype, int attrlen)
        NL_DBG(2, "msg %p: attr <%p> %d: Reserved %d (%d) bytes at offset +%td "
                  "nlmsg_len=%d\n", msg, nla, nla->nla_type,
                  nla_total_size(attrlen), attrlen,
-                 (void *) nla - nlmsg_data(msg->nm_nlh),
+                 (char *) nla - (char *) nlmsg_data(msg->nm_nlh),
                  msg->nm_nlh->nlmsg_len);
 
        return nla;
@@ -514,7 +514,7 @@ int nla_put(struct nl_msg *msg, int attrtype, int datalen, const void *data)
                memcpy(nla_data(nla), data, datalen);
                NL_DBG(2, "msg %p: attr <%p> %d: Wrote %d bytes at offset +%td\n",
                       msg, nla, nla->nla_type, datalen,
-                      (void *) nla - nlmsg_data(msg->nm_nlh));
+                      (char *) nla - (char *) nlmsg_data(msg->nm_nlh));
        }
 
        return 0;
@@ -917,7 +917,7 @@ static int _nest_end(struct nl_msg *msg, struct nlattr *start, int keep_empty)
 {
        size_t pad, len;
 
-       len = (void *) nlmsg_tail(msg->nm_nlh) - (void *) start;
+       len = (char *) nlmsg_tail(msg->nm_nlh) - (char *) start;
 
        if (   len > USHRT_MAX
            || (!keep_empty && len == NLA_HDRLEN)) {
@@ -996,7 +996,7 @@ void nla_nest_cancel(struct nl_msg *msg, const struct nlattr *attr)
 {
        ssize_t len;
 
-       len = (void *) nlmsg_tail(msg->nm_nlh) - (void *) attr;
+       len = (char *) nlmsg_tail(msg->nm_nlh) - (char *) attr;
        if (len < 0)
                BUG();
        else if (len > 0) {
index 712e84d0b6daeb05086fb3908b51bae3b612380b..fea3060e17276a34947e68127957fdc97ddb85e4 100644 (file)
@@ -112,7 +112,7 @@ struct nl_data *nl_data_clone(const struct nl_data *src)
 int nl_data_append(struct nl_data *data, const void *buf, size_t size)
 {
        if (size > 0) {
-               void *d_data = realloc(data->d_data, data->d_size + size);
+               char *d_data = realloc(data->d_data, data->d_size + size);
                if (!d_data)
                        return -NLE_NOMEM;
 
index 49e82c2ae6f4bc4e2b8d67114d00fd2fb79a9869..b4f37b5b20f6653d5437464b2e7c59f982e9fb9a 100644 (file)
@@ -260,7 +260,7 @@ void *genlmsg_user_hdr(const struct genlmsghdr *gnlh)
  */
 void *genlmsg_user_data(const struct genlmsghdr *gnlh, const int hdrlen)
 {
-       return genlmsg_user_hdr(gnlh) + NLMSG_ALIGN(hdrlen);
+       return (char *) genlmsg_user_hdr(gnlh) + NLMSG_ALIGN(hdrlen);
 }
 
 /**
@@ -364,7 +364,7 @@ void *genlmsg_put(struct nl_msg *msg, uint32_t port, uint32_t seq, int family,
        NL_DBG(2, "msg %p: Added generic netlink header cmd=%d version=%d\n",
               msg, cmd, version);
 
-       return nlmsg_data(nlh) + GENL_HDRLEN;
+       return (char *) nlmsg_data(nlh) + GENL_HDRLEN;
 }
 
 /** @} */
index bf6981e71d3333886b7fb14c0399baeef9241947..db4ed8b68d4dadfa465098b7feb92e71cc36c977 100644 (file)
@@ -192,7 +192,7 @@ int nl_hash_table_del(nl_hash_table_t *ht, struct nl_object *obj)
 
 uint32_t nl_hash(void *k, size_t length, uint32_t initval)
 {
-       return(__nl_hash(k, length, initval));
+       return(__nl_hash((char *) k, length, initval));
 }
 
 /** @} */
index e3fb629ca90a27f8e8890d0f7dc1c89ace518d82..c08b3a40a3c40888000cd3415a9592c475f5173e 100644 (file)
--- a/lib/msg.c
+++ b/lib/msg.c
@@ -410,7 +410,7 @@ struct nl_msg *nlmsg_convert(struct nlmsghdr *hdr)
  */
 void *nlmsg_reserve(struct nl_msg *n, size_t len, int pad)
 {
-       void *buf = n->nm_nlh;
+       char *buf = (char *) n->nm_nlh;
        size_t nlmsg_len = n->nm_nlh->nlmsg_len;
        size_t tlen;
 
@@ -838,7 +838,7 @@ static void print_genl_hdr(FILE *ofd, void *start)
 static void *print_genl_msg(struct nl_msg *msg, FILE *ofd, struct nlmsghdr *hdr,
                            struct nl_cache_ops *ops, int *payloadlen)
 {
-       void *data = nlmsg_data(hdr);
+       char *data = nlmsg_data(hdr);
 
        if (*payloadlen < GENL_HDRLEN)
                return data;
@@ -901,7 +901,7 @@ static void dump_attrs(FILE *ofd, struct nlattr *attrs, int attrlen,
                        prefix_line(ofd, prefix);
                        fprintf(ofd, "  [PADDING] %d octets\n",
                                padlen);
-                       dump_hex(ofd, nla_data(nla) + alen,
+                       dump_hex(ofd, (char *) nla_data(nla) + alen,
                                 padlen, prefix);
                }
        }
index 5ced84b50a31bc91c42bf510f45420cf7a39c3ae..7ba74652629f02dca044525b6d2b579b6ba42aa1 100644 (file)
@@ -132,7 +132,7 @@ struct nl_object *nl_object_clone(struct nl_object *obj)
        new->ce_mask = obj->ce_mask;
 
        if (size)
-               memcpy((void *)new + doff, (void *)obj + doff, size);
+               memcpy((char *)new + doff, (char *)obj + doff, size);
 
        if (ops->oo_clone) {
                if (ops->oo_clone(new, obj) < 0) {
index 32f723e2a1c1e874299ac3f692f333102a584ca5..18f5be9f8c9652129dd2af2e3cb259e6c1fb01e1 100644 (file)
@@ -465,7 +465,7 @@ int rtnl_ematch_parse_attr(struct nlattr *attr, struct rtnl_ematch_tree **result
                }
 
                hdr = nla_data(a);
-               data = nla_data(a) + NLA_ALIGN(sizeof(*hdr));
+               data = (char *) nla_data(a) + NLA_ALIGN(sizeof(*hdr));
                len = nla_len(a) - NLA_ALIGN(sizeof(*hdr));
 
                NL_DBG(3, "ematch attribute matchid=%u, kind=%u, flags=%u\n",
index e4216d65e5e6b312836b72668989f57614a56596..2942c0da3add5b6e5fd97fdc4f1bec5fa6c1f6da 100644 (file)
@@ -94,7 +94,7 @@ static int nbyte_parse(struct rtnl_ematch *e, void *data, size_t len)
                if (!(n->pattern = calloc(1, plen)))
                        return -NLE_NOMEM;
 
-               memcpy(n->pattern, data + hdrlen, plen);
+               memcpy(n->pattern, (char *) data + hdrlen, plen);
        }
 
        return 0;
index 12a1e747b48a138ee9fd4c1854a88e6e2f3ece77..af2e373f7198500b6779bd85e2e4e2285c168121 100644 (file)
@@ -117,7 +117,7 @@ static int text_parse(struct rtnl_ematch *e, void *data, size_t len)
                if (!(t->pattern = calloc(1, t->cfg.pattern_len)))
                        return -NLE_NOMEM;
 
-               memcpy(t->pattern, data + hdrlen, t->cfg.pattern_len);
+               memcpy(t->pattern, (char *) data + hdrlen, t->cfg.pattern_len);
        }
 
        return 0;
index bd3004184454b4396a04351122a85177a850d4ff..15859de824c2942e85a0aa85664d8b5ade3368d3 100644 (file)
@@ -63,8 +63,8 @@ static int veth_parse(struct rtnl_link *link, struct nlattr *data,
                peer->l_index = ifi->ifi_index;
                peer->l_flags = ifi->ifi_flags;
                peer->l_change = ifi->ifi_change;
-               err = nla_parse(peer_tb, IFLA_MAX,
-                               nla_data(nla_peer) + sizeof(struct ifinfomsg),
+               err = nla_parse(peer_tb, IFLA_MAX, (struct nlattr *)
+                               ((char *) nla_data(nla_peer) + sizeof(struct ifinfomsg)),
                                nla_len(nla_peer) - sizeof(struct ifinfomsg),
                                rtln_link_policy);
                if (err < 0)
index ea26e00f2077e7397f904770212c478cb64a7e16..0d0724760eb93184252f46841a61867d16d6f0d1 100644 (file)
@@ -63,7 +63,7 @@ static int mqprio_msg_parser(struct rtnl_tc *tc, void *data)
                struct nlattr *tb[TCA_MQPRIO_MAX + 1];
 
                err = nla_parse(tb, TCA_MQPRIO_MAX, (struct nlattr *)
-                               (tc->tc_opts->d_data + NLA_ALIGN(sizeof(*qopt))),
+                               ((char *) tc->tc_opts->d_data + NLA_ALIGN(sizeof(*qopt))),
                                len, mqprio_policy);
                if (err < 0)
                        return err;
index 20774081d5e9bca4753a7d24da8ddad5e34091c4..17dee3b7efa4e18e805d4c61336fbe8b65f99f73 100644 (file)
@@ -76,7 +76,7 @@ static int netem_msg_parser(struct rtnl_tc *tc, void *data)
                struct nlattr *tb[TCA_NETEM_MAX+1];
 
                err = nla_parse(tb, TCA_NETEM_MAX, (struct nlattr *)
-                               (tc->tc_opts->d_data + sizeof(*opts)),
+                               ((char *) tc->tc_opts->d_data + sizeof(*opts)),
                                len, netem_policy);
                if (err < 0) {
                        free(netem);
@@ -323,14 +323,14 @@ static int netem_msg_fill_raw(struct rtnl_tc *tc, void *data,
         * remainder of the message. That's just the way that sch_netem expects it.
         * Maybe there's a more succinct way to do this at a higher level.
         */
-       head = (struct nlattr *)(NLMSG_DATA(msg->nm_nlh) +
+       head = (struct nlattr *)(((char *) NLMSG_DATA(msg->nm_nlh)) +
                                 NLMSG_LENGTH(sizeof(struct tcmsg)) - NLMSG_ALIGNTO);
 
-       tail = (struct nlattr *)(((void *) (msg->nm_nlh)) +
+       tail = (struct nlattr *)(((char *) (msg->nm_nlh)) +
                                 NLMSG_ALIGN(msg->nm_nlh->nlmsg_len));
 
        old_len = head->nla_len;
-       head->nla_len = (void *)tail - (void *)head;
+       head->nla_len = (char *)tail - (char *)head;
        msg->nm_nlh->nlmsg_len += (head->nla_len - old_len);
 
        return err;
index 950b35149cb3c61ae31b0014f0c097b45f741bcb..bacabe85d6df1d1dba374c88d4af5aff6caa5121 100644 (file)
@@ -1472,8 +1472,8 @@ int rtnl_route_build_msg(struct nl_msg *msg, struct rtnl_route *route)
                            nh_encap_build_msg(msg, nh->rtnh_encap) < 0)
                                goto nla_put_failure;
 
-                       rtnh->rtnh_len = nlmsg_tail(msg->nm_nlh) -
-                                               (void *) rtnh;
+                       rtnh->rtnh_len = (char *) nlmsg_tail(msg->nm_nlh) -
+                                               (char *) rtnh;
                }
 
                nla_nest_end(msg, multipath);
index b469b0a29ec0057956292b5b94023b194b52b66e..48265ba4c99aee6af6ff8d3aefb37d74967e1e9b 100644 (file)
@@ -682,7 +682,7 @@ int xfrmnl_sa_parse(struct nlmsghdr *n, struct xfrmnl_sa **result)
        }
        else if (n->nlmsg_type == XFRM_MSG_DELSA)
        {
-               sa_info = (struct xfrm_usersa_info*)(nlmsg_data(n) + sizeof (struct xfrm_usersa_id) + NLA_HDRLEN);
+               sa_info = (struct xfrm_usersa_info*)((char *)nlmsg_data(n) + sizeof (struct xfrm_usersa_id) + NLA_HDRLEN);
        }
        else
        {
index fd7585c6f00d9af4cbd97453fd6e2c7d370b2015..99b6a4ce0d1322d5846bafe121e2cf47d1a66580 100644 (file)
@@ -532,7 +532,7 @@ int xfrmnl_sp_parse(struct nlmsghdr *n, struct xfrmnl_sp **result)
        sp->ce_msgtype = n->nlmsg_type;
        if (n->nlmsg_type == XFRM_MSG_DELPOLICY)
        {
-               sp_info = (struct xfrm_userpolicy_info*)(nlmsg_data(n) + sizeof (struct xfrm_userpolicy_id) + NLA_HDRLEN);
+               sp_info = (struct xfrm_userpolicy_info*)((char *)nlmsg_data(n) + sizeof (struct xfrm_userpolicy_id) + NLA_HDRLEN);
        }
        else
        {
index c80093bfe4ebd4d6a88395bd874175646c42e0ee..9e03038fba5b1c71f164d8cff09ed86bdb046fa8 100644 (file)
@@ -53,9 +53,9 @@ static void print_class(struct nl_object *obj, void *arg)
 
        leaf = rtnl_class_leaf_qdisc(class, qdisc_cache);
        if (leaf)
-               print_qdisc((struct nl_object *) leaf, arg + 2);
+               print_qdisc((struct nl_object *) leaf, (char *) arg + 2);
 
-       print_tc_childs(TC_CAST(class), arg + 2);
+       print_tc_childs(TC_CAST(class), (char *) arg + 2);
 
        if (rtnl_cls_alloc_cache(sock, ifindex, parent, &cls_cache) < 0)
                return;
@@ -88,7 +88,7 @@ static void print_qdisc(struct nl_object *obj, void *arg)
        params.dp_prefix = (int)(long) arg;
        nl_object_dump(obj, &params);
 
-       print_tc_childs(TC_CAST(qdisc), arg + 2);
+       print_tc_childs(TC_CAST(qdisc), (char *) arg + 2);
 
        if (rtnl_cls_alloc_cache(sock, ifindex, parent, &cls_cache) < 0)
                return;