From 4dc5d0ad3bb6c4d3b2fcba706d6fbed9ef744d70 Mon Sep 17 00:00:00 2001 From: Anatoly Burakov Date: Wed, 18 Jun 2014 15:50:33 +0100 Subject: [PATCH] ip_frag: custom memmove 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 Acked-by: Thomas Monjalon --- lib/librte_ip_frag/rte_ipv6_reassembly.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/librte_ip_frag/rte_ipv6_reassembly.c b/lib/librte_ip_frag/rte_ipv6_reassembly.c index c6228275f3..3f069604b6 100644 --- a/lib/librte_ip_frag/rte_ipv6_reassembly.c +++ b/lib/librte_ip_frag/rte_ipv6_reassembly.c @@ -45,6 +45,16 @@ * */ +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)); -- 2.20.1