On Sat, Oct 22, 2016 at 11:11:59PM +1300, Richard Procter wrote:
> So it may be enough to #define PF_MAXHDR_SIZE 28 in pfvar.h (== 
> sizeof(union pf_headers)), then verify it by a compile-time assert in 
> pf.c.

I think this is better than what we have now and better than a
additonal header file.

OK bluhm@

> Index: net/pf.c
> ===================================================================
> --- net.orig/pf.c
> +++ net/pf.c
> @@ -128,7 +128,7 @@ struct pf_anchor_stackframe {
>  
>  /*
>   * Cannot fold into pf_pdesc directly, unknown storage size outside pf.c.
> - * Keep in sync with union pf_headers in pflog_bpfcopy() in if_pflog.c.
> + * Cannot be put into pfvar.h as that is included in too many places.
>   */
>  union pf_headers {
>       struct tcphdr           tcp;
> @@ -140,7 +140,7 @@ union pf_headers {
>       struct nd_neighbor_solicit nd_ns;
>  #endif /* INET6 */
>  };
> -
> +CTASSERT(PF_MAXHDR_SIZE >= sizeof(union pf_headers));
>  
>  struct pool           pf_src_tree_pl, pf_rule_pl, pf_queue_pl;
>  struct pool           pf_state_pl, pf_state_key_pl, pf_state_item_pl;
> @@ -6613,7 +6613,7 @@ pf_test(sa_family_t af, int fwdir, struc
>       struct pf_state         *s = NULL;
>       struct pf_ruleset       *ruleset = NULL;
>       struct pf_pdesc          pd;
> -     union pf_headers         pdhdrs;
> +     u_int8_t                 pdhdrs[PF_MAXHDR_SIZE];
>       int                      dir = (fwdir == PF_FWD) ? PF_OUT : fwdir;
>       u_int32_t                qid, pqid = 0;
>  
> Index: net/pfvar.h
> ===================================================================
> --- net.orig/pfvar.h
> +++ net/pfvar.h
> @@ -1156,6 +1156,8 @@ enum pfi_kif_refs {
>  #define PFI_IFLAG_SKIP               0x0100  /* skip filtering on interface 
> */
>  #define PFI_IFLAG_ANY                0x0200  /* match any non-loopback 
> interface */
>  
> +#define PF_MAXHDR_SIZE               28      /* max pf pf_pdesc header 
> buffer */
> +
>  struct pf_pdesc {
>       struct {
>               int      done;
> Index: net/if_pflog.c
> ===================================================================
> --- net.orig/if_pflog.c
> +++ net/if_pflog.c
> @@ -297,16 +297,7 @@ pflog_bpfcopy(const void *src_arg, void
>       u_int                    count;
>       u_char                  *dst, *mdst;
>       int                      afto, hlen, mlen, off;
> -     union pf_headers {
> -             struct tcphdr           tcp;
> -             struct udphdr           udp;
> -             struct icmp             icmp;
> -#ifdef INET6
> -             struct icmp6_hdr        icmp6;
> -             struct mld_hdr          mld;
> -             struct nd_neighbor_solicit nd_ns;
> -#endif /* INET6 */
> -     } pdhdrs;
> +     u_int8_t                 pdhdrs[PF_MAXHDR_SIZE];
>  
>       struct pf_pdesc          pd;
>       struct pf_addr           osaddr, odaddr;

Reply via email to