@@ -23,30 +23,39 @@ struct syscall_links sys;
23
23
24
24
static int ip_vs_ca_modify_uaddr (int fd , struct sockaddr * uaddr , int * ulen , int append )
25
25
{
26
- int err , len ;
27
- struct socket * sock ;
26
+ int err , len , ret = 0 ;
27
+ struct socket * sock = NULL ;
28
28
struct sockaddr_in sin [2 ];
29
29
union nf_inet_addr addr ;
30
30
struct ip_vs_ca_conn * cp ;
31
31
32
32
err = get_user (len , ulen );
33
- if (err )
34
- return 1 ;
33
+ if (err ){
34
+ ret = 1 ;
35
+ goto out ;
36
+ }
35
37
36
38
if (len != sizeof (struct sockaddr_in )){
37
- return 2 ;
39
+ ret = 2 ;
40
+ goto out ;
38
41
}
39
42
40
43
err = copy_from_user (sin , uaddr , len );
41
- if (err )
42
- return 3 ;
44
+ if (err ){
45
+ ret = 3 ;
46
+ goto out ;
47
+ }
43
48
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
+ }
46
53
47
54
sock = sockfd_lookup (fd , & err );
48
- if (!sock )
49
- return 5 ;
55
+ if (!sock ){
56
+ ret = 5 ;
57
+ goto out ;
58
+ }
50
59
51
60
IP_VS_CA_DBG ("%s called, sin{.family:%d, .port:%d, addr:%pI4} sock.type:%d\n" ,
52
61
__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
59
68
}else if (sock -> type == SOCK_DGRAM ){
60
69
cp = ip_vs_ca_conn_get (sin [0 ].sin_family , IPPROTO_UDP , & addr , sin [0 ].sin_port );
61
70
}else {
62
- return 6 ;
71
+ ret = 6 ;
72
+ goto out ;
63
73
}
64
74
65
75
IP_VS_CA_DBG ("lookup type:%d %pI4:%d %s\n" ,
66
76
sock -> type ,
67
77
& addr .ip , ntohs (sin [0 ].sin_port ),
68
78
cp ? "hit" : "not hit" );
69
79
70
- if (!cp )
71
- return 7 ;
80
+ if (!cp ){
81
+ ret = 7 ;
82
+ goto out ;
83
+ }
72
84
73
85
IP_VS_CA_DBG ("%s called, %d %pI4:%d(%pI4:%d)->%pI4:%d\n" ,
74
86
__func__ , cp -> protocol ,
@@ -81,19 +93,29 @@ static int ip_vs_ca_modify_uaddr(int fd, struct sockaddr *uaddr, int *ulen, int
81
93
sin [1 ].sin_port = cp -> o_port ;
82
94
ip_vs_ca_conn_put (cp );
83
95
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
+ }
86
100
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
+ }
89
105
}else {
90
106
sin [0 ].sin_addr .s_addr = cp -> o_addr .ip ;
91
107
sin [0 ].sin_port = cp -> o_port ;
92
108
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
+ }
95
113
}
96
- return 0 ;
114
+
115
+ out :
116
+ if (sock && sock -> file )
117
+ sockfd_put (sock );
118
+ return ret ;
97
119
}
98
120
99
121
/*
0 commit comments