@@ -119,6 +119,7 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
119119 const struct nlattr * const tb [])
120120{
121121 struct nft_nat * priv = nft_expr_priv (expr );
122+ unsigned int alen , plen ;
122123 u32 family ;
123124 int err ;
124125
@@ -146,45 +147,56 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
146147 return - EINVAL ;
147148
148149 family = ntohl (nla_get_be32 (tb [NFTA_NAT_FAMILY ]));
149- if (family != AF_INET && family != AF_INET6 )
150- return - EAFNOSUPPORT ;
151150 if (family != ctx -> afi -> family )
152151 return - EOPNOTSUPP ;
152+
153+ switch (family ) {
154+ case NFPROTO_IPV4 :
155+ alen = FIELD_SIZEOF (struct nf_nat_range , min_addr .ip );
156+ break ;
157+ case NFPROTO_IPV6 :
158+ alen = FIELD_SIZEOF (struct nf_nat_range , min_addr .ip6 );
159+ break ;
160+ default :
161+ return - EAFNOSUPPORT ;
162+ }
153163 priv -> family = family ;
154164
155165 if (tb [NFTA_NAT_REG_ADDR_MIN ]) {
156166 priv -> sreg_addr_min =
157167 ntohl (nla_get_be32 (tb [NFTA_NAT_REG_ADDR_MIN ]));
158-
159- err = nft_validate_input_register (priv -> sreg_addr_min );
168+ err = nft_validate_register_load (priv -> sreg_addr_min , alen );
160169 if (err < 0 )
161170 return err ;
162171
163172 if (tb [NFTA_NAT_REG_ADDR_MAX ]) {
164173 priv -> sreg_addr_max =
165174 ntohl (nla_get_be32 (tb [NFTA_NAT_REG_ADDR_MAX ]));
166175
167- err = nft_validate_input_register (priv -> sreg_addr_max );
176+ err = nft_validate_register_load (priv -> sreg_addr_max ,
177+ alen );
168178 if (err < 0 )
169179 return err ;
170180 } else {
171181 priv -> sreg_addr_max = priv -> sreg_addr_min ;
172182 }
173183 }
174184
185+ plen = FIELD_SIZEOF (struct nf_nat_range , min_addr .all );
175186 if (tb [NFTA_NAT_REG_PROTO_MIN ]) {
176187 priv -> sreg_proto_min =
177188 ntohl (nla_get_be32 (tb [NFTA_NAT_REG_PROTO_MIN ]));
178189
179- err = nft_validate_input_register (priv -> sreg_proto_min );
190+ err = nft_validate_register_load (priv -> sreg_proto_min , plen );
180191 if (err < 0 )
181192 return err ;
182193
183194 if (tb [NFTA_NAT_REG_PROTO_MAX ]) {
184195 priv -> sreg_proto_max =
185196 ntohl (nla_get_be32 (tb [NFTA_NAT_REG_PROTO_MAX ]));
186197
187- err = nft_validate_input_register (priv -> sreg_proto_max );
198+ err = nft_validate_register_load (priv -> sreg_proto_max ,
199+ plen );
188200 if (err < 0 )
189201 return err ;
190202 } else {
0 commit comments