Re: [PATCH nft 7/9] expression: cleanup expr_ops_by_type() and handle u32 input

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Sep 20, 2023 at 09:28:29PM +0200, Thomas Haller wrote:
> On Wed, 2023-09-20 at 20:13 +0200, Pablo Neira Ayuso wrote:
> > On Wed, Sep 20, 2023 at 04:26:08PM +0200, Thomas Haller wrote:
> > > 
> > > -const struct expr_ops *expr_ops_by_type(enum expr_types value)
> > > +const struct expr_ops *expr_ops_by_type_u32(uint32_t value)
> > >  {
> > > -       /* value might come from unreliable source, such as "udata"
> > > -        * annotation of set keys.  Avoid BUG() assertion.
> > > -        */
> > > -       if (value == EXPR_INVALID || value > EXPR_MAX)
> > > +       if (value > (uint32_t) EXPR_MAX)
> > 
> > I think this still allows a third party to set EXPR_INVALID in the
> > netlink userdata attribute, right?
> > 
> > >                 return NULL;
> > > -
> > >         return __expr_ops_by_type(value);
> > >  }
> 
> Yes, it still allows that. It's handled by the following
> __expr_ops_by_type(), which returns NULL for invalid types (like
> EXPR_INVALID).

Oh indeed.

> The check "if (value > (uint32_t) EXPR_MAX)" is only here to ensure
> that nothing is lost while casting the uint32_t "value" to the enum
> expr_types.

Is this cast really required? This is to handle the hypothetical case
where EXPR_MAX ever gets a negative value?



[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux