diff mbox series

[iproute2] devlink: Ignore unknown attributes

Message ID 1516195680-33683-1-git-send-email-arkadis@mellanox.com
State Accepted, archived
Delegated to: stephen hemminger
Headers show
Series [iproute2] devlink: Ignore unknown attributes | expand

Commit Message

Arkadi Sharshevsky Jan. 17, 2018, 1:28 p.m. UTC
In case of extending the UAPI old packages would break.

Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
---
 devlink/devlink.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Jiri Pirko Jan. 17, 2018, 1:37 p.m. UTC | #1
Wed, Jan 17, 2018 at 02:28:00PM CET, arkadis@mellanox.com wrote:
>In case of extending the UAPI old packages would break.
>
>Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>

Acked-by: Jiri Pirko <jiri@mellanox.com>
Stephen Hemminger Jan. 19, 2018, 12:32 a.m. UTC | #2
On Wed, 17 Jan 2018 15:28:00 +0200
Arkadi Sharshevsky <arkadis@mellanox.com> wrote:

> In case of extending the UAPI old packages would break.
> 
> Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>

Looks like good future proofing.
Applied.
David Ahern Jan. 19, 2018, 4:42 a.m. UTC | #3
On 1/17/18 5:28 AM, Arkadi Sharshevsky wrote:
> In case of extending the UAPI old packages would break.
> 
> Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
> ---
>  devlink/devlink.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/devlink/devlink.c b/devlink/devlink.c
> index 39cda06..c9d1838 100644
> --- a/devlink/devlink.c
> +++ b/devlink/devlink.c
> @@ -343,7 +343,7 @@ static int attr_cb(const struct nlattr *attr, void *data)
>  	int type;
>  
>  	if (mnl_attr_type_valid(attr, DEVLINK_ATTR_MAX) < 0)
> -		return MNL_CB_ERROR;
> +		return MNL_CB_OK;
>  
>  	type = mnl_attr_get_type(attr);
>  	if (mnl_attr_validate(attr, devlink_policy[type]) < 0)
> 

What's the point of calling mnl_attr_type_valid if you disregard a
failure? you might as well not call mnl_attr_type_valid at all.
Stephen Hemminger Jan. 19, 2018, 10:02 p.m. UTC | #4
On Thu, 18 Jan 2018 20:42:44 -0800
David Ahern <dsahern@gmail.com> wrote:

> On 1/17/18 5:28 AM, Arkadi Sharshevsky wrote:
> > In case of extending the UAPI old packages would break.
> > 
> > Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
> > ---
> >  devlink/devlink.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/devlink/devlink.c b/devlink/devlink.c
> > index 39cda06..c9d1838 100644
> > --- a/devlink/devlink.c
> > +++ b/devlink/devlink.c
> > @@ -343,7 +343,7 @@ static int attr_cb(const struct nlattr *attr, void *data)
> >  	int type;
> >  
> >  	if (mnl_attr_type_valid(attr, DEVLINK_ATTR_MAX) < 0)
> > -		return MNL_CB_ERROR;
> > +		return MNL_CB_OK;
> >  
> >  	type = mnl_attr_get_type(attr);
> >  	if (mnl_attr_validate(attr, devlink_policy[type]) < 0)
> >   
> 
> What's the point of calling mnl_attr_type_valid if you disregard a
> failure? you might as well not call mnl_attr_type_valid at all.

The way mnl handles attributes, you have to have a callback and it is up
to the callback to copy the values it wants.  The idea is that old code
running against a newer kernel will have a smaller array of attributes
it wants, and only copy those.
David Ahern Jan. 19, 2018, 10:27 p.m. UTC | #5
On 1/19/18 2:02 PM, Stephen Hemminger wrote:
> On Thu, 18 Jan 2018 20:42:44 -0800
> David Ahern <dsahern@gmail.com> wrote:
> 
>> On 1/17/18 5:28 AM, Arkadi Sharshevsky wrote:
>>> In case of extending the UAPI old packages would break.
>>>
>>> Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
>>> ---
>>>  devlink/devlink.c | 2 +-
>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/devlink/devlink.c b/devlink/devlink.c
>>> index 39cda06..c9d1838 100644
>>> --- a/devlink/devlink.c
>>> +++ b/devlink/devlink.c
>>> @@ -343,7 +343,7 @@ static int attr_cb(const struct nlattr *attr, void *data)
>>>  	int type;
>>>  
>>>  	if (mnl_attr_type_valid(attr, DEVLINK_ATTR_MAX) < 0)
>>> -		return MNL_CB_ERROR;
>>> +		return MNL_CB_OK;
>>>  
>>>  	type = mnl_attr_get_type(attr);
>>>  	if (mnl_attr_validate(attr, devlink_policy[type]) < 0)
>>>   
>>
>> What's the point of calling mnl_attr_type_valid if you disregard a
>> failure? you might as well not call mnl_attr_type_valid at all.
> 
> The way mnl handles attributes, you have to have a callback and it is up
> to the callback to copy the values it wants.  The idea is that old code
> running against a newer kernel will have a smaller array of attributes
> it wants, and only copy those.
> 

mnl_attr_type_valid calls mnl_attr_get_type which does attr->nla_type &
NLA_TYPE_MASK. Since you are no longer acknowledging the return code of
mnl_attr_type_valid, you don't care about its checks so you might as
well not call it. I don't see anything in libmnl that checks that
mnl_attr_type_valid is invoked on an attr, so hence my question -- given
the change above why call it all?
Stephen Hemminger Jan. 19, 2018, 11:40 p.m. UTC | #6
On Fri, 19 Jan 2018 14:27:06 -0800
David Ahern <dsahern@gmail.com> wrote:

> On 1/19/18 2:02 PM, Stephen Hemminger wrote:
> > On Thu, 18 Jan 2018 20:42:44 -0800
> > David Ahern <dsahern@gmail.com> wrote:
> >   
> >> On 1/17/18 5:28 AM, Arkadi Sharshevsky wrote:  
> >>> In case of extending the UAPI old packages would break.
> >>>
> >>> Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
> >>> ---
> >>>  devlink/devlink.c | 2 +-
> >>>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>>
> >>> diff --git a/devlink/devlink.c b/devlink/devlink.c
> >>> index 39cda06..c9d1838 100644
> >>> --- a/devlink/devlink.c
> >>> +++ b/devlink/devlink.c
> >>> @@ -343,7 +343,7 @@ static int attr_cb(const struct nlattr *attr, void *data)
> >>>  	int type;
> >>>  
> >>>  	if (mnl_attr_type_valid(attr, DEVLINK_ATTR_MAX) < 0)
> >>> -		return MNL_CB_ERROR;
> >>> +		return MNL_CB_OK;
> >>>  
> >>>  	type = mnl_attr_get_type(attr);
> >>>  	if (mnl_attr_validate(attr, devlink_policy[type]) < 0)
> >>>     
> >>
> >> What's the point of calling mnl_attr_type_valid if you disregard a
> >> failure? you might as well not call mnl_attr_type_valid at all.  
> > 
> > The way mnl handles attributes, you have to have a callback and it is up
> > to the callback to copy the values it wants.  The idea is that old code
> > running against a newer kernel will have a smaller array of attributes
> > it wants, and only copy those.
> >   
> 
> mnl_attr_type_valid calls mnl_attr_get_type which does attr->nla_type &
> NLA_TYPE_MASK. Since you are no longer acknowledging the return code of
> mnl_attr_type_valid, you don't care about its checks so you might as
> well not call it. I don't see anything in libmnl that checks that
> mnl_attr_type_valid is invoked on an attr, so hence my question -- given
> the change above why call it all?

 The part that matters is:

static int attr_cb(const struct nlattr *attr, void *data)
{
	const struct nlattr **tb = data;
	int type;

	if (mnl_attr_type_valid(attr, DEVLINK_ATTR_MAX) < 0)         << makes sure that type < DEVLINK_ATTR_MAX
		return MNL_CB_OK;

	type = mnl_attr_get_type(attr);
	if (mnl_attr_validate(attr, devlink_policy[type]) < 0)        << this part doesn't matter really
		return MNL_CB_ERROR;

	tb[type] = attr;					<< necessary so that tb[] is filled in.
	return MNL_CB_OK;
}
David Ahern Jan. 20, 2018, midnight UTC | #7
On 1/19/18 3:40 PM, Stephen Hemminger wrote:
>> mnl_attr_type_valid calls mnl_attr_get_type which does attr->nla_type &
>> NLA_TYPE_MASK. Since you are no longer acknowledging the return code of
>> mnl_attr_type_valid, you don't care about its checks so you might as
>> well not call it. I don't see anything in libmnl that checks that
>> mnl_attr_type_valid is invoked on an attr, so hence my question -- given
>> the change above why call it all?

ok. I see the error in my thinking.

>  The part that matters is:
> 
> static int attr_cb(const struct nlattr *attr, void *data)
> {
> 	const struct nlattr **tb = data;
> 	int type;
> 
> 	if (mnl_attr_type_valid(attr, DEVLINK_ATTR_MAX) < 0)         << makes sure that type < DEVLINK_ATTR_MAX
> 		return MNL_CB_OK;
> 
> 	type = mnl_attr_get_type(attr);
> 	if (mnl_attr_validate(attr, devlink_policy[type]) < 0)        << this part doesn't matter really
> 		return MNL_CB_ERROR;
> 
> 	tb[type] = attr;					<< necessary so that tb[] is filled in.
> 	return MNL_CB_OK;
> }
diff mbox series

Patch

diff --git a/devlink/devlink.c b/devlink/devlink.c
index 39cda06..c9d1838 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -343,7 +343,7 @@  static int attr_cb(const struct nlattr *attr, void *data)
 	int type;
 
 	if (mnl_attr_type_valid(attr, DEVLINK_ATTR_MAX) < 0)
-		return MNL_CB_ERROR;
+		return MNL_CB_OK;
 
 	type = mnl_attr_get_type(attr);
 	if (mnl_attr_validate(attr, devlink_policy[type]) < 0)