Skip to content

Commit 41af06d

Browse files
author
yubo
committed
fix: put sock after lookup
1 parent 9dc6b83 commit 41af06d

File tree

1 file changed

+43
-21
lines changed

1 file changed

+43
-21
lines changed

src/ca_core.c

+43-21
Original file line numberDiff line numberDiff line change
@@ -23,30 +23,39 @@ struct syscall_links sys;
2323

2424
static int ip_vs_ca_modify_uaddr(int fd, struct sockaddr *uaddr, int *ulen, int append)
2525
{
26-
int err, len;
27-
struct socket *sock;
26+
int err, len, ret = 0;
27+
struct socket *sock = NULL;
2828
struct sockaddr_in sin[2];
2929
union nf_inet_addr addr;
3030
struct ip_vs_ca_conn *cp;
3131

3232
err = get_user(len, ulen);
33-
if (err)
34-
return 1;
33+
if (err){
34+
ret = 1;
35+
goto out;
36+
}
3537

3638
if (len != sizeof(struct sockaddr_in)){
37-
return 2;
39+
ret = 2;
40+
goto out;
3841
}
3942

4043
err = copy_from_user(sin, uaddr, len);
41-
if (err)
42-
return 3;
44+
if (err){
45+
ret = 3;
46+
goto out;
47+
}
4348

44-
if (sin[0].sin_family != AF_INET)
45-
return 4;
49+
if (sin[0].sin_family != AF_INET){
50+
ret = 4;
51+
goto out;
52+
}
4653

4754
sock = sockfd_lookup(fd, &err);
48-
if (!sock)
49-
return 5;
55+
if (!sock){
56+
ret = 5;
57+
goto out;
58+
}
5059

5160
IP_VS_CA_DBG("%s called, sin{.family:%d, .port:%d, addr:%pI4} sock.type:%d\n",
5261
__func__, sin[0].sin_family, ntohs(sin[0].sin_port),
@@ -59,16 +68,19 @@ static int ip_vs_ca_modify_uaddr(int fd, struct sockaddr *uaddr, int *ulen, int
5968
}else if(sock->type == SOCK_DGRAM){
6069
cp = ip_vs_ca_conn_get(sin[0].sin_family, IPPROTO_UDP, &addr, sin[0].sin_port);
6170
}else{
62-
return 6;
71+
ret = 6;
72+
goto out;
6373
}
6474

6575
IP_VS_CA_DBG("lookup type:%d %pI4:%d %s\n",
6676
sock->type,
6777
&addr.ip, ntohs(sin[0].sin_port),
6878
cp ? "hit" : "not hit");
6979

70-
if (!cp)
71-
return 7;
80+
if (!cp){
81+
ret = 7;
82+
goto out;
83+
}
7284

7385
IP_VS_CA_DBG("%s called, %d %pI4:%d(%pI4:%d)->%pI4:%d\n",
7486
__func__, cp->protocol,
@@ -81,19 +93,29 @@ static int ip_vs_ca_modify_uaddr(int fd, struct sockaddr *uaddr, int *ulen, int
8193
sin[1].sin_port = cp->o_port;
8294
ip_vs_ca_conn_put(cp);
8395
IP_VS_CA_DBG("copy_to_user\n");
84-
if(copy_to_user(uaddr, sin, 2*len))
85-
return 8;
96+
if(copy_to_user(uaddr, sin, 2*len)){
97+
ret = 8;
98+
goto out;
99+
}
86100
IP_VS_CA_DBG("put_user\n");
87-
if (put_user(2*len, ulen))
88-
return 9;
101+
if (put_user(2*len, ulen)){
102+
ret = 9;
103+
goto out;
104+
}
89105
}else{
90106
sin[0].sin_addr.s_addr = cp->o_addr.ip;
91107
sin[0].sin_port = cp->o_port;
92108
ip_vs_ca_conn_put(cp);
93-
if(copy_to_user(uaddr, sin, len))
94-
return 8;
109+
if(copy_to_user(uaddr, sin, len)) {
110+
ret = 10;
111+
goto out;
112+
}
95113
}
96-
return 0;
114+
115+
out:
116+
if (sock && sock->file)
117+
sockfd_put(sock);
118+
return ret;
97119
}
98120

99121
/*

0 commit comments

Comments
 (0)