struct addrconf_sysctl_table *t;
        char *dev_name = NULL;
 
-       t = kmalloc(sizeof(*t), GFP_KERNEL);
+       t = kmemdup(&addrconf_sysctl, sizeof(*t), GFP_KERNEL);
        if (t == NULL)
                return;
-       memcpy(t, &addrconf_sysctl, sizeof(*t));
        for (i=0; t->addrconf_vars[i].data; i++) {
                t->addrconf_vars[i].data += (char*)p - (char*)&ipv6_devconf;
                t->addrconf_vars[i].de = NULL;
 
        if (!pskb_may_pull(skb, ah_hlen))
                goto out;
 
-       tmp_hdr = kmalloc(hdr_len, GFP_ATOMIC);
+       tmp_hdr = kmemdup(skb->nh.raw, hdr_len, GFP_ATOMIC);
        if (!tmp_hdr)
                goto out;
-       memcpy(tmp_hdr, skb->nh.raw, hdr_len);
        if (ipv6_clear_mutable_options(skb->nh.ipv6h, hdr_len, XFRM_POLICY_IN))
                goto free_out;
        skb->nh.ipv6h->priority    = 0;
 
                skb_shinfo(skb)->frag_list = NULL;
                /* BUILD HEADER */
 
-               tmp_hdr = kmalloc(hlen, GFP_ATOMIC);
+               tmp_hdr = kmemdup(skb->nh.raw, hlen, GFP_ATOMIC);
                if (!tmp_hdr) {
                        IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS);
                        return -ENOMEM;
                }
 
                *prevhdr = NEXTHDR_FRAGMENT;
-               memcpy(tmp_hdr, skb->nh.raw, hlen);
                __skb_pull(skb, hlen);
                fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr));
                skb->nh.raw = __skb_push(skb, hlen);
 
                tp->md5sig_info = p;
        }
 
-       newkey = kmalloc(cmd.tcpm_keylen, GFP_KERNEL);
+       newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
        if (!newkey)
                return -ENOMEM;
-       memcpy(newkey, cmd.tcpm_key, cmd.tcpm_keylen);
        if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_MAPPED) {
                return tcp_v4_md5_do_add(sk, sin6->sin6_addr.s6_addr32[3],
                                         newkey, cmd.tcpm_keylen);
                 * memory, then we end up not copying the key
                 * across. Shucks.
                 */
-               char *newkey = kmalloc(key->keylen, GFP_ATOMIC);
-               if (newkey) {
-                       memcpy(newkey, key->key, key->keylen);
+               char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
+               if (newkey != NULL)
                        tcp_v6_md5_do_add(newsk, &inet6_sk(sk)->daddr,
                                          newkey, key->keylen);
-               }
        }
 #endif