Commit f6685938 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by David S. Miller

[TCP_IPV4]: Use kmemdup where appropriate

Also use a variable to avoid the longish tp->md5sig_info-> use
in tcp_v4_md5_do_add.

Code diff stats:

[acme@newtoy net-2.6.20]$ codiff /tmp/tcp_ipv4.o.before /tmp/tcp_ipv4.o.after
/pub/scm/linux/kernel/git/acme/net-2.6.20/net/ipv4/tcp_ipv4.c:
  tcp_v4_md5_do_add     |  -62
  tcp_v4_syn_recv_sock  |  -32
  tcp_v4_parse_md5_keys |  -86
 3 functions changed, 180 bytes removed
[acme@newtoy net-2.6.20]$
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@mandriva.com>
parent 7174259e
...@@ -855,15 +855,18 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr, ...@@ -855,15 +855,18 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
struct tcp4_md5sig_key *keys; struct tcp4_md5sig_key *keys;
key = (struct tcp4_md5sig_key *) tcp_v4_md5_do_lookup(sk, addr); key = (struct tcp4_md5sig_key *)tcp_v4_md5_do_lookup(sk, addr);
if (key) { if (key) {
/* Pre-existing entry - just update that one. */ /* Pre-existing entry - just update that one. */
kfree (key->key); kfree(key->key);
key->key = newkey; key->key = newkey;
key->keylen = newkeylen; key->keylen = newkeylen;
} else { } else {
struct tcp_md5sig_info *md5sig;
if (!tp->md5sig_info) { if (!tp->md5sig_info) {
tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info), GFP_ATOMIC); tp->md5sig_info = kzalloc(sizeof(*tp->md5sig_info),
GFP_ATOMIC);
if (!tp->md5sig_info) { if (!tp->md5sig_info) {
kfree(newkey); kfree(newkey);
return -ENOMEM; return -ENOMEM;
...@@ -873,30 +876,31 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr, ...@@ -873,30 +876,31 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,
kfree(newkey); kfree(newkey);
return -ENOMEM; return -ENOMEM;
} }
if (tp->md5sig_info->alloced4 == tp->md5sig_info->entries4) { md5sig = tp->md5sig_info;
keys = kmalloc((sizeof(struct tcp4_md5sig_key) *
(tp->md5sig_info->entries4 + 1)), GFP_ATOMIC); if (md5sig->alloced4 == md5sig->entries4) {
keys = kmalloc((sizeof(*keys) *
(md5sig->entries4 + 1)), GFP_ATOMIC);
if (!keys) { if (!keys) {
kfree(newkey); kfree(newkey);
tcp_free_md5sig_pool(); tcp_free_md5sig_pool();
return -ENOMEM; return -ENOMEM;
} }
if (tp->md5sig_info->entries4) if (md5sig->entries4)
memcpy(keys, tp->md5sig_info->keys4, memcpy(keys, md5sig->keys4,
(sizeof (struct tcp4_md5sig_key) * sizeof(*keys) * md5sig->entries4);
tp->md5sig_info->entries4));
/* Free old key list, and reference new one */ /* Free old key list, and reference new one */
if (tp->md5sig_info->keys4) if (md5sig->keys4)
kfree(tp->md5sig_info->keys4); kfree(md5sig->keys4);
tp->md5sig_info->keys4 = keys; md5sig->keys4 = keys;
tp->md5sig_info->alloced4++; md5sig->alloced4++;
} }
tp->md5sig_info->entries4++; md5sig->entries4++;
tp->md5sig_info->keys4[tp->md5sig_info->entries4 - 1].addr = addr; md5sig->keys4[md5sig->entries4 - 1].addr = addr;
tp->md5sig_info->keys4[tp->md5sig_info->entries4 - 1].key = newkey; md5sig->keys4[md5sig->entries4 - 1].key = newkey;
tp->md5sig_info->keys4[tp->md5sig_info->entries4 - 1].keylen = newkeylen; md5sig->keys4[md5sig->entries4 - 1].keylen = newkeylen;
} }
return 0; return 0;
} }
...@@ -998,10 +1002,9 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval, ...@@ -998,10 +1002,9 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval,
} }
newkey = kmalloc(cmd.tcpm_keylen, GFP_KERNEL); newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
if (!newkey) if (!newkey)
return -ENOMEM; return -ENOMEM;
memcpy(newkey, cmd.tcpm_key, cmd.tcpm_keylen);
return tcp_v4_md5_do_add(sk, sin->sin_addr.s_addr, return tcp_v4_md5_do_add(sk, sin->sin_addr.s_addr,
newkey, cmd.tcpm_keylen); newkey, cmd.tcpm_keylen);
} }
...@@ -1494,13 +1497,11 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb, ...@@ -1494,13 +1497,11 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
* memory, then we end up not copying the key * memory, then we end up not copying the key
* across. Shucks. * across. Shucks.
*/ */
char *newkey = kmalloc(key->keylen, GFP_ATOMIC); char *newkey = kmemdup(key->key, key->keylen, GFP_ATOMIC);
if (newkey) { if (newkey != NULL)
memcpy(newkey, key->key, key->keylen);
tcp_v4_md5_do_add(newsk, inet_sk(sk)->daddr, tcp_v4_md5_do_add(newsk, inet_sk(sk)->daddr,
newkey, key->keylen); newkey, key->keylen);
} }
}
#endif #endif
__inet_hash(&tcp_hashinfo, newsk, 0); __inet_hash(&tcp_hashinfo, newsk, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment