@@ -177,6 +177,12 @@ struct ebt_entry *ebt_next_entry(const struct ebt_entry *entry)
177
177
return (void * )entry + entry -> next_offset ;
178
178
}
179
179
180
+ static inline const struct ebt_entry_target *
181
+ ebt_get_target_c (const struct ebt_entry * e )
182
+ {
183
+ return ebt_get_target ((struct ebt_entry * )e );
184
+ }
185
+
180
186
/* Do some firewalling */
181
187
unsigned int ebt_do_table (struct sk_buff * skb ,
182
188
const struct nf_hook_state * state ,
@@ -230,8 +236,7 @@ unsigned int ebt_do_table(struct sk_buff *skb,
230
236
*/
231
237
EBT_WATCHER_ITERATE (point , ebt_do_watcher , skb , & acpar );
232
238
233
- t = (struct ebt_entry_target * )
234
- (((char * )point ) + point -> target_offset );
239
+ t = ebt_get_target_c (point );
235
240
/* standard target */
236
241
if (!t -> u .target -> target )
237
242
verdict = ((struct ebt_standard_target * )t )-> verdict ;
@@ -637,7 +642,7 @@ ebt_cleanup_entry(struct ebt_entry *e, struct net *net, unsigned int *cnt)
637
642
return 1 ;
638
643
EBT_WATCHER_ITERATE (e , ebt_cleanup_watcher , net , NULL );
639
644
EBT_MATCH_ITERATE (e , ebt_cleanup_match , net , NULL );
640
- t = ( struct ebt_entry_target * )((( char * ) e ) + e -> target_offset );
645
+ t = ebt_get_target ( e );
641
646
642
647
par .net = net ;
643
648
par .target = t -> u .target ;
@@ -716,7 +721,7 @@ ebt_check_entry(struct ebt_entry *e, struct net *net,
716
721
ret = EBT_WATCHER_ITERATE (e , ebt_check_watcher , & tgpar , & j );
717
722
if (ret != 0 )
718
723
goto cleanup_watchers ;
719
- t = ( struct ebt_entry_target * )((( char * ) e ) + e -> target_offset );
724
+ t = ebt_get_target ( e );
720
725
gap = e -> next_offset - e -> target_offset ;
721
726
722
727
target = xt_request_find_target (NFPROTO_BRIDGE , t -> u .name , 0 );
@@ -789,8 +794,7 @@ static int check_chainloops(const struct ebt_entries *chain, struct ebt_cl_stack
789
794
if (pos == nentries )
790
795
continue ;
791
796
}
792
- t = (struct ebt_entry_target * )
793
- (((char * )e ) + e -> target_offset );
797
+ t = ebt_get_target_c (e );
794
798
if (strcmp (t -> u .name , EBT_STANDARD_TARGET ))
795
799
goto letscontinue ;
796
800
if (e -> target_offset + sizeof (struct ebt_standard_target ) >
@@ -1396,7 +1400,7 @@ static inline int ebt_entry_to_user(struct ebt_entry *e, const char *base,
1396
1400
return - EFAULT ;
1397
1401
1398
1402
hlp = ubase + (((char * )e + e -> target_offset ) - base );
1399
- t = ( struct ebt_entry_target * )((( char * ) e ) + e -> target_offset );
1403
+ t = ebt_get_target_c ( e );
1400
1404
1401
1405
ret = EBT_MATCH_ITERATE (e , ebt_match_to_user , base , ubase );
1402
1406
if (ret != 0 )
@@ -1737,7 +1741,7 @@ static int compat_copy_entry_to_user(struct ebt_entry *e, void __user **dstptr,
1737
1741
return ret ;
1738
1742
target_offset = e -> target_offset - (origsize - * size );
1739
1743
1740
- t = ( struct ebt_entry_target * ) (( char * ) e + e -> target_offset );
1744
+ t = ebt_get_target ( e );
1741
1745
1742
1746
ret = compat_target_to_user (t , dstptr , size );
1743
1747
if (ret )
@@ -1785,7 +1789,7 @@ static int compat_calc_entry(const struct ebt_entry *e,
1785
1789
EBT_MATCH_ITERATE (e , compat_calc_match , & off );
1786
1790
EBT_WATCHER_ITERATE (e , compat_calc_watcher , & off );
1787
1791
1788
- t = ( const struct ebt_entry_target * ) (( char * ) e + e -> target_offset );
1792
+ t = ebt_get_target_c ( e );
1789
1793
1790
1794
off += xt_compat_target_offset (t -> u .target );
1791
1795
off += ebt_compat_entry_padsize ();
0 commit comments