ip_frag: custom memmove
authorAnatoly Burakov <anatoly.burakov@intel.com>
Wed, 18 Jun 2014 14:50:33 +0000 (15:50 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Thu, 26 Jun 2014 20:51:30 +0000 (22:51 +0200)
Some implementations of memmove may make a copy of src before writing to
dst. We avoid that by explicitly writing from src to dst backwards.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Thomas Monjalon <thomas.monjalon@6wind.com>
lib/librte_ip_frag/rte_ipv6_reassembly.c

index c622827..3f06960 100644 (file)
  *
  */
 
+static inline void
+ip_frag_memmove(char *dst, char *src, int len)
+{
+       int i;
+
+       /* go backwards to make sure we don't overwrite anything important */
+       for (i = len - 1; i >= 0; i--)
+               dst[i] = src[i];
+}
+
 /*
  * Reassemble fragments into one packet.
  */
@@ -115,7 +125,7 @@ ipv6_frag_reassemble(const struct ip_frag_pkt *fp)
        frag_hdr = (struct ipv6_extension_fragment *) (ip_hdr + 1);
        ip_hdr->proto = frag_hdr->next_header;
 
-       memmove(rte_pktmbuf_mtod(m, char*) + sizeof(*frag_hdr),
+       ip_frag_memmove(rte_pktmbuf_mtod(m, char*) + sizeof(*frag_hdr),
                        rte_pktmbuf_mtod(m, char*), move_len);
 
        rte_pktmbuf_adj(m, sizeof(*frag_hdr));